Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Filter by Categories
About Article
Analyze Data
Archive
Best Practices
Better Outputs
Blog
Code Optimization
Code Quality
Command Line
Course
Daily tips
Dashboard
Data Analysis & Manipulation
Data Engineer
Data Visualization
DataFrame
Delta Lake
DevOps
DuckDB
Environment Management
Feature Engineer
Git
Jupyter Notebook
LLM
LLM Tools
Machine Learning
Machine Learning & AI
Machine Learning Tools
Manage Data
MLOps
Natural Language Processing
Newsletter Archive
NumPy
Pandas
Polars
PySpark
Python Helpers
Python Tips
Python Utilities
Scrape Data
SQL
Testing
Time Series
Tools
Visualization
Visualization & Reporting
Workflow & Automation
Workflow Automation

Newsletter Archive

Automated newsletter archive from Klaviyo campaigns

Newsletter #291: Docling: Turn DOCX Reviewer Feedback into Structured Data

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Narwhals: One Decorator for pandas, Polars, and DuckDB

Problem
Writing a DataFrame function that supports multiple libraries usually means maintaining separate versions of the same logic for each one.
If changes are needed, they need to be applied to every version.
Solution
With Narwhals‘ @narwhalify decorator, you write the logic once using a unified API.
The function then works with whatever DataFrame type is passed in and returns the same type, reducing friction when switching tools.
How is this different from Ibis? Ibis is built for data scientists switching between SQL backends. Narwhals is built for library authors who need their code to work with any DataFrame type.

📖 View Full Article

🧪 Run code

Docling: Turn DOCX Reviewer Feedback into Structured Data

Problem
Pulling comments from Word files turns informal feedback into data you can analyze, manage, and act on in code.
Traditionally, this requires parsing raw XML and manually mapping each comment back to its referenced text.
Solution
Docling v2.71.0 simplifies this process. Converted documents now attach a comments field to every text item, making reviewer annotations accessible without manual XML handling.
This opens up workflows that were previously too tedious to automate:

Flag unresolved comments before merging document versions
Build dashboards tracking reviewer feedback across teams
Feed comment data into LLMs for sentiment analysis or summarization

📖 View Full Article

📚 Latest Deep Dives

Portable DataFrames in Python: When to Use Ibis, Narwhals, or Fugue
– Write your DataFrame logic once and run it on any backend. Compare Ibis, Narwhals, and Fugue to find the right portability strategy for your Python workflow.

☕️ Weekly Finds

pdfGPT
[LLM]
– Chat with the contents of your PDF files using GPT capabilities and semantic search with sentence embeddings

SandDance
[Data Viz]
– Microsoft Research data visualization tool that maps every data row to a visual mark for interactive exploration

trafilatura
[Web Scraping]
– Python package and CLI for web crawling, scraping, and text extraction with output as CSV, JSON, HTML, or XML

Looking for a specific tool? Explore 70+ Python tools →

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #291: Docling: Turn DOCX Reviewer Feedback into Structured Data Read More »

Newsletter #290: Quarkdown: Build LaTeX-Quality Docs with Just Markdown

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Quarkdown: Build LaTeX-Quality Docs with Just Markdown

Problem
LaTeX produces beautiful academic papers, but its verbose syntax and nested environments make even simple layouts painful to write.
Solution
Quarkdown generates the same professional paged output using clean Markdown syntax you already know.
Key features:

Write once, export as paged documents, presentation slides, or websites
Define reusable functions with conditionals and loops inside your documents
Embed Mermaid diagrams and charts without external tools
Live preview in VS Code as you type

Ibis: One Python API for 22+ Database Backends

Problem
Running queries across multiple databases often means rewriting the same logic for each backend’s SQL dialect. A query that works in DuckDB may require syntax changes for PostgreSQL, and another rewrite for BigQuery.
Solution
Ibis removes that friction by compiling Python expressions into each backend’s native SQL. Swap the connection, and the same code runs across 22+ databases.
Key features:

Write once, run on DuckDB, PostgreSQL, BigQuery, Snowflake, and 18+ more
Lazy execution that builds and optimizes the query plan before sending it to the database
Intuitive chaining syntax similar to Polars

📖 View Full Article

📚 Latest Deep Dives

Portable DataFrames in Python: When to Use Ibis, Narwhals, or Fugue
– Write your DataFrame logic once and run it on any backend. Compare Ibis, Narwhals, and Fugue to find the right portability strategy for your Python workflow.

☕️ Weekly Finds

graphiti
[LLM]
– Build real-time, temporally-aware knowledge graphs for AI agents with automatic entity and relationship extraction

doris
[SQL]
– High-performance MPP analytics database with MySQL compatibility that handles real-time ingestion and sub-second queries at scale

smallpond
[Data Processing]
– Lightweight distributed data processing framework by DeepSeek that scales DuckDB to PB-scale datasets using Ray

Looking for a specific tool? Explore 70+ Python tools →

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #290: Quarkdown: Build LaTeX-Quality Docs with Just Markdown Read More »

Newsletter #289: Python 3.14: Type-Safe String Interpolation with t-strings

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Loguru: From Print Statements to Production Logging in One Line

Problem
Data scientists often rely on print statements to monitor data processing pipelines during development.
But print provides no timestamps or severity levels.
Python’s built-in logging fixes that, but demands boilerplate: handlers, formatters, and log-level configuration just to get started.
Solution
Loguru replaces both with a single import: one line gives you structured, colored logging with no setup required.
Key features:

Modern {} formatting that matches Python f-string syntax
One-line file logging with automatic rotation and retention
Readable tracebacks that show variable values at each stack level
Custom sinks to route logs to Slack, email, or databases

📖 View Full Article

🧪 Run code

Python 3.14: Type-Safe String Interpolation with t-strings

Problem
Building SQL queries with f-strings directly embeds user input into the query string, allowing attackers to inject malicious SQL commands.
Parameterized queries are secure but require you to maintain query templates and value lists separately.
Solution
Python 3.14 introduces template string literals (t-strings). Instead of returning strings, they return Template objects that safely expose interpolated values.
This lets you validate and sanitize interpolated values before building the final query.

🧪 Run code

☕️ Weekly Finds

mistune
[Python Utilities]
– Fast Python Markdown parser with custom renderers and plugins that converts Markdown to HTML with minimal overhead

pyparsing
[Python Utilities]
– Python library for creating readable PEG parsers that handles whitespace, quoted strings, and comments without regex complexity

fastlite
[SQL]
– Lightweight SQLite wrapper by Jeremy Howard that adds Pythonic syntax, dataclass support, and diagram visualization for interactive use

Looking for a specific tool? Explore 70+ Python tools →

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #289: Python 3.14: Type-Safe String Interpolation with t-strings Read More »

Newsletter #288: MLflow: Track Every LLM API Call with 1 Line of Code

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

MLflow: Track Every LLM API Call with 1 Line of Code

Problem
Most teams building LLM apps don’t set up tracking because they see API calls as simple request-response operations.
But every API call costs money, and without token-level visibility, you can’t tell where your budget is going until it’s already spent.
Solution
MLflow‘s autolog traces every OpenAI API call with just one line of code, so you always know what was sent, what came back, and how many tokens it used.
Key capabilities:

Track token usage per call to identify which requests consume the most
View full prompt and response content for every call
Measure latency per call to find which requests are slowing down your app
Works with OpenAI, Anthropic, LangChain, LlamaIndex, and DSPy

Rembg: Remove Image Backgrounds in 2 Lines of Python

Problem
Removing backgrounds from images typically requires Photoshop, online tools, or AI assistants like ChatGPT.
But these options come with subscription costs, upload limits, or privacy concerns with your images on external servers.
Solution
Rembg uses AI models to remove backgrounds locally with just 2 lines of Python.
It’s also open source and compatible with common Python imaging libraries.

🧪 Run code

☕️ Weekly Finds

awesome-claude-skills
[AI Tools]
– Curated list of Claude Skills, resources, and tools for customizing Claude AI workflows with community-contributed templates and integrations

zvec
[Vector Database]
– In-process vector database built on Alibaba’s Proxima engine that searches billions of vectors in milliseconds with zero server setup

langflow
[AI Agents]
– Visual platform for building and deploying AI-powered agents and workflows with drag-and-drop interface, multi-agent orchestration, and MCP server support

Looking for a specific tool? Explore 70+ Python tools →

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #288: MLflow: Track Every LLM API Call with 1 Line of Code Read More »

Newsletter #287: Granite Vision: Convert Chart Images to CSV with Transformers

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Granite Vision: Convert Chart Images to CSV with Transformers

Problem
Chart data often contains valuable insights, but extracting numbers from these charts manually is time-consuming and tedious.
Solution
IBM’s Granite Vision 3.3 2B converts chart images directly into structured CSV data using Hugging Face Transformers.
Here’s how to extract structured data from any chart image in three steps.
1. Load the Model
Load the chart-to-CSV model from HuggingFace using the transformers library.

<span class="kn">from</span> <span class="nn">transformers</span> <span class="kn">import</span> <span class="n">AutoProcessor</span><span class="p">,</span> <span class="n">AutoModelForVision2Seq</span>
<span class="kn">from</span> <span class="nn">huggingface_hub</span> <span class="kn">import</span> <span class="n">hf_hub_download</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="kn">import</span> <span class="nn">torch</span>

<span class="n">model_path</span> <span class="o">=</span> <span class="s2">"ibm-granite/granite-vision-3.3-2b-chart2csv-preview"</span>
<span class="n">device</span> <span class="o">=</span> <span class="s2">"cuda"</span> <span class="k">if</span> <span class="n">torch</span><span class="o">.</span><span class="n">cuda</span><span class="o">.</span><span class="n">is_available</span><span class="p">()</span> <span class="k">else</span> <span class="s2">"cpu"</span>

<span class="n">processor</span> <span class="o">=</span> <span class="n">AutoProcessor</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span><span class="n">model_path</span><span class="p">)</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AutoModelForVision2Seq</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span><span class="n">model_path</span><span class="p">)</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>

2. Prepare Your Chart
Define the chart image and task instruction in a conversation format.

<span class="c1"># Load a chart image</span>
<span class="n">img_path</span> <span class="o">=</span> <span class="n">hf_hub_download</span><span class="p">(</span>
<span class="n">repo_id</span><span class="o">=</span><span class="n">model_path</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="s2">"example.jpg"</span>
<span class="p">)</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">img_path</span><span class="p">)</span>

<span class="c1"># Use the chart-to-CSV prompt</span>
<span class="n">conversation</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="s2">"role"</span><span class="p">:</span> <span class="s2">"user"</span><span class="p">,</span> <span class="s2">"content"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="s2">"type"</span><span class="p">:</span> <span class="s2">"image"</span><span class="p">,</span> <span class="s2">"url"</span><span class="p">:</span> <span class="n">img_path</span><span class="p">},</span>
<span class="p">{</span><span class="s2">"type"</span><span class="p">:</span> <span class="s2">"text"</span><span class="p">,</span> <span class="s2">"text"</span><span class="p">:</span> <span class="s2">"Parse the chart in the image to CSV format."</span><span class="p">}</span>
<span class="p">]}</span>
<span class="p">]</span>

3. Generate CSV Output
Apply the chat template, generate tokens, and decode back to CSV text.

<span class="n">inputs</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">apply_chat_template</span><span class="p">(</span>
<span class="n">conversation</span><span class="p">,</span>
<span class="n">add_generation_prompt</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">return_dict</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">return_tensors</span><span class="o">=</span><span class="s2">"pt"</span>
<span class="p">)</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>

<span class="n">output</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="o">**</span><span class="n">inputs</span><span class="p">,</span> <span class="n">max_new_tokens</span><span class="o">=</span><span class="mi">500</span><span class="p">)</span>
<span class="n">csv_output</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">output</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">skip_special_tokens</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">csv_output</span><span class="p">)</span>

Output:

State,2017,2018
NJ,4.6,4.1
CT,4.7,4.1
DE,4.5,3.8
NY,4.7,4.1
PA,4.9,4.3

 

PydanticAI: Control OpenAI Data Retention with openai_store

Problem
By default, OpenAI may retain your API request data for internal review and model improvement. For healthcare, finance, and legal applications, this default creates compliance risks you can’t afford.
Solution
PydanticAI v1.52.0 introduces the openai_store setting to explicitly disable data retention in one line.
 

☕️ Weekly Finds
msgvault [Data Management] – Archive a lifetime of email and chat locally with full Gmail backup, search, DuckDB-powered analytics, an interactive TUI, and an MCP server for querying messages with AI
monty [Developer Tools] – Minimal, secure Python interpreter written in Rust designed for use by AI agents, providing sandboxed code execution with safety guarantees
baserow [No-Code Platform] – Open-source no-code platform for building databases, applications, automations, and AI agents with enterprise-grade security and self-hosted deployment options
Looking for a specific tool? Explore 70+ Python tools →

Stay Current with CodeCut
Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

 
Subscribe

Newsletter #287: Granite Vision: Convert Chart Images to CSV with Transformers Read More »

Newsletter #286: Write Readable Multi-Condition Logic with Polars when-then-otherwise

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Write Readable Multi-Condition Logic with Polars when-then-otherwise

Problem
pandas requires np.where() for simple conditions which breaks method chaining and becomes nested and hard to read for multiple conditions.
The apply() alternative is slow and also breaks the DataFrame workflow.
Solution
Polars provides when().then().otherwise() chains that integrate naturally with method chaining.
With pandas, nested np.where() calls stack up for each additional condition, creating deeply nested expressions. Polars replaces this with readable chains where each condition appears sequentially.
Key benefits:

Natural flow with method chaining
Each condition stands on its own line
No nested function calls
Maintains data transformation workflow

The pattern scales cleanly from two conditions to ten without sacrificing readability.

📖 View Full Article

🧪 Run code

Extract Text from Any Document Format with Docling

Problem
Have you ever needed to pull text from PDFs, Word files, slide decks, or images for a project? Writing a different parser for each format is slow and error-prone.
Solution
Docling‘s DocumentConverter takes care of that by detecting the file type and applying the right parsing method for PDF, DOCX, PPTX, HTML, and images.
Other features of Docling:

AI-powered image descriptions for searchable diagrams
Export to pandas DataFrames, JSON, or Markdown
Structure-preserving output optimized for RAG pipelines
Built-in chunking strategies for vector databases
Parallel processing handles large document batches efficiently

📖 View Full Article

🧪 Run code

☕️ Weekly Finds

lm-evaluation-harness
[Machine Learning]
– Unified framework for testing and evaluating generative language models across a wide range of benchmarks and tasks with support for local models and custom metrics

PyMC
[Probabilistic Programming]
– Probabilistic programming library for Python that allows users to build Bayesian models with a simple Python API and fit them using state-of-the-art methods

Quarkdown
[Documentation]
– Modern Markdown typesetting system with powerful extensions for creating books, articles, and presentations. Supports function calls, custom functions, and outputs HTML, PDF, and slides

Looking for a specific tool? Explore 70+ Python tools →

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #286: Write Readable Multi-Condition Logic with Polars when-then-otherwise Read More »

Newsletter #285: Narwhals: One Function for pandas, Polars, and DuckDB

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Narwhals: One Function for pandas, Polars, and DuckDB

Problem
Teams today use multiple DataFrame libraries side by side. Each backend has its own syntax, so your utility functions end up full of if/elif chains checking types.
This makes even small logic changes expensive, since every backend implementation must be updated.
Solution
Narwhals removes this complexity by providing a unified DataFrame API.
How it works:

Wrap any DataFrame with nw.from_native() (pandas, Polars, DuckDB, PySpark, PyArrow)
Write transformations once using Polars-style operations
Convert back to the original type with nw.to_native()
Zero extra dependencies. Each backend keeps its native performance

📖 View Full Article

🧪 Run code

⭐ View GitHub

uv: Switch Python Versions Without Rebuilding Environments

Problem
Switching Python versions typically requires recreating virtual environments and reinstalling all dependencies from scratch.
This workflow wastes time and can introduce version conflicts when dependencies need to be resolved again.
Solution
UV allows seamless Python version upgrades with uv python pin while preserving existing dependencies.
The process is simple:

Pin the version with uv python pin 3.x
Sync dependencies with uv sync
All cached packages are preserved automatically

📖 View Full Article

⭐ View GitHub

☕️ Weekly Finds

Airbyte
[Data Engineering]
– Data integration platform with 600+ connectors for ETL/ELT pipelines from APIs, databases, and files to warehouses and lakes

act
[DevOps]
– Run GitHub Actions locally for fast feedback without commit/push cycles, using Docker containers

Dash
[AI Agents]
– Self-learning text-to-SQL agent that grounds answers in six layers of context and improves automatically from failures

Looking for a specific tool? Explore 70+ Python tools →

📚 Latest Deep Dives

5 Python Tools for Structured LLM Outputs: A Practical Comparison
– Compare 5 Python tools for structured LLM outputs. Learn when to use Instructor, PydanticAI, LangChain, Outlines, or Guidance for JSON extraction.

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #285: Narwhals: One Function for pandas, Polars, and DuckDB Read More »

Newsletter #284: Build AI Agent Memory with Graphiti Knowledge Graphs

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

Build AI Agent Memory with Graphiti Knowledge Graphs

Problem
Traditional RAG pipelines rely on batch processing and static document summaries. When data changes, you re-embed, re-index, and wait.
That delay means your agent is always working with stale information, unable to track how facts evolve over time.
Solution
Graphiti is an open-source Python framework that builds knowledge graphs with real-time, incremental updates. This lets you add new information at any time without reprocessing your entire dataset.
Key features:

Track when facts happened and when they were recorded, so you always know what’s current
Search by meaning, keywords, or relationships in one query
Get the most relevant results for a specific person, company, or entity
Works with Neo4j, FalkorDB, and Kuzu as the graph backend

⭐ View GitHub

Polars sink_csv: Stream Million-Row Exports Without Memory Spikes

Problem
Writing large DataFrames to CSV is memory-intensive because the entire dataset is serialized in memory before being written to disk.
Solution
Polars’ streaming CSV sink avoids this by writing data in chunks rather than all at once.
Key benefits:

Eliminate out-of-memory errors on large exports
Write multi-million row DataFrames with minimal RAM
Support for cloud storage destinations (S3, GCS, Azure)

Switch from write_csv to sink_csv on a lazy frame to enable streaming.

📖 View Full Article

⭐ View GitHub

☕️ Weekly Finds

Flowise
[AI Agents]
– Low-code platform for building AI agents and workflows visually with drag-and-drop components

cleanlab
[Machine Learning]
– Data-centric AI package that automatically detects data quality issues, label errors, and outliers in ML datasets

OpenBB
[Finance]
– Open-source financial data platform for analysts, quants, and AI agents with dozens of data integrations

Looking for a specific tool? Explore 70+ Python tools →

📚 Latest Deep Dives

5 Python Tools for Structured LLM Outputs: A Practical Comparison
– Compare 5 Python tools for structured LLM outputs. Learn when to use Instructor, PydanticAI, LangChain, Outlines, or Guidance for JSON extraction.

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #284: Build AI Agent Memory with Graphiti Knowledge Graphs Read More »

Newsletter #283: MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic

Grab your coffee. Here are this week’s highlights.

📅 Today’s Picks

MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic

Problem
Ensuring consistent LLM quality means checking correctness, relevance, and guideline adherence.
But writing custom evaluation logic for each criterion is tedious.
Solution
MLflow provides pre-built scorers for common evaluation patterns with simple decorator syntax for custom metrics.
Key capabilities:

Built-in scorers for correctness and guideline compliance
Simple @mlflow.scorer decorator for custom metrics
Standardized evaluation patterns across projects
Visual summary of all assessment results in MLflow UI

🧪 Run code

⭐ View GitHub

🔄 Worth Revisiting

Swap AI Prompts Instantly with MLflow Prompt Registry

Problem
Finding the right prompt often takes experimentation: tweaking wording, adjusting tone, testing different instructions.
But with prompts hardcoded in your codebase, each test requires a code change and redeployment.
Solution
MLflow Prompt Registry solves this with aliases. Your code references an alias like “production” instead of a version number, so you can swap versions without changing it.
Here’s how it works:

Every prompt edit creates a new immutable version with a commit message
Register prompts once, then assign aliases to specific versions
Deploy to different environments by creating aliases like “staging” and “production”
Track full version history with metadata and tags for each prompt

⭐ View GitHub

📢 ANNOUNCEMENTS

Introducing CodeCut Premium
I put a lot of effort into making every CodeCut blog clear, practical, and example-driven. Still, there’s a gap between reading code and actually writing it yourself.
CodeCut Premium bridges that gap with interactive courses that let you:

Execute code directly in your browser
Skip installation and environment setup
Test your understanding with built-in quizzes
Learn faster than sitting through long video courses

I plan to add new courses regularly, with a focus on quality and depth. The catalog is still growing, and Founding Members get early access plus exclusive perks as it expands.
Founding Members receive lifetime $12/month pricing, full access to all courses, and early influence on future content.
Founding pricing ends March 31, 2026.

🔗 Learn More

☕️ Weekly Finds

zipline
[Finance]
– Pythonic algorithmic trading library with event-driven backtesting for building and testing trading strategies

outlines
[LLM]
– Structured text generation library that constrains LLM outputs to follow specific schemas, formats, and data types

responses
[Testing]
– Utility library for mocking out the Python Requests library in tests with simple decorators and context managers

Looking for a specific tool? Explore 70+ Python tools →

📚 Latest Deep Dives

5 Python Tools for Structured LLM Outputs: A Practical Comparison
– Compare 5 Python tools for structured LLM outputs. Learn when to use Instructor, PydanticAI, LangChain, Outlines, or Guidance for JSON extraction.

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #283: MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic Read More »

Newsletter #282: Build Structured LLM Outputs with Guidance Constraints

Grab your coffee. Here are this week’s highlights.

🤝 COLLABORATION

What Data Engineers Really Think About Airflow (5.8K Surveyed)
Astronomer analyzed 5.8k+ responses from data engineers on how they are navigating Airflow today and the findings might surprise you.
You’ll learn:

How early adopters are using Airflow 3 features in production
Which teams are bringing AI into production and what’s holding others back
94% believe that Airflow is beneficial to their career

🔗 Download the State of Airflow 2026 Report

📅 Today’s Picks

Build Structured LLM Outputs with Guidance Constraints

Problem
Tools like Instructor and PydanticAI validate outputs after generation. If validation fails, they send the error back to the LLM and retry.
Each retry means paying for tokens that didn’t produce usable output.
Solution
Guidance works differently. It constrains tokens during generation, so invalid outputs can’t be produced in the first place.
Key capabilities:

Constrained outputs via regex patterns and selection functions
Python control flow (if/else, loops) during generation
JSON generation with Pydantic schema validation

📖 View Full Article

🧪 Run code

⭐ View GitHub

pandas 3.0: The End of SettingWithCopyWarning

Problem
When you filter a DataFrame and modify the result, you expect the original to stay unchanged.
But sometimes pandas modified your original data anyway, triggering the SettingWithCopyWarning.
Solution
pandas 3.0 fixes this. Filtering now always creates a separate copy, so modifying the result never affects your original data.
Upgrade to pandas 3.0 with “pip install -U pandas”.

📖 View Full Article

🧪 Run code

⭐ View GitHub

☕️ Weekly Finds

fake2db
[Data]
– Create custom test databases populated with fake data across SQLite, MySQL, PostgreSQL, MongoDB, Redis, and CouchDB

POT
[ML]
– Python Optimal Transport library providing solvers for optimization problems in signal processing, image processing, and machine learning

graphic-walker
[Data Viz]
– Open-source Tableau alternative for data scientists to analyze data and visualize patterns with drag-and-drop operations

Looking for a specific tool? Explore 70+ Python tools →

📚 Latest Deep Dives

From CSS Selectors to Natural Language: Web Scraping with ScrapeGraphAI
– Web scraping without selector maintenance. ScrapeGraphAI uses LLMs to extract data from any site using plain English prompts and Pydantic schemas.

Stay Current with CodeCut

Actionable Python tips, curated for busy data pros. Skim in under 2 minutes, three times a week.

.codecut-subscribe-form .codecut-input {
background: #2F2D2E !important;
border: 1px solid #72BEFA !important;
color: #FFFFFF !important;
}
.codecut-subscribe-form .codecut-input::placeholder {
color: #999999 !important;
}
.codecut-subscribe-form .codecut-subscribe-btn {
background: #72BEFA !important;
color: #2F2D2E !important;
}
.codecut-subscribe-form .codecut-subscribe-btn:hover {
background: #5aa8e8 !important;
}

.codecut-subscribe-form {
max-width: 650px;
display: flex;
flex-direction: column;
gap: 8px;
}
.codecut-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #FFFFFF;
border-radius: 8px !important;
padding: 8px 12px;
font-family: ‘Comfortaa’, sans-serif !important;
font-size: 14px !important;
color: #333333;
border: none !important;
outline: none;
width: 100%;
box-sizing: border-box;
}
input[type=”email”].codecut-input {
border-radius: 8px !important;
}
.codecut-input::placeholder {
color: #666666;
}
.codecut-email-row {
display: flex;
align-items: stretch;
height: 36px;
gap: 8px;
}
.codecut-email-row .codecut-input {
flex: 1;
}
.codecut-subscribe-btn {
background: #72BEFA;
color: #2F2D2E;
border: none;
border-radius: 8px;
padding: 8px 14px;
font-family: ‘Comfortaa’, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s ease;
}
.codecut-subscribe-btn:hover {
background: #5aa8e8;
}
.codecut-subscribe-btn:disabled {
background: #999;
cursor: not-allowed;
}
.codecut-message {
font-family: ‘Comfortaa’, sans-serif;
font-size: 12px;
padding: 8px;
border-radius: 6px;
display: none;
}
.codecut-message.success {
background: #d4edda;
color: #155724;
display: block;
}
@media (max-width: 480px) {
.codecut-email-row {
flex-direction: column;
height: auto;
gap: 8px;
}
.codecut-input {
border-radius: 8px;
height: 36px;
}
.codecut-subscribe-btn {
width: 100%;
text-align: center;
border-radius: 8px;
height: 36px;
}
}

Subscribe

Newsletter #282: Build Structured LLM Outputs with Guidance Constraints Read More »

Scroll to Top

Work with Khuyen Tran

Work with Khuyen Tran