Tobias McNulty
Tobias co-founded Caktus in 2007 and, as Chief Executive Officer, guides the strategic vision of the company. He has been an active member of the Django development community, is a core developer of the RapidSMS framework, and makes regular contributions to both the projects. He is the co-author of and chief advocate for the messages framework that was introduced in Django 1.2 and has helped Colin organize several successful Django development sprints in the North Carolina Research Triangle area.
Tobias is also a passionate believer in the power of technology to improve public health and obtained a Masters of Public Health at the University of North Carolina - Chapel Hill in 2016. When he’s not writing software, Tobias loves cooking, making pottery, and cycling.
2025

DjangoCon US 2025: A Celebration of Community, Code and 20 Years of Django

Celebrating 20 years of Django
DjangoCon US 2025 was a milestone year for the community, as we gathered in Chicago to celebrate 20 years of Django. Attendees from around the world came together to learn about the latest developments, share their work, and strengthen the bonds that make DjangoCon such a special event. Caktus was well-represented once again, with our team contributing as organizers, speakers, and active participants throughout the week.

Happy 20th Birthday Django!
This Tuesday (tomorrow!), August 12th, we’re teaming up with TriPython to host an informal Django Birthday event at Boxyard RTP in Durham.

How to Migrate your Python & Django Projects to uv
Editor’s note: This post was updated on July 17th, 2025, to use the
PATH_add hook for direnv and to recommend including uv sync --locked
in your .envrc file.

DjangoCon Europe 2025 Highlights
Three Cakti recently attended DjangoCon Europe 2025 in Dublin and it was a wonderful experience! It was great to see and chat with various Django community members we usually only see once or twice a year. Beyond that, we were most impressed by the consistently high quality of the talks throughout all three days of the conference. It was a pleasure to listen to so many excellent presentations, including the lightning talks at the end of each day. Here are some of our favorite talks.

Tips for Tracking Django Model Changes with django-pghistory
Django and its admin interface are a big part of why Caktus uses Django, but the admin's ability to log database changes is limited. For example, it shows only changes made via the Django admin, not via other parts of the site.

Cakti Share Their Favorite Tools For Streamlined Workflows
Let’s jump into it!
At Caktus, we’re always looking for tools that help us streamline our workflows, increase productivity, and make our day-to-day tasks more efficient. Whether you’re managing projects, writing code, or debugging, the right tools can make all the difference. Here are some of our favorite tools that we love using to get the job done!

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).

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.

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.

How to fix factory_boy post-generation deprecation warnings
We use factory_boy for
bootstrapping test data on many Python and Django projects at Caktus.
Recently, we encountered a deprecation warning on an older project that
had been using factory_boy for some time:
