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-cover.png

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

Group photo at DjangoCon US 2025

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.

cover-happy-20th-birthday-django.png

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.

cover-djangocon-europe-2025-highlights.jpg

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.

cover-cakti-share-their-favorite-tools-for-streamlined-worklows.jpg

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

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.

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: