Sign in

Adam Johnson

@adamj.eu
3.4K followers 266 following 812 posts

🐴 @djangoproject.com blogger and contributor ✍️ Author of three books on Django and Git 🍕 Django London co-organizer 🇬🇧 London / 🇵🇹 Lisbon

PostsRepliesMedia
Adam Johnson @adamj.eu · 15h
Zsh is deliberately similar to Bash, just with some* extra stuff on top. *actually lots of extra stuff Maybe that can tempt you? :)
110
Adam Johnson @adamj.eu · 15h
🚄 Just released django-upgrade 1.33.0, now 27-38% faster! Three stacked optimizations led to a nice speedup. django-upgrade.readthedocs.io/en/latest/ch... #Django
django-upgrade.readthedocs.io
Changelog - django-upgrade 1.33.0 documentation
050
Adam Johnson @adamj.eu · 17h
✍️ New post showing how Zsh’s autocompletion works even for small bits of syntax like glob qualifiers. Press Tab and see all the options, like “o” for ordering and “m” for modification time. adamj.eu/tech/2026/10... #Zsh
adamj.eu
Zsh: tab complete glob qualifiers - Adam Johnson
I’ve written a few posts on Zsh’s glob qualifiers recently, covering:
120
Adam Johnson @adamj.eu · 02/10/2026
✍️ New post on serving the Apple and Android app-to-site association files from Django. It can be fiddly to get the two sides interlinked! adamj.eu/tech/2026/10... #Django
adamj.eu
Django: serve apple-app-site-association and assetlinks.json - Adam Johnson
If your site has companion Apple or Android apps, you probably want links to your site to open in those apps, when installed. Both platforms support this, with Apple calling the feature Universal Link...
020
Adam Johnson @adamj.eu · 30/09/2026
✍️ New post on Zsh’s natural sort order feature, handy for getting your pages in the right order! adamj.eu/tech/2026/09... #Zsh
adamj.eu
Zsh: sort globs in natural order with the (n) glob qualifier - Adam Johnson
Globs sort filenames character by character, so numbered files often come out in a surprising order, with 10 before 2. Zsh has a neat fix for this: the n glob qualifier, which applies a “natural” sort...
021
Adam Johnson @adamj.eu · 29/09/2026
For when crem doesn’t work:
A tub of “Sudocrem”, an antiseptic healing cream.

It gets to the root of the problem.
290
Adam Johnson @adamj.eu · 29/09/2026
📣 Join me on Thursday, 8th October, in Lisbon for a small software engineering meetup! Looking forward to meeting more folks out there. adamj.eu/tech/2026/09... #SoftwareEngineering #Python #Django #Lisbon #Lisboa #Portugal
adamj.eu
Python: join my meetup in Lisbon, 8th October - Adam Johnson
I previously announced my Python optimization workshop in Lisbon, on 10th October (which still has a few places). I am now pleased to add a Python/Django meetup on the Thursday before.
042
Adam Johnson @adamj.eu · 28/09/2026
Still a few spots left!
031
Adam Johnson @adamj.eu · 23/09/2026
I have sent one to you!
010
Adam Johnson @adamj.eu · 21/09/2026
Cheers, don't think I've heard these before 🤘
010
Adam Johnson @adamj.eu · 21/09/2026
✍️ New post on finding big files with Zsh’s glob qualifiers adamj.eu/tech/2026/09... #Zsh
adamj.eu
Zsh: find the largest files with the (OL) glob qualifier - Adam Johnson
Got a directory that you want to tidy up bloat from? Whether you’re trying to find bad build artifacts in your work repository or clear out old cat videos from your home directory, Zsh’s (OL) glob qua...
031
Adam Johnson @adamj.eu · 21/09/2026
🔊 What the Future Holds - S.P.Y. Gorgeous orchestral dnb, amazing London timelapses, still hits big 14 years later. www.youtube.com/watch?v=-X07... #DrumAndBass #London
youtube.com
S.P.Y - What The Future Holds (feat. Ian Shaw) - OFFICIAL VIDEO
YouTube video by Hospital Records
120
Adam Johnson @adamj.eu · 21/09/2026
Ah nice 👍 It’s also well easy to vibe code your own macOS utilities like that in swift now, if you ever beed a feature it doesn’t have…
000
Adam Johnson @adamj.eu · 20/09/2026
✍️ New post on using macOS’ caffeinate command, which I recently found useful to keep a code migration script running. adamj.eu/tech/2026/09... #macOS
adamj.eu
macOS: use caffeinate to keep your computer on - Adam Johnson
If you’re starting a long job on your Apple Macintosh Computer and wandering off for a coffee, the machine may go to sleep before it finishes due to inactivity. To prevent that from happening, also gi...
110
Reposted by Adam Johnson
Frank Wiles @fwiles.bsky.social · 19/09/2026
Made a fun little utility for myself over the last hour or so. Using Adam Johnson's new django-mcpz created an MCP in my personal cluster to collect "notes" and then an iOS shortcut to launch Claude in voice chat mode so I can add/edit/retrieve notes while on the go
112
Adam Johnson @adamj.eu · 19/09/2026
🔧 I’m excited to host this optimization workshop in Lisbon next month. Come join me to learn about profiling and optimizing Python code, and maybe even contribute to Django itself. adamj.eu/tech/2026/09... #Python #Django
adamj.eu
Python: join my optimization workshop in Lisbon, 10th October - Adam Johnson
I’m running a workshop in Lisbon next month, and you’re invited!
020
Adam Johnson @adamj.eu · 18/09/2026
I should be prompt injecting my audience to get their humans to buy my books 😂
110
Adam Johnson @adamj.eu · 16/09/2026
✍️ New post on serving the change password well-known URL in Django Add this one redirect and two tests (you won't believe #2) to make your site more user-friendly for users with compromised passwords. adamj.eu/tech/2026/09... #Django #Security
adamj.eu
Django: serve the change password well-known URL - Adam Johnson
When a password manager detects that a user’s password has been leaked or reused, it can prompt them to change it, but the password change URL varies by site. The web’s answer to such discovery proble...
083
Adam Johnson @adamj.eu · 16/09/2026
This release adds new skip/expected_failure features, fixes a bug when using Coverage\.py's dynamic contexts, and tidies up error messages and usage docs.
010
Adam Johnson @adamj.eu · 16/09/2026
🧪 I just released unittest-parametrize 1.9.0. This package helps you make parametrized tests that work with the grain of unittest, but can still be run with pytest. github.com/adamchainz/u... #Python
github.com
unittest-parametrize/CHANGELOG.rst at main · adamchainz/unittest-parametrize
Parametrize tests within unittest TestCases. Contribute to adamchainz/unittest-parametrize development by creating an account on GitHub.
120
Adam Johnson @adamj.eu · 15/09/2026
🎁 Introducing django-mcpz: easy peasy MCP servers in Django! This new package lets you build an MCP server in your Django project, letting LLMs do things on your site on behalf of your users. adamj.eu/tech/2026/09... #Django #AI
adamj.eu
Django: introducing django-mcpz, for making MCP servers - Adam Johnson
I made another package! Say hello to django-mcpz, for building Model Context Protocol (MCP) servers in your Django project.
280
Reposted by Adam Johnson
Simon Willison @simonwillison.net · 14/09/2026
Built a little local web app to help edit commit messages for a repo simonwillison.net/2026/Sep/14/...
Screenshot of the commit-rewriter web interface. A heading reads commit-rewriter above the repository path and current branch and commit hash, with a short description of the tool. A toolbar shows a pending edits count with Discard drafts and Rewrite commit messages buttons, followed by a search box for message, author, or hash and an Edited only checkbox. A left sidebar titled Navigate commits lists recent commit messages with their short hashes. The main panel shows a card for each commit with its hash, author and timestamp, an editable text area containing the commit message, and a View full formatted diff toggle.
7594
Adam Johnson @adamj.eu · 13/09/2026
Yeah, read every character!
010
Adam Johnson @adamj.eu · 09/09/2026
None of them had a huge impact (this is a test library, after all), but they were all mistakes. The worst would leave time mocked after a test tearDownClass() failure, which would be pretty hard to debug. Crazy times. These machines can help us build the highest-quality software, if we want.
011
Adam Johnson @adamj.eu · 09/09/2026
⏳ I just released time-machine 3.5.1 with 13 bug fixes. Two were reported by humans. The rest came from prompting Claude Fable with just "Find and fix bugs". time-machine.readthedocs.io/en/latest/ch...
time-machine.readthedocs.io
Changelog - time-machine 3.5.1 documentation
130
Adam Johnson @adamj.eu · 01/09/2026
Software is never finished: even this 11 year old well-scoped plugin needs the occasional big fix!
000
Adam Johnson @adamj.eu · 01/09/2026
🎲 Just released pytest-randomly 5.0.0 The headline breaking change fixes combination with other test reordering plugins, including pytest-django. Previously, the same seed could produce different test orders between nearly-identical environments. Oops! #Python #pytest pypi.org/project/pyte...
pypi.org
pytest-randomly
Pytest plugin to randomly order tests and control random.seed.
120
Adam Johnson @adamj.eu · 01/09/2026
Oh wow www.reddit.com/r/origami/s/...
reddit.com
From the origami community on Reddit: I finally broke the world record for smallest paper crane! Entire 35 minute process was filmed through a microscope. I measured with calipers to 0.8 mm
Explore this post and more from the origami community
100
Adam Johnson @adamj.eu · 01/09/2026
Haha I did but also the details are very interesting. That sounds very small, I gotta look it up!
100
Adam Johnson @adamj.eu · 31/08/2026
Were you craning your neck to see it?
100
Adam Johnson @adamj.eu · 25/08/2026
✍️ Zsh lets you manipulate filenames with modifiers, which I recently found useful when converting files between formats. adamj.eu/tech/2026/08... #Zsh
adamj.eu
Zsh: manipulate filenames with modifiers like :r (root) and :e (extension) - Adam Johnson
Zsh modifiers are a family of suffixes that transform words as they’re expanded. Several of them are dedicated to slicing up filenames, replacing fiddly calls to dirname, basename, and friends. Let’s ...
020
Adam Johnson @adamj.eu · 20/08/2026
We’re so back #htmx
051
Adam Johnson @adamj.eu · 18/08/2026
✍️ I used my leet prompt engineering skillz to fix a bunch of bugs in django-upgrade adamj.eu/tech/2026/08... #Django #Python #AI
adamj.eu
Django: django-upgrade 1.32.0 out now, with 44 AI-assisted bug fixes - Adam Johnson
django-upgrade is my tool for automatically upgrading your project code for new Django versions. It rewrites your Python files to fix deprecations and adopt some new features, taking a chunk of the mo...
190
Reposted by Adam Johnson
Christopher Trudeau @trudeau.dev · 14/08/2026
On this week's episode, @digiglean.bsky.social and I talk about testing in Django, SIMD, data visualization and more. With content from: @djangoproject.com @adamj.eu @retr0.id @purplesyringa.bsky.social and others not on the 🦋 Also, this time I might even include a link! buff.ly/rTT0o1M
realpython.com
Episode #307: Improving NumPy Performance on Free-Threaded Python – The Real Python Podcast
What bottlenecks were preventing NumPy from scaling on free-threaded Python? Christopher Trudeau is back on the show this week with another batch of PyCoder's Weekly articles and projects.
021
Adam Johnson @adamj.eu · 12/08/2026
No worries! It is kinda driving me crazy how slow string manipulation is in Python, compared to what computers can do. We gotta get more such packages moved into low-level languages :)
010
Adam Johnson @adamj.eu · 12/08/2026
📦 New package day! This time a Rusty rewrite of the emoji package: 3.5x faster for conversion, 70 times faster for deconversion, and using about 40% less memory. adamj.eu/tech/2026/08... #Python #Rust
adamj.eu
Python: introducing emojet, a fast emoji lookup library - Adam Johnson
New package just landed!
160
Adam Johnson @adamj.eu · 08/08/2026
✍️ I just released a new version of my little Python profiler, tprof, with less overhead for more accurate results. adamj.eu/tech/2026/08... #Python
adamj.eu
Python: tprof 1.3.0: now with less overhead - Adam Johnson
Back in January, I introduced tprof, a targeting profiler for Python 3.12+ that measures the time spent in specific functions, rather than your whole program. As a reminder, here’s the basic usage, sp...
030
Adam Johnson @adamj.eu · 08/08/2026
I have not. JSON serialization seems to show up as just a few % of the typical app, but if there’s a nearly free win there it seems worth it.
010
Adam Johnson @adamj.eu · 07/08/2026
🎨 I’m really enjoying the redesigned PyPI project pages. Thanks to Nicole Harris and team for making these improvements! Blog post: blog.pypi.org/posts/2026-0... #Python
Django’s project page on PyPI, showcasing the new design.
070
Adam Johnson @adamj.eu · 07/08/2026
✍️ New package: django-msgspec, providing Django integrations with msgspec’s faster JSON serialization and deserialization. adamj.eu/tech/2026/08... #Django
adamj.eu
Django: introducing django-msgspec - Adam Johnson
It’s another day, another new package day here. Say hello to django-msgspec, a package of drop-in replacements for Django and Django REST Framework (DRF) components backed by msgspec.
150
Adam Johnson @adamj.eu · 07/08/2026
✍️ The story of a 50x optimization I made in Git earlier this year. adamj.eu/tech/2026/08... #Git
adamj.eu
Git: my git stash -p optimization in Git 2.55 - Adam Johnson
I got another commit merged in Git 2.55 (2026-06-29), yay! The release note reads:
030
Adam Johnson @adamj.eu · 07/08/2026
TIL pluot. Enjoy!
220
Adam Johnson @adamj.eu · 07/08/2026
✍️ List the files present in any Git commit without checking it out. adamj.eu/tech/2026/08... #Git
adamj.eu
Git: list files at a given commit with ls-tree - Adam Johnson
To list all files in your repository as they were at a given commit, use git ls-tree with its -r and --name-only options:
010
Adam Johnson @adamj.eu · 06/08/2026
😍 wowza
030
Adam Johnson @adamj.eu · 06/08/2026
📦 Just released django-htmx 1.29.0 which now vendors a bunch of htmx extensions, updates the vendored htmx versions, and adds support for htmx v4's polling extension django-htmx.readthedocs.io/en/latest/ch... #Django #htmx
django-htmx.readthedocs.io
Changelog - django-htmx 1.29.0 documentation
061
Adam Johnson @adamj.eu · 05/08/2026
Strong update game!
000
Adam Johnson @adamj.eu · 05/08/2026
🆙 Updated my post on unittest base test cases with a new preferred technique: using a plain class as a container. adamj.eu/tech/2025/05... #Python #unittest
adamj.eu
Python: sharing common tests in unittest - Adam Johnson
A neat testing pattern is writing common tests in a base class and then applying them to multiple objects through subclassing. Doing so can help you test smarter and cover more code with less boilerpl...
020
Adam Johnson @adamj.eu · 05/08/2026
✍️ New post covering how to read your local Git log while skipping commits from a certain author. In my case, it was the ol’ Dependabot. adamj.eu/tech/2026/08... #Git #GitHub
adamj.eu
Git: exclude commits by an author in git log with --perl-regexp - Adam Johnson
git log has an --author option to limit the output to commits from matching authors:
010
Adam Johnson @adamj.eu · 05/08/2026
Django 6.1 is out !!! www.djangoproject.com/weblog/2026/... #Django
djangoproject.com
Django 6.1 released
Posted by Jacob Walls on Aug. 5, 2026
042
Adam Johnson @adamj.eu · 04/08/2026
Not til you beat the boss!
030