A modern, flexible rewrite of django-generic-notifications is here. Easily send website and email notifications, create digests, group similar messages, and much more.
I maintain a handful of Python packages. Here’s how I automate creating new releases, both on PyPI and GitHub.
A dive into why Django's DATETIME_FORMAT setting seems to do nothing, and how to actually force the 24-hour clock in the admin, even when your locale says otherwise.
Celebrating Django's 20th birthday by looking back at 16 years of personal Django usage, how it evolved, favorite packages, and what I'd love to see in the future.
Let’s solve the challenge of serving media files for your Coolified Django site.
I often get my best coding inspiration late at night, and when I go to bed with an unsolved problem, I literally write lines of code in my dreams. It's exhausting but I usually wake up with the solution!
How I moved my Django projects from a manual server setup to Coolify for easier, zero-downtime deployments.
I'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.
Yesterday I installed the iOS 26 beta on my iPhone and today, for the first time ever, I’ve downgraded my iPhone back to the stable release.
I recently ported my static site generator Saga from Swift to both Python and TypeScript. It was a fascinating exercise in cognitive dissonance, especially when it came to their type systems. This is a tale of that experience.
Luckily for us, good developers are still necessary in the age of LLMs. You can't just say "make an app", you still need to know how to build a good app.
A robust, two-part solution for showing dates and times in your visitor’s local timezone, handling the tricky first-visit problem.
Ditch the complex SPA. Learn how to build modern, server-rendered Django apps using Alpine AJAX and the power of hypermedia.
With WWDC around the corner, I'm reflecting on why I've fallen out of love with Apple. After more than a decade of iOS development, the company's anti-developer stance, Swift's growing complexity, and the eroding software quality led me back to the open web.
Introducing ActionSerializerModelViewSet, a ViewSet that allows you to choose a serializer for each action and method combination.
Webservers get hit by hundreds of thousands of requests to random (non-existing) PHP files. Previously I dealt with this on the server level, now I’m doing it directly within CloudFlare.
Many 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, including embedded media like YouTube.
I love RSS feeds, but it’s not ideal that you’re stuck with all the articles that are in the feed. So I built RSSfilter.com, offering a way to filter the feed based on keywords and categories.
When 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.
It’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.
Apple’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.
What 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?
I started building Saga, my own static site generator written in Swift, four years ago. Let’s look at the state of the project.
I 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.
One 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?
I'm very busy 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.
It’s the last day of the year, just in time to write my now-customary year in review article. Does anyone actually read these, or am I just writing them for myself? It doesn’t really matter either way, as I mainly do write them for myself. I do enjoy looking back at previous years and see what has changed and what has stayed the same.
I started using Django in 2009, and fifteen years later I am still a happy user. When I compare this to the number of JavaScript frameworks I’ve gone through during the same fifteen years, it’s clear that Django is rather special.
Quite 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.
So, 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!
Solving problems by putting writable reactive stores in Svelte’s context.
Almost two months ago I compared Poetry with uv, and for me uv had some pretty significant drawbacks that kept me from switching over. The situation has changed quite a bit since then!
I wanted to use a different MEDIA_URL for one of our FileField instances. It was very easy to do!
Let’s compare Django REST Framework with new kid on the block, Ninja.
The 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?
After 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?
There are many ways to configure Django, like multiple settings files or .env files. Here’s how I do it.
Paypal’s documentation only shows a JavaScript example. How do you validate the webhooks in Python though?
I’ve added a comment section to the articles, powered by GitHub Discussions.
Comparing two Python package managers: Poetry and new kid on the block uv.
Django 5.1 adds related field lookup to the model admin’s list_display, but with an annoying quirk. Let’s fix that!
Extending Django’s autocomplete widget with a new action which copies the linked user’s email address to the clipboard.
How do you update content in real time when that content was fetched from the layout’s load function?
Webservers get hit by hundreds of thousands of requests to random (non-existing) PHP files. What can we do about this?
I bought the 12.9” iPad Pro with the Apple Pencil back in 2018 and spoiler alert: I still use the iPad almost every day.
In December of 2023 my girlfriend and I went on an eight day vacation to Iceland, where we wanted to rent a car and travel the south coast. This seemed like the perfect chance to try out living with an electric car, since the charging infrastructure in Iceland is very good, and their electricity very cheap. So we rented a Tesla model 3 and let’s just say I have some opinions.
Another year in review - even though it feels like I wrote the previous one not so long ago. Time flies and it’s flying faster and faster each and every year.
How do you delete baskets belonging to anonymous users when their sessions expires? It wasn't quite as simple as I thought.
Let's add custom actions to Django's admin site - but to the change form, not the list view.
I recently had to set up a brand new server for a website running on SvelteKit and its API running on Django. I am a software developer and setting up servers and hosting isn't something I normally do, so I followed a bunch of different tutorials. In this article I want to combine all these tutorials, mostly for future me, but hopefully you'll find it useful as well.
Another year flew by, I can't really believe it's already been a whole year since I wrote 2021 in review. A very busy and somewhat stressful year - although not for all the reasons I predicted a year ago.
SvelteKit 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.
Last 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!
Welcome to the end of 2021, a.k.a. the second year of the pandemic. Another year of not going abroad, barely seeing friends, playing Dungeons & Dragons via Zoom instead of at the table. A year of mild depression and feelings of loneliness. But also a year of hope when we all got access to the vaccines and when we didn't hear about Trump every day in the news. And last but not least: it was also a very productive year!
When HttpOnly cookies didn't work as expected in my SvelteKit project I had to find a workaround.
About ten months ago I wrote that I was confident that the API of Saga wasn't going to change a lot anymore, and that I'd release 1.0.0. Well, it's taken a little bit longer than I expected back then, but 1.0.0 has finally been released!
Over 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.
I was working 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. Sadly dealing with SSR makes it very hard to achieve my goals.
I'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?
Recently I was interviewed for the Russian IT website proglib.io. Since it might be interesting for non-Russian speakers, here it is in the original English version.
A new year, a new WWDC with once again new iOS, iPadOS, macOS and watchOS releases. If you ask me, I think yearly releases are overkill and really not necessary; I’d rather have Apple split off features like Weather, Maps, Notes and more into...
A few weeks while ago in my how to get started article I mentioned coordinators in the “What architecture should I use?” section, and how they allow you to decouple your view controllers from one another, and improve the way you can test your code....
That’s a great question! And actually one I asked myself too, when I just got started with Combine. Let’s first explain what PassthroughSubject and CurrentValueSubject are though. Subjects are a kind of publisher that you can subscribe to, but can...
In 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?
In a short time I’ve created 25 releases for my static site generator Saga. For each release I’ve manually updated the CHANGELOG.md file, which is a bit tedious and easy to forget. I really wanted to automate this using GitHub Actions, which I was...
A hugely important part of any static site generator is of course the parsing of Markdown content. The default parser for Saga is Parsley, a custom wrapper around a cmark fork. While I am generally quite happy with it, there are some problems.
In 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.
I've already replaced my own SwiftMarkdown package...
I've replaced the Ink and Splash dependencies with my own SwiftMarkdown package.
An unexpectedly quick fourth article about Saga, after a complete redesign of the API.
In 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.
Part 2, where I'm looking back at the current API of Saga.
In part 1 of a series of articles I'm looking at the inspiration behind my static site generator Saga, now available on Github.
I’m in the very early stages of building my own static site generator in Swift. I want the library to provide a basic Page type, that the user can then extend with custom metadata, and I need to be able to put Pages with different kinds of metadata...
I'm taking a look at the static site generator Publish, written in Swift.
Resources for learning Swift and UIKit, what to build first, opinions on Unit Testing, and more.
My take on the very common question "What should I learn or focus on? UIKit or SwiftUI?"
A 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!
With SwiftUI we have the @Binding property wrapper that makes it really easy to create a two-way databinding between a form field and a model, but in the UIKit world it's slightly less easy. Let's explore some solutions.
It's almost exactly 10 years since I wrote my last book review. Time flies! Also, it makes me realize that the way I've been learning has changed dramatically. I am much more guided by autocomplete and documentation within Xcode, and in-depth articles and videos about one particular topic, instead of reading books.
After adding subscriptions in iOS via Apple’s Storekit, I have now also added subscriptions to the web client of Critical Notes, using Stripe (even though they have some serious drawbacks at the moment). Since it was a bit of a puzzle to get it...
A quick review of the keynote and State of the Union talks. Let's see which of my wishes have been fulfilled, and which SwiftUI problems have been solved.
I've been working with SwiftUI for almost half a year now, and in that time I've learned a lot. I love a lot about it, but there are also so many bugs and issues that need workarounds that it's kind of maddening.
As I am reaching feature-completeness of my side project Critical Notes, I need to add paid subscriptions to it. Users can already subscribe in the iOS app, but of course not everyone uses iOS, so I need to build something for the web client too.
WWDC is just around the corner, and we're all waiting like little kids at Christmas to see what Apple is going to announce. Most of us also are hoping for specific changes, here are my top wishes.
I'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.
When 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.
Over a year ago I wrote that I started working on a brand new side project, and that I was building the backend for that project. I started with Vapor 3, then made the same backend in Django REST Framework, and couldn't really choose between the two...
A little while ago I wrote about starting a new side project, where I was using Vapor 3 to build the backend. My initial impressions were extremely positive, but I ended up running into a few issues that made working with the framework a little bit...
I am working on my very first “real” side project since 2006! Not counting a bunch of open source projects I started and maintained since 2006, no, I mean a real user-facing project with a backend, website, iOS app, the whole shebang. It’s been a...
It’s that time of year again to look back and reflect at everything you’ve done and achieved, and to make plans for the next year. 2016 was a pretty big year for me, both personally and professionally. In the end of August 2015 I moved back from...
A while ago I started to think: if I were to build a brand new web app plus back end today, what would I use for the back end, and how would the client talk to it? So far my APIs have been very standard REST affairs: endpoints per model that get/save...
A while ago I decided to get an Android smartphone. Sounds like a very simple decision right, but as somewhat of an Apple fanboy for many years, I kind of shocked myself with this decision. It all started with my desire to buy a smartwatch, and the...
One year ago I wrote my third article in a series where I researched front end tools, and with all that I learned I began to improve our front end stack at Sling. It’s the big Angular app that I wrote about, on which I’ve worked for 2.5 years now....
Since early 2014 I’ve been working on a pretty big and complex Angular app called Sling and sadly it’s not using any module system and it’s still using ES5 only. It uses Gulp to bundle and minify all the JavaScript, compile and minify our Less files,...
Two weeks ago I started my journey into researching front end tools, with the idea to find my ultimate stack of build tools, JavaScript frameworks and/or libraries, CSS processors, a code style to follow and code linter to enforce it, and finally...
Since early 2014 I’ve been building a fairly large and complex JavaScript app in AngularJS, using Less as the CSS pre-processor and Gulp as the build system. I haven’t used ES6 or modules so far, via Browserify or otherwise. While it works and...
Email is a huge part of my my life and I need a client that accommodates my ways and habits. It needs to be fast and user friendly. It needs to support multiple email accounts. And it needs to offer proper Google Mail support: archiving email by...
I have well over 35 GB of pictures, and after almost losing my hard drive (it started to behave very strangely but I was able to salvage all the pictures) I realised that I need to back them up in the cloud. I do usually share my best ones on...
All of a sudden it seems there’s a big effort to create debugging tools for iOS developers. Some are free, they all have different features… Time for a comparison. PonyDebugger “Remote network and data debugging for your native iOS app using Chrome...
At least twice per year someone will ask me how he or she can get started with programming. With the economy down jobs are hard to find, but there’s always a need for developers, at least here in Iceland - so it’s no wonder that more people are...
In April 2010 I started to work on my very first iPhone app. A new language, a new IDE, a completely new way of thinking about development (threads! memory! crashes!), it was very exciting. In these three years quite a lot has happened to us iOS...
I absolutely love open source software. I use all kinds of third party libraries for iOS for example (installed via the open source CocoaPods project of course), which makes my life as a developer a whole lot easier. And in return I open source some...
When I started to work on Last.fm’s Scrobbler for iOS, I though it would be quite an easy app to create. After all, it’s basically a couple of lists of artists, albums and tracks, and all actual music playback will be done using the MediaPlayer...
As a software developer, I use a lot of software and tools to help me in my job. In this post I’d like to list some of my most used software of the last year. Hopefully there are some gems that can help you as well! Xcode As an iOS developer, this...
On January 2 I moved to Iceland with two suitcases and a job contract. My new title: iOS developer at Gangverk, a small company creating iPhone- and Android apps for CBS in the United States. This was the beginning of an amazing year for me, both...
In an app I’m currently building, the client wants an Airplay button in the navigation bar, with a nice background like so: After trying some things, the solution seems to be to loop over the subviews. It feels a bit hacky, but works perfectly:...
In June 2010 Apple finally added multitasking to the iPhone (the iPad had to wait ’til November to get iOS version 4) and with this resolved one of my biggest complaints about the operating system. And while I really enjoy iOS on the iPhone and the...
Yesterday I wrote an article comparing Django-CMS, FeinCMS and Mezzanine. One of the conclusions was that while Django-CMS is the best CMS on paper, I don’t like its backend interface that much. I thought it would be a good idea to properly explain...
When you need a content management system for Django, there is enough choice. Maybe even too much: the very helpful site djangopackages.com lists 13. Some are mature and very feature-complete, while others are barely more than a basic model and a...
A while ago I set out to build my third mobile application. Only this time the client wanted not only an iPhone app, but one for Android too. So that’s why I turned to Appcelerator once again, after my failed first attempt. In case you don’t know...
After I decided to create iPhone apps using just the iPhone SDK and the Objective-C language, I’ve created two iPhone apps that are available in the Dutch App Store. Development for app number three has started today, but no longer will I be using...
In a previous article I wrote about some great online resources I found to get started with iPhone development. I read the C and Objective-C introductions, watched the first 12 or so episodes of the Stanford courses and did the assignments that went along with it. Well, at least I tried to do all the assignments, but they were not easy with just the information from the taped lectures. There is a ton of information in them, but are kind of boring to watch, and you don't learn that well from slides.
For a pretty long time I wanted to make an iPhone app, ever since the App Store opened really. But, I’ve never programmed for Mac OS, never done any C or C++ (let alone Objective-C). In fact, I’ve never created a desktop application, only working on...
A while ago I wrote that Goldmund, Wyldebeast & Wunderliebe is going start a new usability department. At the moment I am busy writing marketing texts and thinking about a new website for ourself. Last week I also looked for a nice tool for...
In my previous post Things I “hate” about Python and Django, I said that one of the things I “hate” about Django is its template language. While very easy to use and pretty extensible, it’s missing some important (and basic, to be honest) features...
I have been a PHP programmer for the last 9 years, and only in September of 2009 I switched to Python and the Django framework. While I really love the Python language and the Django framework (especially compared to something like the Zend PHP...
In a project I am working on, I need to show a lot of graphs and charts. Together with the client we chose to use the Visualization API by Google, which provides a Python library, offers many different kinds of charts and very important: the data is...
For a project I needed to create a Django model from a list of fields that were defined somewhere else. It took me hours to get this to work, so to save you the time, here is the solution: fields = ['field_a', 'field_b', 'field_c'] # the base model...