The Curious Engineer

All blogs / Python

Loopwerk feed of everything

loopwerk.io

PythonWeb developmentMobile / iOS / AndroidSoftware / engineering practice

Posts
145 from 26 Nov 2009 to 26 Oct 2026
Posting
weekly (46 in the last year)
Kind
personal blog
Feed
https://www.loopwerk.io/feed.xml

2026 45

  1. Architecture, September 17, 2026
  2. Architecture, September 17, 2026
  3. Architecture, September 17, 2026
  4. Architecture, September 15, 2026
  5. Architecture, September 15, 2026
  6. Architecture, September 15, 2026
  7. Nature, September 15, 2026
  8. Animals, April 18, 2026
  9. Architecture, April 11, 2026
  10. Architecture, January 5, 2026
  11. Architecture, November 9, 2025
  12. Architecture, November 9, 2025
  13. Architecture, November 9, 2025
  14. Architecture, November 9, 2025
  15. Street, November 9, 2025
  16. Feet, October 4, 2025
  17. Nature, September 19, 2025
  18. Feet, September 19, 2025
  19. Nature, August 23, 2025
  20. Nature, August 22, 2025
  21. Expertise is the art of ignoring Jan 18, 2026Trying to master a programming language is a trap. Learn what you need when you need it, and ignore the rest on purpose.
  22. Django 6.0 Tasks: a framework without a worker Jan 19, 2026Background tasks have always been essential in Django projects. Django 6.0 finally acknowledges that fact, but its new tasks framework stops short of what real apps need.
  23. Announcing Moon, a new HTML syntax highlighter for Swift projects Jan 23, 2026I've created a new Swift package that does server-side syntax highlighting of HTML content, using Prism.js.
  24. Django's test runner is underrated Jan 30, 2026I never made the switch from unittest to pytest for my Django projects. And after years of building and maintaining Django applications, I still don't feel like I'm missing out.
  25. It's time to leave Heroku Feb 07, 2026Heroku just announced it's entering "sustaining engineering mode". No more new features. After years of security breaches, outages, and price hikes, it's time to leave.
  26. A real-world comparison of static site generators: Hugo vs Publish vs Saga Feb 12, 2026I built the same site with Hugo, Publish, and Saga to compare how each static site generator handles real-world requirements.
  27. BuildKit's garbage collection is deleting Coolify's build cache Feb 13, 2026If your Coolify deployments are sometimes fast and sometimes mysteriously slow, Docker's BuildKit garbage collection is probably silently deleting your build cache.
  28. Announcing the Saga CLI Feb 14, 2026Saga now has a companion CLI tool, installable via Homebrew or Mint, with commands to scaffold a new project, build your site, and run a dev server with live reload.
  29. Self-hosting Plausible broke my analytics Feb 17, 2026After years on Plausible I switched to self-hosting and discovered just how much they hold back from their open source version.
  30. Umami vs Plausible Feb 18, 2026I switched from Plausible to Umami. Here's what's better, how I set up proxying to bypass adblockers, and the big problem with bots.
  31. Protect your analytics with Cloudflare Feb 19, 2026How I used Cloudflare's free security rules to filter bot traffic from my self-hosted Umami analytics.
  32. Announcing Bonsai, a new HTML minifier in pure Swift Mar 02, 2026I've created a new HTML minifier in pure Swift, with zero dependencies and performance on par with the best Node.js minifiers.
  33. Announcing SwiftTailwind Mar 04, 2026I've created a Swift package that wraps the Tailwind CSS standalone CLI, removing the need for Node.js or npm in your build pipeline.
  34. Announcing SagaUtils Mar 02, 2026A collection of reusable utilities for Saga, extracted from this very website: composable HTML transformations and useful String extensions.
  35. Announcing GetSaga.dev Mar 07, 2026I've created a brand new documentation website for Saga, built with Saga itself. It features full API reference docs, works without JavaScript, and looks pretty great.
  36. The shortcomings of Swift Package Manager Mar 19, 2026As I prepare Saga 3, I keep running into fundamental limitations in Swift Package Manager that make maintaining a plugin ecosystem unnecessarily painful.
  37. Building modern Django apps with Alpine AJAX, revisited Mar 25, 2026Nine months after adopting Alpine AJAX with Django, I've gone through template partials, Jinja2, and landed on an approach that's both fast and clean.
  38. Announcing Saga 3 and Parsley 1.2 Mar 26, 2026Saga 3 brings much faster builds and a more flexible pipeline, while Parsley 1.2 adds powerful Markdown attribute support.
  39. Coding with AI: productivity without pride or joy Apr 01, 2026I just finished my most productive quarter in a long time, made possible by Claude Code, and there are two conflicting feelings that I want to talk about.
  40. Announcing Scry Apr 06, 2026Scry is a pure-Swift, dependency-free, and fully Linux-compatible EXIF parser.
  41. uv is fantastic, but its package management UX is a mess May 21, 2026uv's CLI feels surprisingly clunky compared to its peers like pnpm or Poetry.
  42. How I use Claude Code Aug 24, 2026Here's how I make the most out of Claude Code: my CLAUDE.md rules and a pre-commit hook for Claude to check its own work.
  43. Analysis paralysis sucks Aug 26, 2026Junior developers don't start because they don't know enough. Senior developers don't start because they know too many things that could go wrong. Both are stuck.
  44. Ten years of freelancing: lessons and advice Sep 01, 2026It's ten years since I quit my job and started freelancing. Here's how I got started, how I find clients, how to figure out your rate, and what I'd tell anyone thinking about doing the same.
  45. Serving Markdown to AI agents Sep 09, 2026AI agents ask for Markdown via their Accept header, so why not give it to them?

2025 29

  1. First thoughts on Svelte 5's runes Jan 02, 2025I'm migrating a big SvelteKit project to Svelte 5's new runes syntax and I have to be honest: not a big fan of the increased number of lines, especially when it comes to the props.
  2. Refactoring Svelte stores to $state runes Jan 18, 2025One pattern that I love to use in my SvelteKit projects is returning writable stores from the layout's load function. Can we migrate this to the new $state rune?
  3. Looking at Django task runners and queues Jan 24, 2025I use django-apscheduler to run a queue of scheduled tasks. Now I also need the ability to run one-off tasks and that turned out to not be so simple.
  4. Looking back at four years of Saga Jan 26, 2025I started building Saga, my own static site generator written in Swift, four years ago. Let's look at the state of the project.
  5. Saga... but in Python? Or TypeScript? Feb 05, 2025What would Saga look like if it were written in Python or TypeScript, rather than in Swift? Is it worth the effort to port Saga to another language?
  6. DocC and SPM need some love and attention from Apple Feb 20, 2025Apple's DocC project and the Swift Package Manager have been missing pretty crucial features for years now. It's time that Apple gave them some love and attention.
  7. uv just keeps on getting better Feb 24, 2025It's been three months since I migrated all my Python projects over to uv. And it's only gotten better! Let's look at two recent major improvements.
  8. Django Admin's handling of dates and times is very confusing Feb 26, 2025When you have admin users in multiple time zones, the way Django handles the input and display of dates and times is causing confusion. Here's how you can improve things.
  9. You probably don't need a CMS Apr 15, 2025Many people quickly reach for a big CMS package for Django, when often this is overkill. Here's how to use a simple Django model with a CKEditor 5 WYSIWYG field.
  10. Blocking PHP requests using CloudFlare's WAF rules Apr 28, 2025Webservers get hit by hundreds of thousands of requests to random (non-existing) PHP files. Let's block it using CloudFlare's WAF rules.
  11. Announcing drf-action-serializers Jun 03, 2025An easy way to use different serializers for different actions and request methods in Django REST Framework.
  12. Beyond htmx: building modern Django apps with Alpine AJAX Jun 11, 2025Ditch the complex SPA. Learn how to build modern, server-rendered Django apps using Alpine AJAX and the power of hypermedia.
  13. Make Django show dates and times in the visitor's local timezone Jun 12, 2025A solution for showing dates and times in your visitor's local timezone, all while handling the tricky first-visit problem.
  14. Garbage in, garbage out Jun 18, 2025You can't just say "make an app", you still need to know how to build a good app. AI might help with the code, but we're still the ones with the technical expertise and taste.
  15. Comparing three type systems: Python, TypeScript, and Swift Jun 19, 2025I recently ported Saga from Swift to both Python and TypeScript, giving me a direct comparison of three type systems.
  16. Production-ready cache-busting for Django and Tailwind CSS Jun 26, 2025I'm a big fan of the django-tailwind-cli package, but I ran into problems deploying it to production. Here's how to make sure you cache-bust tailwind.css.
  17. Hosting your Django sites with Coolify Jul 02, 2025How I moved my Django projects from a manual server setup to Coolify for easier, zero-downtime deployments.
  18. Handling static and media files in your Django app running on Coolify Jul 08, 2025Let's solve the challenge of serving media files for your Coolified Django site.
  19. Happy 20th birthday, Django Jul 16, 2025Django turned 20! A look back at my 16 years with it, my favorite packages, and what I'd love to see in the future.
  20. Django's internationalization settings are weird Jul 18, 2025It's way too difficult to make Django use a 24-hour clock while using American English. Luckily it's not impossible.
  21. Automate Python package releases Jul 30, 2025I maintain a handful of Python packages. Here's how I automate creating new releases, both on PyPI and GitHub.
  22. Announcing django-generic-notifications 1.0.0 Aug 02, 2025A modern, flexible rewrite of django-generic-notifications is here. Send website and email notifications, create digests, and group similar messages.
  23. How I write Django views Aug 28, 2025Why I only use Django's base View class instead of generic class-based views or function-based views.
  24. A quarter century of chasing simplicity Sep 08, 202525 years of building for the web, and why I keep choosing simplicity.
  25. One command to run them all Sep 09, 2025How I use the just command runner to create a simple, unified interface for running, testing, linting, and formatting all my projects, regardless of the tech stack.
  26. Run Django tests using PostgreSQL in GitHub Actions Oct 07, 2025Did you know that you can run unit tests for your Django app, in GitHub Actions, using PostgreSQL?
  27. Was async Django worth it? Oct 21, 2025Async Django is a huge technical achievement, but it solves a problem most sites simply don't have, while adding a lot of complexity.
  28. My one rule for side projects Oct 25, 2025Don't use the same tech stack as your day job, or you'll turn your side project into a second shift.
  29. Safe Django migrations without server errors Dec 01, 2025How to run schema-changing Django migrations safely, avoiding schema/code mismatches and server errors during rolling deploys.

2024 16

  1. Hardening a web server against script kiddies Jun 09, 2024Webservers get hit by hundreds of thousands of requests to random (non-existing) PHP files. Let's block them using UFW and fail2ban.
  2. SvelteKit architecture tip: return a writable store from your load function Jul 20, 2024How do you update content in real time when that content was fetched from the layout's load function?
  3. Extend Django's autocomplete widget actions Jul 22, 2024Extending Django's autocomplete widget with a new action which copies the linked user's email address to the clipboard.
  4. Changing the way Django 5.1 generates admin list labels Sep 16, 2024Django 5.1 adds related field lookup to the model admin's list_display, but with an annoying quirk. Let's fix that!
  5. Poetry versus uv Sep 17, 2024Comparing two Python package managers: Poetry and new kid on the block uv.
  6. Validate PayPal webhooks using Python Oct 01, 2024Paypal's documentation only shows a JavaScript example. How do you validate the webhooks in Python though?
  7. How I configure my Django projects Oct 02, 2024There are many ways to configure Django, like multiple settings files or .env files. Here's how I do it, using python-dotenv.
  8. Trying out PDM (and comparing it with Poetry and uv) Oct 04, 2024After comparing uv to Poetry, I am trying out PDM. On paper it combines all the best things of Poetry and uv, without their downsides. How does it hold up?
  9. Automatically deploy your site when you push the main branch Oct 23, 2024The best feature of Heroku is the ability to just push a branch, and it gets deployed. How do we replicate a workflow like that on our own server?
  10. Django REST Framework versus Django Ninja Oct 26, 2024Let's compare Django REST Framework with new kid on the block, Ninja.
  11. How to change MEDIA_URL for one FileField Oct 31, 2024I wanted to use a different MEDIA_URL for one of our FileField instances. It was very easy to do!
  12. Revisiting uv Nov 11, 2024Two months ago I compared Poetry with uv, and for me uv had significant drawbacks that kept me from switching over. The situation has changed quite a bit since then!
  13. Putting Svelte stores inside context for fun and profit Nov 12, 2024Solving problems by putting writable reactive stores in Svelte's context.
  14. How to migrate your Poetry project to uv Nov 18, 2024So, like me you've decided to switch from Poetry to uv, and now you're wondering how to actually migrate your pyproject.toml file? You've come to the right place!
  15. Svelte 5 sites don't work as expected in Safari 12 and 13 Dec 03, 2024Quite recently I upgraded a Svelte 4 project to Svelte 5, and soon afterwards I found some problems inside of Safari 12 and 13 that needed a tricky workaround.
  16. Why I still choose Django over Flask or FastAPI Dec 24, 2024I started using Django in 2009, and fifteen years later I am still a happy user. It's clear that Django is rather special.

2023 3

  1. Setting up a Debian 11 server for SvelteKit and Django Mar 04, 2023A complete how-to guide for setting up Debian from scratch, for SvelteKit and Django.
  2. Adding custom actions to the Django Admin Jul 20, 2023Let's add custom actions to Django's admin site - but to the change form, not the list view.
  3. Deleting anonymous users' baskets when their sessions expire Oct 25, 2023How do you delete baskets belonging to anonymous users when their sessions expire? It wasn't quite as simple as I thought.

2022 2

  1. SvelteKit architecture - the solution Apr 22, 2022Last August I wrote about trying to come up with the architecture for a SvelteKit app I was working on, and failing. I'm happy to say that I have found a solution for all my problems!
  2. SvelteKit session refactor Aug 23, 2022SvelteKit version 1.0.0-next.415 removed the session object and store. Refactoring my project wasn't very straightforward, let's go over the changes.

2021 21

  1. Mentee Question 1: UIKit or SwiftUI Jan 20, 2021My take on the very common question "What should I learn or focus on? UIKit or SwiftUI?"
  2. Mentee Question 2: How to get started Jan 21, 2021Resources for learning Swift and UIKit, what to build first, opinions on Unit Testing, and more.
  3. Looking at the static site generator Publish Jan 22, 2021I'm taking a look at the static site generator Publish, written in Swift.
  4. Swift generics and arrays Jan 27, 2021Working with generics in Swift becomes a headache when you want to put things in an array. Am I stuck with type erasure and type casting?
  5. Building my own static site generator, part 1: inspiration & goals Jan 30, 2021In part 1 of a series of articles I'm looking at the inspiration behind my static site generator Saga, now available on Github.
  6. Building my own static site generator, part 2: API design Jan 31, 2021Part 2, where I'm looking back at the current API of Saga.
  7. Building my own static site generator, part 3: thoughts so far Feb 02, 2021In the third and final part of this series about Saga I'm looking at the pros and cons of the current system and what I might want to change.
  8. Building my own static site generator, part 4: a complete redesign Feb 03, 2021An unexpectedly quick fourth article about Saga, after a complete redesign of the API.
  9. Building my own static site generator, part 5: replacing Ink and Splash Feb 08, 2021I've replaced the Ink and Splash dependencies with my own SwiftMarkdown package.
  10. Building my own static site generator, part 6: replacing SwiftMarkdown Feb 09, 2021I've already replaced my own SwiftMarkdown package...
  11. Building my own static site generator, part 7: updates & the road to 1.0.0 Feb 13, 2021In the past few days I've made some pretty substantial improvements to Saga, to make it work for me and my website, which is now built using Saga.
  12. A review of Markdown parsers for Swift Feb 17, 2021Comparing Parsley to Ink, Down, and MarkdownKit.
  13. Announcing tag-changelog: automate your changelog and GitHub releases Feb 20, 2021I've released a GitHub Action that automatically generates a changelog when you push a tag.
  14. Mentee Question 3: How to know when multiple publishers completed? Feb 22, 2021In JavaScript-world, it's really easy to know when multiple promises completed: just use Promise.all. How do you do the same thing in Combine?
  15. Mentee Question 4: When to use PassthroughSubject and CurrentValueSubject? Feb 25, 2021It's a question I asked myself too, when I just got started with Combine.
  16. Mentee Question 5: What's the deal with coordinators? Mar 10, 2021One of my mentees asked about the coordinator pattern: how to implement it, and what the big deal is about decoupling view controllers.
  17. My one big complaint working with Vapor 4 Jul 17, 2021I'm trying out Vapor 4 for a side project, and one thing that I am constantly running into is the amount of boilerplate and copy-pasted code. Are there no better solutions for this?
  18. Architecting a SvelteKit app - and failing Aug 15, 2021Trying to architect a SvelteKit app so that it does as few requests as possible, from a central place, so that all subpages have access to the content.
  19. Vapor 4 versus Django REST Framework Aug 26, 2021Over two years ago I wrote an article where I compared Vapor 3 to Django REST Framework. It's time for a rematch with Vapor 4.
  20. Saga 1.0.0 has been released Dec 12, 2021It's taken a little bit longer than I expected, but 1.0.0 has finally been released, with support for async readers and item processing functions.
  21. Working around HttpOnly cookie problems in SvelteKit Dec 25, 2021When HttpOnly cookies didn't work as expected in my SvelteKit project I had to find a workaround.

2020 9

  1. After Vapor and Django comes.. Firestore Jun 07, 2020I couldn't choose between Vapor and Django, and went with a third option.
  2. Clean up Firestore and Storage when deleting a document Jun 14, 2020When you delete a document in Firestore, its subcollections and their documents are not automatically recursively deleted. Here is a simple Cloud Function that takes care of it.
  3. Connecting Storekit to Firestore via Cloud Functions and webhooks Jun 15, 2020I've recently added subscriptions to my Critical Notes iOS app, using Apple's StoreKit. Here is how I hooked it all up to Firestore including server-side receipt validation.
  4. User subscriptions on the web Jun 20, 2020Comparing Stripe, Gumroad, Patreon, and Memberstack.
  5. A review of SwiftUI problems Jun 21, 2020I've been working with SwiftUI for almost half a year now I love a lot about it, but there are also so many bugs and issues that need workarounds that it's kind of maddening.
  6. Connecting Stripe to Firestore via Cloud Functions and webhooks Jun 26, 2020Since it was a bit of a puzzle to get it working, I am sharing my backend and frontend code.
  7. Book review: Practical Combine Jun 29, 2020Great book, and well worth the $25.
  8. Exploring two-way databinding solutions in UIKit Jul 10, 2020SwiftUI's @Binding property wrapper makes it easy to create two-way databindings, but in the UIKit world it's slightly less easy. Let's explore some solutions.
  9. Book review: Thinking in SwiftUI Sep 19, 2020A while ago I asked on Twitter which Swift-related book I should review next, and overwhelmingly Thinking in SwiftUI by the objc.io guys was chosen. An excellent choice!

2019 2

  1. Struggles with Vapor 3 Mar 20, 2019I'm building my first real side project since 2006, with the backend written in Swift using Vapor 3. My first impression was really positive, but then the struggles started to pile up.
  2. Vapor 3 versus Django REST Framework Apr 14, 2019As an exercise I rebuilt my entire Vapor 3 backend in Django REST Framework. Now that I have two more-or-less identical backends, it's time to compare.

2016 2

  1. Our front end stack one year later Jun 22, 2016One year after my front end research we've moved Sling to ES6, CommonJS modules, webpack, NPM scripts and a ton of unit tests. A look at everything that changed.
  2. Searching for a next gen back end Nov 24, 2016I want one endpoint where the client asks for the data it needs, plus real time updates without the manual hassle.

2015 3

  1. Researching front end tools, part 1: Ampersand.js, React, Webpack, PostCSS and ESLint May 17, 2015If I had to start a brand new webapp today, what would I use? In part 1 of my research I'm looking at Ampersand.js, React, Webpack, PostCSS and ESLint.
  2. Researching front end tools, part 2: Deku, page.js and cssnext May 31, 2015I liked React but wanted something smaller, so in part 2 I'm trying out Deku: pretty much the same, but 31 KB instead of 141. Plus page.js and cssnext.
  3. Researching front end tools, part 3: Angular & Webpack vs Browserify Jun 14, 2015Angular with Webpack, and then the same setup with Browserify. Falling down that particular rabbit hole made me appreciate Webpack's horrible config a whole lot more.

2013 4

  1. Apple's worst iOS framework: MediaPlayer Jan 29, 2013I thought the Scrobbler for iOS would be quite an easy app to create. Boy, was I wrong.
  2. iOS development: three years later May 20, 2013In April 2010 I started to work on my very first iPhone app. Looking back at the advances with the biggest impact since then, from ARC to modern Objective-C.
  3. Getting started with programming Jun 03, 2013My recommendation in a nutshell: begin with HTML and CSS, move on to Python and Django, and add Javascript.
  4. Review roundup: iOS debug tools and inspectors Jun 04, 2013Comparing PonyDebugger, Spark Inspector and Reveal. The 3d view inspectors are great, I just wish they added a network traffic monitor.

2011 2

  1. Django-CMS vs. FeinCMS vs. Mezzanine Jan 28, 2011Comparing the three biggest content management systems for Django. In my head I know Django-CMS is the better CMS, but Mezzanine just feels better.
  2. Django-CMS backend usability Jan 29, 2011Django-CMS might be the best CMS for Django on paper, but its admin interface has some real usability problems. Here's what I don't like, and a possible solution.

2010 4

  1. Getting started with iPhone app development Apr 21, 2010I tried to avoid Objective-C with PhoneGap and Appcelerator, but ended up having to learn it after all. These are the resources that really helped me.
  2. Book review: Head First iPhone Development May 16, 2010An easy to follow book that teaches you all the basics of iPhone development. It just never goes beyond those basics.
  3. Once again I turn to Appcelerator Nov 09, 2010The client wants an Android app too, and I don't know Java. So, back to Appcelerator it is. So far so good, but will it last?
  4. My thoughts after having completed my first Appcelerator project Dec 02, 2010Appcelerator is nice for pretty simple, low-profile apps. But if the budget allows for it, building two native apps will result in higher quality apps.

2009 3

  1. How to dynamically add fields to a Django model Nov 26, 2009It took me hours to get this to work, so to save you the time, here is the solution.
  2. Using the Google Visualization API in Django Nov 29, 2009How to feed Google's Visualization API from your own Django datasource, so your data is never sent to Google.
  3. Things I "hate" about Python and Django Dec 06, 2009After nine years of PHP I switched to Python and Django. I really love both, but there are a couple of things that are really bugging me.