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.| Loopwerk
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.| Loopwerk
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 separately updated apps, and have less frequent and bigger OS updates where there is less focus on Apple’s apps, since they wouldn’t be part of the OS anymore.| Loopwerk
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. Yesterday one of my mentees asked about the coordinator pattern: how to implement it, how to deal with various scenarios, and what the big deal is about decoupling view controllers.| Loopwerk
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 CurrentValueSubjectare though.| Loopwerk
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 already using to automatically run unit tests on every commit to the main branch, and for every pull request. I searched the GitHub Marketplace for Actions that would suit my needs, but sadly couldn’t find any.| Loopwerk
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 into one array, which currently does work:| Loopwerk
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).| Loopwerk
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 of a struggle. The conclusion of that article was that I didn’t know how to continue: stick with Vapor 3 despite the problems I was having, or switch to Python.| Loopwerk
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 while actually since I wrote a whole backend from scratch and where I used to default to Python for this, since 2016 I’ve spent 95% of my time doing Swift. Now that there are multiple “Swift on the server” frameworks available, I decided ...| Loopwerk
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.| Loopwerk
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 info from/to a database, with a separate websocket server to deliver real time updates to the client. But we all know the main problem with this: the amount of endpoints keeps on growing as features get added or different clients have different d...| Loopwerk
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.| Loopwerk
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. Back then we used Gulp, Bower and Less. No modules, no ES6, barely any unit tests. We still use Angular 1.x, but a lot has changed in the last 12 months!| Loopwerk
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, add Angular injection annotations to our code, start a webserver with live reloading functionality, watches the source for changes and so on. It actually works really well but after doing the previoustwo experiments that use modules, ES6 an...| Loopwerk
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 testing tools.| Loopwerk
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 overall I’m pretty happy with Angular and the architecture of the app, I am very interested in what else is out there. Not in the least because Angular 1 is going the way of the dodo and the JavaScript world is moving very fast. It seems like a ne...| Loopwerk
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 default and using the correct labels for Sent mail and Trash for example.| Loopwerk
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 Facebook, but I need a solution that backs up every picture (full-resolution with all its metadata intact) without ever thinking about it.| Loopwerk
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.| www.loopwerk.io
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.| Loopwerk
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.| www.loopwerk.io
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?| Loopwerk
I started building Saga, my own static site generator written in Swift, four years ago. Let’s look at the state of the project.| Loopwerk
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.| www.loopwerk.io
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?| www.loopwerk.io
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.| Loopwerk
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.| Loopwerk
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.| www.loopwerk.io
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.| www.loopwerk.io
Solving problems by putting writable reactive stores in Svelte’s context.| Loopwerk
I wanted to use a different MEDIA_URL for one of our FileField instances. It was very easy to do!| Loopwerk
Let’s compare Django REST Framework with new kid on the block, Ninja.| Loopwerk
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?| Loopwerk
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?| Loopwerk
There are many ways to configure Django, like multiple settings files or .env files. Here’s how I do it.| Loopwerk
Paypal’s documentation only shows a JavaScript example. How do you validate the webhooks in Python though?| Loopwerk
I’ve added a comment section to the articles, powered by GitHub Discussions.| Loopwerk
Django 5.1 adds related field lookup to the model admin’s list_display, but with an annoying quirk. Let’s fix that!| Loopwerk
Extending Django’s autocomplete widget with a new action which copies the linked user’s email address to the clipboard.| Loopwerk
How do you update content in real time when that content was fetched from the layout’s load function?| Loopwerk
Webservers get hit by hundreds of thousands of requests to random (non-existing) PHP files. What can we do about this?| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
How do you delete baskets belonging to anonymous users when their sessions expires? It wasn't quite as simple as I thought.| Loopwerk
Let's add custom actions to Django's admin site - but to the change form, not the list view.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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!| Loopwerk
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!| Loopwerk
When HttpOnly cookies didn't work as expected in my SvelteKit project I had to find a workaround.| Loopwerk
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!| Loopwerk
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.| Loopwerk
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.| Loopwerk
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?| Loopwerk
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.| Loopwerk
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?| Loopwerk
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.| Loopwerk
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.| Loopwerk
I've already replaced my own SwiftMarkdown package...| Loopwerk
I've replaced the Ink and Splash dependencies with my own SwiftMarkdown package.| Loopwerk
An unexpectedly quick fourth article about Saga, after a complete redesign of the API.| Loopwerk
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.| Loopwerk
Part 2, where I'm looking back at the current API of Saga.| Loopwerk
In part 1 of a series of articles I'm looking at the inspiration behind my static site generator Saga, now available on Github.| Loopwerk
I'm taking a look at the static site generator Publish, written in Swift.| Loopwerk
Resources for learning Swift and UIKit, what to build first, opinions on Unit Testing, and more.| Loopwerk
My take on the very common question "What should I learn or focus on? UIKit or SwiftUI?"| Loopwerk
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!| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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.| Loopwerk
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...| Loopwerk
Comparing two Python package managers: Poetry and new kid on the block uv.| www.loopwerk.io
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!| www.loopwerk.io
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!| www.loopwerk.io