I trusted three local AI models, and Python had to clean up their mess

Previously, I reported that I vibe-coded a tool that reads a blog post I’ve written and generates platform-specific promo copy using a local Ollama model. I chose local models because I’m curious about them. They seem to be the future of AI, at least for use cases like this… and it works… sort of. Now, the continued story of how I trusted three local AI models and Python had to clean up after them. The truth is that I was asking too much of them, and they returned occasionally insightful and often malformed and hallucinatory results. ...

March 13, 2026 · 9 min · Jamal Hansen

Use any Python AI agent framework with free GitHub Models

Why This Caught My Eye Getting started with new things isn’t easy; this can hold true even in the age of AI. Time, money, and entropy can keep the best of us from getting started with learning a new technology. This post gives you sample code and the LLM provider that you need to get started on your agentic learning journey.

March 1, 2026 · 1 min · Jamal Hansen
Generate Practice Data with faker

Generate Practice Data with faker

Last week, we got DuckDB running with three hardcoded rows. That got us started, but three rows? You can eyeball that. Let’s generate hundreds of realistic customers and build a dataset worth exploring. Python has the perfect tool: faker. It’s a library that generates realistic fake data: names, emails, addresses, dates, and anything else you’d find in a real database. Let’s use it to build a dataset we can explore for the rest of this series. ...

January 19, 2026 · 4 min · Jamal Hansen
Zero-Setup SQL: Run your first SQL query in under 5 minutes with DuckDB

Zero-Setup SQL: Run your first SQL query in under 5 minutes with DuckDB

Have you ever tried setting up a database server just to learn SQL? Docker containers, admin credentials… Forget all that. Let me show you how to go from zero to running SQL in under 5 minutes. Why are we using DuckDB to learn SQL? No setup - Just import and start using it Real SQL - PostgreSQL compatible syntax so what you learn transfers Fast enough - Handles millions of rows on your laptop Python-native - Works well with lists, DataFrames, CSV files It is perfect for learning without infrastructure headaches. ...

January 10, 2026 · 2 min · Jamal Hansen
I know Python; Why learn SQL

I know Python; Why learn SQL

I learned SQL very early in my career. At the time, I didn’t understand why, and for the first month or so, it didn’t make sense to me. The syntax didn’t resemble any language I had seen before, and it employed concepts with which I was unfamiliar. This all made SQL seem scary, and oddly enough, SQL hasn’t changed much in the past 40 years, which makes it even more of an oddity. ...

January 5, 2026 · 2 min · Jamal Hansen
An update on my agentic learning journey

An update on my agentic learning journey

A few weeks back I started on an agentic journey with the Udemy offering The Complete Agentic AI Engineering Course. This has been a great hands-on offering. I’ve completed 4 of the 6 weeks covering OpenAI Agents SDK, CrewAI, and LangGraph as well as some foundational theory. Throughout the course, the instructor Ed Donner has done a great job teaching enthusiastically and providing real world code that demonstrates the concepts of each framework. ...

June 24, 2025 · 3 min · Jamal Hansen

Add External Dependencies to Python Scripts with uv

Ever wanted to share a Python script that uses external packages without making the recipient set up a virtual environment? With uv, you can embed dependencies directly in the script. The Command uv add --script example.py 'requests<3' 'rich' This adds inline metadata to your script: # /// script # dependencies = [ # "requests<3", # "rich", # ] # /// import requests from rich.pretty import pprint resp = requests.get("https://peps.python.org/api/peps.json") data = resp.json() pprint([(k, v["title"]) for k, v in data.items()][:10]) Running It Anyone with uv installed can now run the script directly: ...

April 19, 2025 · 1 min · Jamal Hansen