Caktus Blog

Insights and strategies from a team recognized at Python and Django conferences worldwide since 2009. The Caktus Blog is your space for practical how-to’s, real-world solutions, and expert advice on building better user experiences, strengthening quality assurance, solving deep and complex Python/Django problems, and managing projects that deliver impact. Whether you’re refining a UI or prepping for launch, join us to learn, level up, and lead with confidence.

2026


cover.jpg

Supporting Django's Next Chapter

The path to hiring an Executive Director gained real momentum at DjangoCon US 2024, when Jacob Kaplan-Moss shared a vision for what dedicated resources could mean for the future of Django. In his blog post If We Had $1,000,000, he invited companies and supporters to help get the initiative off the ground. The response from the community was inspiring, and we’re proud to see that vision become reality.

cover.png

Easily Stream LLM Responses with Django-Bolt and PydanticAI

I like how easy it is to create an async streaming endpoint with django-bolt and PydanticAI from scratch. With only a few commands you can set it up.

cover.png

All Things AI Conference: Team Insights

A few of my colleagues attended the 2026 All things open AI Conference in Durham. I found myself with a major case of FOMO, so I thought I would pick Colin, honorary Cakti Peter and Gerald’s brain.

cover.jpg

DjangoCon 2025 The Attendee's Experience

This post is the second in a three-part series reflecting on DjangoCon US 2025. In this post, I’m reflecting on experiencing DjangoCon 2025 from the audience while serving as conference chair.

2025


cover.png

PydanticAI Agents Intro

In previous posts, we explored function calling and how it enables models to interact with external tools. However, manually defining schemas and managing the request/response loop can get tedious as an application grows. Agent frameworks can help here.

cover.png

LLM Basics: Ollama Function Calling

In our previous post, we introduced function calling and learned how to do it with OpenAI’s LLMs. In this post, we’ll call the same cactify_name function from that post using Meta’s Llama 3.2 model, installed locally using Ollama. The techniques in this post should also work with other Ollama models that support function-calling.

cover.png

LLM Basics: OpenAI Function Calling

In our previous post, we explored how to send text to an LLM and receive a text response in return. That is useful for chatbots, but often we need to integrate LLMs with other systems. We may want the model to query a database, call an external API, or perform calculations.

cover.jpg

Behind the Curtain as a Conference Chair

This post is the first in a three-part series reflecting on DjangoCon US 2025 — In this post, I’m taking you behind the scenes of DjangoCon US 2025 to share what it taught me about leadership, community, and the power of holding space for others.

cover.png

Hitting Limits and Noticing Clues in Graphs

Editor’s Note: This post was updated November 11, 2025 to correct the graphs that are linked to the text in the blog.

The Halting Problem

In a previous post, I wrote about adding read-aloud support to a website we maintain. I mentioned how it was pretty straightforward to do and even easy to get the browser to choose a correct voice that matches the language of the text being spoken. We did, however, hit one puzzling and difficult-to-resolve issue: for large pieces of text to be read aloud, sometimes a browser would simply stop speaking. No errors appeared in the JavaScript console, and querying the speechSynthesis API indicated it was “speaking,” but it wasn’t.