# Jon Atkinson > Personal blog covering software engineering, Linux, Django, Python, and AI tools A collection of technical articles, tutorials, and thoughts on software development. ## Blog Posts - [How I use Claude Code](https://www.jonatkinson.co.uk/blog/how-i-use-claude-code): I've been using Claude Code a lot recently, and I've settled on a workflow that's been producing really good results. The short version... - [notion-to-json](https://www.jonatkinson.co.uk/blog/notion-to-json): I was a big Notion user. For a while, it was my go-to for everything: project management, note-taking, knowledge bases, and a lightweight CRM.... - [mastodon-to-bluesky](https://www.jonatkinson.co.uk/blog/mastodon-to-bluesky): I've been using Bluesky more and more recently. It's a pleasant enough place to post, though I'm still not entirely convinced by the AT... - [Good practice is good for LLMs too](https://www.jonatkinson.co.uk/blog/good-practice-is-good-for-llms-too): LLMs are changing how we write software. In the face of this unheaval, it's tempting to think these tools somehow absolve us from following good... - [Codex, Jules, and Claude Code comparison](https://www.jonatkinson.co.uk/blog/codex-jules-claude-comparison): I've tried three of the newer agentic code assistants this week: OpenAI Codex, Google Jules, and Claude Code. I asked each of them to operate in... - [Four Bubbles I've Lived Through, With One Exception](https://www.jonatkinson.co.uk/blog/four-bubbles): Working in technology means riding wave after wave of hype. Some waves reshape the landscape; others crash on the shore, leaving behind damp sand and... - [Trust but Verify: Sensible Ways to Use LLMs in Production](https://www.jonatkinson.co.uk/blog/trust-but-verify): Like many engineers right now, I'm exploring how LLMs can accelerate workflows. The potential is undeniable: generating code snippets, drafting... - [The MCP Servers I Actually Use](https://www.jonatkinson.co.uk/blog/mcp-servers-im-using): The Model Context Protocol (MCP) ecosystem is changing quickly. While experimentation is interesting, I've found myself settling on a core set of... - [The future of digital agencies](https://www.jonatkinson.co.uk/blog/the-future-of-agencies): This is keeping me up at night. The model we built is dying. It's time to build the next one. Let’s start with a sketch of an agency project. A... - [Preparing Django documentation for LLMs](https://www.jonatkinson.co.uk/blog/preparing-django-documentation-for-llm): I've been using files-to-prompt recently to help query large codebases with LLMs, but I realised this would work just as well for documentation... - [Setting up Matrix Synapse on Fedora](https://www.jonatkinson.co.uk/blog/matrix-synapse-setup-on-fedora): I wanted to install a Matrix service for my family. While matrix-synapse is packaged in Fedora, there's scant documentation regarding what to do... - [A Cline prompt for codebase analysis and feature extraction](https://www.jonatkinson.co.uk/blog/cline-prompt-code-analysis): From time-to-time, I'm asked to evaluate a large codebase. This is usually from a client who has a project in distress, or who needs to quickly... - [My Claude Artifact Prompt](https://www.jonatkinson.co.uk/blog/my-claude-artifact-prompt): I've found myself writing a lot of Claude artifact prompts recently. I don't remember if I started writing these little personal software... - [Fingerprint Authentication on a Lenovo Z13 and Fedora 40](https://www.jonatkinson.co.uk/blog/fingerprint-authentication-lenovo-z1-fedora-40): I've previously used fingerprint authentication on Thinkpads in the very distant past. There have been a lot of changes to the software stack... - [New in Python 3.13: SQLite support in dbm](https://www.jonatkinson.co.uk/blog/python-313-dbm-sqlite): Python 3.13 was released today, and it would be easy to overlook this: "dbm.sqlite3: An SQLite backend for dbm. (Contributed by Raymond... - [Django Carbon Measurement Notes](https://www.jonatkinson.co.uk/blog/django-carbon-measurement-notes): At work recently, I've been working on some code to measure the bandwidth required to display webpages, and from there calculate the approximate... - [Using ruff for everything in VSCode](https://www.jonatkinson.co.uk/blog/vscode-ruff-everything): Ruff's VSCode extension is nice, and can handle the jobs previously done by black and isort. To turn on everything, and to run this on every file... - [Automatic, persistent autoreload in iPython](https://www.jonatkinson.co.uk/blog/automatic-code-reload-ipython): I like that iPython can be configured to automatically reload modules. It's useful to be able to keep REPL context through development, without... - [A minimal Django application](https://www.jonatkinson.co.uk/blog/minimal-django-application): I wanted to put together a single-file Django application, which could still do 'useful' work; that is, define models, operate on them, and... - [Logging git commits with a git hook](https://www.jonatkinson.co.uk/blog/log-git-commits-hook): Similar to my previous post (more than a year ago!) about using Git hooks to enforce conventional commits, I wanted to start logging all of my... - [Testing the New Platform](https://www.jonatkinson.co.uk/blog/testing-platform): Testing the New Platform The migration to Cloudflare Workers is going well. Here's what's working: Blog listing Individual posts Markdown... - [First Blog Post on Workers](https://www.jonatkinson.co.uk/blog/first-post): First Blog Post This is my first blog post running on Cloudflare Workers with R2 storage. Features Markdown processing Frontmatter support Theme... - [Conventional Commits Git Hook](https://www.jonatkinson.co.uk/blog/conventional-commits-hook): I was looking for a way to enforce the Conventional Commits pattern for my own commit messages. A lot of the solutions I found were wildly... - [How I Do 1-2-1 Meetings](https://www.jonatkinson.co.uk/blog/how-i-do-121-meetings): It appears that everyone on the internet completely hates 1-2-1 meetings. I don't particularly want to add fuel to that viewpoint; I'm sure... - [Link Roundup #6](https://www.jonatkinson.co.uk/blog/link-roundup-6): Some of these are older links I found languishing, misfiled in my Safari favourites. The collapse of complex software Right now, the software... - [Link Roundup #5](https://www.jonatkinson.co.uk/blog/link-roundup-5): Back after a vacation with the ChatGPT special edition. I suspect the theme of the next 5 years will be ChatGPT. Chat GPT is the birth of the real... - [Link Roundup #4](https://www.jonatkinson.co.uk/blog/link-roundup-4): We are being levelled-down The government has allocated £9.7 billion of levelling up funding since 2019. But between 2010 and 2020, annual funding... - [Hiring Correctly](https://www.jonatkinson.co.uk/blog/hiring-correctly): It's a time of year when a lot of businesses are hiring, and layoffs mean there are more candidates in the marketplace. That also means the... - [Link Roundup #3](https://www.jonatkinson.co.uk/blog/link-roundup-3): Amazon is discontinuing its AmazonSmile charity program next month "Amazon emailed participants of the free program about the news on Wednesday.... - [Link Roundup #2](https://www.jonatkinson.co.uk/blog/link-roundup-2): Microservices are a Big Ball of Mud It's incredible that we still have microservice defenders in 2023. It's a prime example of the immaturity... - [Link Roundup #1](https://www.jonatkinson.co.uk/blog/link-roundup-1): A few years ago I used to write these short articles with links to interesting things I found on the internet. I stopped doing that because I... - [A game a week #3](https://www.jonatkinson.co.uk/blog/game-a-week-3): This week didn't have much consistency. I did a lot of work on this game last Sunday, and then I was busy most of the week, and I barely touched... - [A game a week #2](https://www.jonatkinson.co.uk/blog/game-a-week-2): I captured the momentum of last week, and began this game on Sunday evening. There was certainly more time spent on this game, but I spread it out... - [A game a week #1](https://www.jonatkinson.co.uk/blog/game-a-week-1): Introduction Like a huge amount of software people, when I was young I learned how to write code because I wanted to make games. Now fast-forward 30... - [Listing all Django URLs in a project](https://www.jonatkinson.co.uk/blog/list-all-django-urls): This will list all registered Django URLs in a project, with their arguments. from django.conf import settings from django.urls import URLPattern,... - [Parallel Rsync](https://www.jonatkinson.co.uk/blog/parallel-rsync): rsync will run in sequential mode by default. This can cause transfers to take a long time, and it's unlikely to make full use of your bandwidth... - [Dokku Cheatsheet](https://www.jonatkinson.co.uk/blog/dokku-cheatsheet): I always forget how to setup new Dokku apps; I do it infrequently enough that it never sticks. Create the app: $ ssh host $ dokku apps:create myapp... - [Github Marketplace Endgame](https://www.jonatkinson.co.uk/blog/github-marketplace): I've been thinking recently about Github Marketplace; where it may lead. I'm responsible for technical purchasing at Giant. That means that... - [Digital Workshop](https://www.jonatkinson.co.uk/blog/digital-workshop): In the neverending quest for the 'right' development setup, I've been thinking about the concept of how to organise and make available my... - [Serverless Thoughts #2](https://www.jonatkinson.co.uk/blog/serverless-thoughts-2): After hacking yesterday through a few issues with my AWS account (transferred a domain name from one AWS account to another, but didn't remove... - [Serverless Thoughts #1](https://www.jonatkinson.co.uk/blog/serverless-thoughts-1): I'm on holiday this week, and I wanted to use the time to really get to grips with serverless models of deployment. My background is in Python... - [Creating a new email user with `postfix` on Void](https://www.jonatkinson.co.uk/blog/new-postfix-user): This is possibly specific to my own super-minimal postfix setup on Void, but to add a new email user: $ sudo adduser someone $ sudo passwd someone... - [User services with `runit` on Void Linux](https://www.jonatkinson.co.uk/blog/user-service-runit-void): Void Linux uses the very miminalsit service management tool runit. The runsvdir program monitors a folder for service definitions, and then... - [Thinkpad X230/X220 keyboard swap](https://www.jonatkinson.co.uk/blog/thinkpad-x230-x220-keyboard): I recently replaced the keyboard in my Thinkpad X230 with the keyboard from and X220. There are a few reasons for this; while the chiclet keyboard on... - [Bringing up KVM on Arch](https://www.jonatkinson.co.uk/blog/kvm-on-arch): It's reasonably simple to bring up a new KVM system on Arch, assuming your hardware supports VT-x or AMD-V (and almost everything does). First,... - [TabNine on FreeBSD](https://www.jonatkinson.co.uk/blog/tabnine-on-freebsd): I'm a big fan of TabNine, a machine-learning powered omni-completer for pretty much any language. It's a hassle to run with FreeBSD, though.... - [The simplest pulseaudio installation on Arch](https://www.jonatkinson.co.uk/blog/simple-pulseaudio): I've previously ended up very confused by pulseaudio. Previously I've had over-complicated setups using a global daemon when really the... - [Distributed compilation with distcc on Arch](https://www.jonatkinson.co.uk/blog/distcc-arch): Sometimes, when I'm working, I'll prefer to sit on the couch with my laptop, which is a not-very-powerful i5/8GB Thinkpad. Sometimes I want... - [Syncing Gmail with mbsync](https://www.jonatkinson.co.uk/blog/gmail-mbsync): I've decided that I want to try to reduce my dependence on Google's services. A large part of my Google footprint is Gmail, which I have used... - [Thinkpad x230 fingerprint reader on Arch Linux](https://www.jonatkinson.co.uk/blog/thinkpad-x230-fingerprint-reader): I have a Lenovo Thinkpad x230, with an integrated fingerprint reader. The system runs Arch. This describes how to identify and register your... - [Installing Arch On a Vultr VPS](https://www.jonatkinson.co.uk/blog/installing-arch-on-a-vultr-vps): Abstract I have been happy using Vultr as my VPS provider for a few months now. Vultr offer a very flexible system of ISO upload before the first... - [Automatically --set-upstream when pushing a new branch](https://www.jonatkinson.co.uk/blog/automatically-set-upstream-when-pushing): I frequently open a new branch with git flow, and the first time I push to Github, I see the following message: fatal: The current branch... - [Remembering Rob Edwards](https://www.jonatkinson.co.uk/blog/remembering-rob-edwards): This has been a very difficult year. This year I lost my best friend and business partner. Rob and I had been friends for fifteen years, my entire... - [QBasic Development](https://www.jonatkinson.co.uk/blog/qbasic): Introduction I wanted to put together a decent build system for QBasic programs. My goal was to be able to use modern tools such as VSCode and git to... - [Setting up wee-slack](https://www.jonatkinson.co.uk/blog/setting-up-wee-slack-weechat): Installing the prerequisites First, we need to install the base weechat binaries. I like the aspell plugin to be enabled in Weechat, so I'll... - [Remote Working Roundtable](https://www.jonatkinson.co.uk/blog/remote-working-roundtable): I was recently invited to participate in a DaaS/Remote Working roundtable discussion at UKFast. I'm not sure I could add anything much on DaaS;... - [Personal VPN Setup](https://www.jonatkinson.co.uk/blog/personal-vpn-setup): I feel the need to start this post with something impactful about industrial-scale data capture and the weaponsiation of software exploits; this... - [Recursively updating S3 bucket permissions](https://www.jonatkinson.co.uk/blog/recursively-updating-s3-bucket-permission): If you want to recursively apply a permission to an S3 bucket (for example, to add the public-read permission), then you can use the aws CLI tool to... - [Listing ElasticBeanstalk applications with the aws CLI tool.](https://www.jonatkinson.co.uk/blog/listing-elasticbeanstalk-applications-with-aws-cli): You can easily list EB applications in your default AWS account with the following query. $ aws elasticbeanstalk describe-applications --query... - [How To Fire Someone](https://www.jonatkinson.co.uk/blog/how-to-fire-someone): Don’t hide the message. Be direct and begin with the reason: "I have bad news, you are being let go due to X". Make eye contact as you do... - [Django coverage reports without unit tests](https://www.jonatkinson.co.uk/blog/django-coverage-reports-without-unit-tests): I was recently working on a Django project which had a lot of development effort spent over a wide range of features which never made it to launch.... - [Blog](https://www.jonatkinson.co.uk/blog/index): Logging git commits with a git hook Sep 9, 2024 Conventional Commits Git HookMay 3, 2023 How I do 1-2-1 meetingsFeb 28, 2023 Link Roundup #6Feb 20,... ## Other Resources - [Atom Feed](https://www.jonatkinson.co.uk/blog.xml): Subscribe to blog updates