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.

2025


cover-upgrade-smarter-not-harder-python-tools-code-modernization.jpg

Upgrade Smarter, Not Harder: Python Tools for Code Modernization

Upgrading projects is somewhat equivalent to flossing, you know you have to do it, but rarely make time for it. After all, if the project is in active development, there are exciting new features to build. And we all know that new features > project upgrades. Well not to worry, Caktus wants to make you aware of some tools that will save you from considerable repetitive work & time while simultaneously modernizing your codebase. Combined, these tools will automate part of the upgrade process, decreasing the likelihood of neglecting parts of the codebase.

How to Use regexp_matches and regexp_match in PostgreSQL

Introduction

regexp_matches() and regexp_match() are two similar string functions that support regular expression matching directly in the PostgreSQL database. regexp_matches() was added in PostgreSQL 8.3, and regexp_match() was added in PostgreSQL 10 (keep reading to see how ChatGPT struggled to answer this question).

How to Create a Helm Chart for a Django App

At Caktus, we use Helm charts to simplify our deployment process for Django projects. Helm is a package manager for Kubernetes, and using Helm charts allows us to automate the process of writing Kubernetes configuration files for our Django applications. We use it together with GitHub Actions and Ansible to streamline our deployment processes.

One Thing to Look Out For While Testing django-import-export

Often the applications we build at Caktus deal with large sets of Django objects. The attributes of these objects can vary, and may need updating in certain instances. One of the best ways to manage this data is via django-import-export, which is a tool that creates a way to perform these bulk updates with a file upload such as a .csv or .xlsx file.

cover-private-ngrok-dev-servers-tailscale.png

Private, ngrok-like Dev Servers with Tailscale

This past week, I learned that it's possible to run Tailscale in a local docker-compose.yml on a developer's workstation, and securely allow access to services in the docker-compose file to other users on your Tailnet.

cover-choosing-a-voice-for-speech-synthesis.jpg

Choosing a Voice for Speech Synthesis

Recently we’ve been adding read-aloud support to a Django website. The tech stack for this site is Django with a bit of jQuery on the front end. The website is used exclusively in the United States, its content is offered in English and Spanish, and the read-aloud support is wanted for forms on the site. So where the site offered, for example:

A Helpful Guide to Solving Common Poetry Issues

We don't often use Poetry, the Python packaging and dependency management tool, but when we do, we usually look up and re-learn the same things repeatedly. This post is a quick reference for some of the recent issues we encountered when using Poetry.

cover-chicago-local.jpg

Chicago Like A Local

Chicago Like a Local: Things to Do During DjangoCon US 2025 (Part 1)

DjangoCon US 2025 is coming to Chicago, and while you’ll be busy soaking in all things Django, there’s no reason you can’t experience the city like a local while you’re here. Whether you’re looking for great food, cultural spots, or just a cool place to unwind, here are some top recommendations from a Chicago native.

Understanding Pricing in Custom Software Development

If you’re in the early stages of a software project and researching a technology partner, I can guess your top two questions:

How to Deploy Selectively to Production

Sometimes, it’s necessary to deploy a set of features and/or bug fixes to production before part of the current “testing” branch has been tested completely in a Q/A or staging environment.