-
The kollektivavtal archive's moved back to GitHub
Made the decision this week to pull the plug on kollektivavtal.codeberg.page and move it back to kollektivavtal.github.io. Not an easy decision to make as I’d come to really love Codeberg.
-
Sentry Appreciation Post
It struck me recently that Sentry has been one of my fav dev tools for like a decade. The more I thought about it, the more I appreciated how impressive that is.
-
Time for a weird mouse to go with the weird keyboard
After more than ten happy years with my hand-built keyboard, when my trackpad battery began to die recently I was keen to replace it with something similar.
-
The new example.com is a great example of a Pause, Stop, Hide bug
The IANA put up a new version of example.com recently, and in doing so have unintentionally provided a useful example of a 2.2.2 Pause, Stop, Hide bug. I love a chance to dissect a common accessibility bug in a neutral public context like this, so let’s go.
-
Why I voted in favour of Codeberg’s AI policy
Codeberg was all over the tech news for a week or two this summer, after members voted to amend the terms of service to prohibit projects that mostly consist of code written by “generative AI”-tools. The debate that followed was surprisingly heated. I’m one of the majority of members who voted in favour of the amendment and I was really happy to see it pass.
-
Joining Forgejo’s Accessibility Team
If you go and look at TEAMS.md#accessibility in Forgejo’s governance repo today you’ll find my name there in the list. I’m very proud of this!
-
Next.js can’t handle Windows newlines in meta descriptions
Meta descriptions containing Windows-style \r\n newlines are broken in Next.js. When \r is present in a meta description, Next.js will render two <meta name="description"> tags instead of one, and each with slightly different content.
-
Returning to Jekyll
Tech choices for personal websites can feel very personal. For much of the 2010s, Jekyll was what I was using. It had come out of GitHub, and GitHub was cool so Jekyll was cool. Then at some point, Eleventy came along. Netlify were spending a lot of money to make “Jamstack” happen, and Jamstack was cool so Eleventy was cool.
-
Lessons learned from the Forgejo v15 release blocker
A pull request of mine recently needed to be reverted due to a visual bug in order to unblock the release of Forgejo version 15. This was about 10% embarrassing, 10% frustrating, and 80% really really interesting. I learned a whole bunch about Forgejo’s code and release process, as well as my own biases and focus areas to become a better contributor. It would be a good problem to have if more people like me came along to contribute and made mistakes like these. I figured I’d write down what I learned so that it’s easy to pay it forward.
-
Integrating the moon into your terminal
As I write this, a spaceship full of astronauts is flying around the moon for the first time in my life. They don’t even have a working toilet right now either so they’re all gasping for a piss while they do it. It’s all very exciting.
-
Accessing localhost:3000 in VirtualBox for NVDA testing on macOS
After getting my JAWS setup in place recently, NVDA was next on the agenda. It was easy enough to install, which left me with enough leftover time and energy to make an attempt at loading http://localhost:3000 on it in order to be able to test unmerged changes. It went better than expected!
-
Inspecting HTML elements that disappear on blur
Web accessibility is mostly about HTML, I reckon. Tons of the bugs you work on end up being about adding or removing some attribute from an element. So the inspect element tool is a really important part of the toolkit. And most of the time you don’t even have to think about it: just ⌘⇧C, click on the element you’re curious about, and you’re in business.
-
Testing in JAWS on a Mac
A tricky-looking screen reader bug in Forgejo inspired me to spin up a JAWS testing environment on my Mac.
-
Do you really need those line-clamps and nowraps?
After getting my first Forgejo PR merged today I was struck by the realisation that I finally have a linkable public example of a type of accessibility bugfix that’s been a recurring thing for years across basically every site and app I’ve ever worked on. So I can finally get this off my chest. Everyone’s CSS is full of line-clamps and nowraps that serve little to no practical purpose, and prevent visually impaired users from accessing content.
-
Assigned Mail At Birth
A mailwoman in the US was receiving orthopedic treatment for issues relating to the physical demands of her job. There’s a lot of lifting, carrying, and walking involved in delivering mail, which can lead to pain and inflammation. One day, when checking her medical documentation, she noticed the orthopedist had suddenly and incorrectly reregistered her as a transgender person.
-
Oblong of Dreams
I first discovered Half Man Half Biscuit while living in Bristol and working on the music search UI at MixRadio. You type a lot of test search queries when you’re building a search form. It inevitably becomes swear words, which is how I stumbled on National Shite Day.
-
Golang LSP in Helix on macOS
Since getting my Forgejo dev environment running I’ve begun poking around the issue backlog and learning my way around the code, looking for the stepping stones to becoming a contributor. One important early milestone was to get the Golang LSP running in Helix.
-
Restoring an old 80's boombox
We picked up this gorgeous Philips D8569 boombox from 1982 at a second-hand place recently.
-
Running a Forgejo dev environment
Been wanting to get started making code contributions to Codeberg for the longest time. Finally got around to setting up a local development environment. Here’s my notes!
-
The software job market is going to split in two
Found myself in Backagården once again this weekend, building software for the international left. This has been a bit of a happy place for me for some time now. This weekend bought a surprise happiness bonus, when I realised how much fun I was having coding without access to my employer-provided Opus 4.5 subscription.
-
Our NES needed a new 72 pin connector
Although thoroughly cleaning our new NES the other day was enough to get it booting Super Mario Bros, it wasn’t reliable enough. On a bad day it could take five minutes of fiddling with the position of the cartridge and resetting the console to get the game running.
-
I got a commit merged into Helix!
After building lazyrename a couple of months ago I got curious about small ways of improving Helix’s built-in file moving functionality. The conclusion I came to was that a fs::create_dir_all() call would make a big difference all on its own, and so I set out to get that added. The pull request finally got merged this week, which I’m really excited about.
-
Repairing an old NES
Spotting a dirt cheap CRT television in a second hand shop in Trelleborg last weekend set in motion a chain of events that led to a Nintendo and a copy of Super Mario Bros arriving in the mail. Only thing is, none of it bloody worked. I got the old flashing red light when turning it on, and once blowing in the cartridge didn’t sort it I was out of ideas. Fortunately I found a very helpful YouTube video that walked me through fixing it.
-
The new Swedish citizenship requirements
About six years ago I became a Swedish citizen. I’d been in the country around four years at the time. Being married to a Swedish citizen allowed it to happen early enough that Brexit never actually cost me my EU citizenship. Pretty nice! But if the new rules being introduced this year had applied back then I think I’d still be waiting today.
-
The 2G and 3G network shutdown in Sweden is kind of a fiasco
My Nokia 2660 is being forcibly disconnected next week due to the shutdown of the 2G and 3G mobile networks in Sweden. It does support 4G VoLTE, but there’s some kind of technicality about making emergency calls over 4G that the operator claims it falls short of compliance with.
-
C# LSP in Helix on macOS
Found myself writing C# in Helix on macOS a bit lately. Weird combination. It took a moment to tweak things so that it all plays nice together.
-
Minneapolis can happen in Malmö
The violent repression of the population of Minneapolis has been horrifying. It feels unreal, like the news in an apocalyptic movie. And from the Swedish perspective there’s a dangerous tendency towards exceptionalism that makes people underestimate the potential for it to happen here.
-
PICO-8 language server for Helix
Been working on this one PICO-8 game on and off for like five years now. Having switched to Helix since the last time I touched it, I needed to set up the PICO-8 language server for Helix first. It felt like nobody had glued together this combination of tools before.
-
Ten Years of Sweden
This year I’ll have been living in Sweden for ten years. That’s a full quarter of my life. So when I found myself on a Stockholm trip this month I took the opportunity to stay in the same hotel as I did the very first night I spent here ten years ago.
-
"default_agent": "plan"
Pushed my first AI tool config to my dotfiles repo this week. It was config for OpenCode, and it looks like this.
-
Telia is holding my phone number hostage
In late November I got an email from Comviq warning me that my beloved Nokia 2660 will be blocked from their network in early 2026 due to the shutdown of their 2G and 3G networks. As I’d only had the phone for about five months I decided it was better to move to an operator whose network still supports it rather than replace it. So I immediately started the process of moving my number to Telia. Big mistake.
-
Lyme disease cured my caffeine addiction
Had a real bastard of a headache the other day in Hemköp. So bad I had to leave the store and go chill outside, away from the bright fluorescent lights. Almost migraine territory.
-
What Happens If You Press X In Helix In A Zellij Pane Running In Alacritty
One of the little things that inspired me to learn some Rust was the realisation that suddenly all the tools I’m using every day are built with it. In particular, Alacritty, Zellij and Helix are the bedrock of my workflow and they’re all written in Rust.
-
lazyrename for Helix and Zellij
Earlier today I finally expelled a happy rant about Helix and Zellij that’s been building up inside of me for weeks. And the instant it was out of me I was itching to get the ball rolling on a tool I’ve been needing in this cosy little ecosystem. In a few stolen moments of coding here and there throughout the day I’ve managed to implement a rudimentary 0.0.0 version of a new tool I’m calling lazyrename.
-
Zellij and Helix together might actually be just plain better than Neovim
For starters Helix is a masterpiece. Imagine Neovim with telescope, lspconfig, lspsaga, gitsigns, and which-key all built-in. It’s a finished piece of software as far as I’m concerned. The maintainers could permanently feature freeze it today and I’d be happy. They’re shipping a plugin engine soon and I almost wish they wouldn’t.
-
Copy relative path to file in Helix
In recent weeks I’ve accidentally migrated from Neovim to Helix. I say “accidentally” because I wasn’t really intending to switch. There was a post on Lobste.rs called “Notes on switching to Helix from vim” that I read about a month ago, which inspired me to give Helix a bit of a try. My expectation had been that it’d be an interesting experiment but instead I found myself choosing to use Helix all the time.
-
Coders & Organizers 2025
Back down to earth with a bump today after an amazing weekend attending the Coders & Organizers meetup here in Malmö. Difficult to readjust back to everyday life after such an inspiring and productive experience.
-
Zellij Cheatsheet
Over the last couple of months Zellij has become one of my favourite everyday tools. I’m at a point now where I don’t want to be configuring stuff with millions of custom keybindings. Instead I want something that works already out of the box. Zellij is that.
-
Give me lava chicken or give me death
Rasmus Fleischer made an interesting appeal earlier today.
-
The future of open source is democratic, community-led and non-profit
I’m so fucking bored of companies.
-
My smartphone was making me fat
It’s been about five months now since I stopped carrying a smartphone. Recently my BMI re-entered the “healthy” range for the first time in about five years. I’m pretty convinced the two are connected and here’s why.
-
Rosa Luxemburg predicted the AI crash and its consequences in 1913
The Accumulation of Capital is a book from 1913 by Rosa Luxemburg which predicts the collapse of the AI bubble. Cool, right?
-
The Tinder Box is a Morrowind Let's Play
When I was little my grandad used to read me this book called The Tinder Box. I got hold of a copy a few years back in order to have something with some nostalgic value in the bedtime story rotation. I’ve been reading it quite frequently ever since.
-
Glory Days Or Bust
The road back to my coding happy place, i.e. a terminal emulator running Vim.
-
Democracy Kicks Ass
Contrasting the sense of helplessness about Microsoft's agenda for GitHub with the community-led democracy of Codeberg.
-
Notes from three months without carrying a smartphone
Got a Nokia 2660 for my birthday a few months back. Looks like this.
-
Nine Nine Six
-
Life after streaming
Been a lot of buzz about getting off Spotify due to the military industrial profiteering. It’s fair enough, but I’d like to encourage people to treat it as an opportunity to upgrade their relationship with music rather than just installing a competing app and trying to carry on as before. I uninstalled that app myself a while ago for other reasons and tried a bunch of the competitors for a while before coming to this conclusion. Maybe I can save you wasting a bunch of time pissing around with importing and exporting playlists over and over.
-
Voting on Codeberg's new privacy policy
Nobody cares about privacy policies. Except when they do.
-
Is metadata streaming really SEO armageddon?
I don't like some of these silly Rube Goldberg additions to Next.js either but I do think this one at least works as described.
-
Ubuntu 25.04 on a 2014 Macbook Air
The old MacBook Air I’d been running k8s on had become a bit problematic. The battery’s gone very bad, and newer versions of macOS have begun to run very poorly on it. After macOS Tahoe, Apple’s ending support for these old Intel Macs completely too. Time to make a change!
-
A GDPR bundled consent success story
A few weeks ago the Swedish government announced a new AI initiative called the Swedish AI Reform. It’s about providing free access to AI tools to Sweden’s non-profit and public sector workers. A decent idea, I thought, and my curiosity led me to click through and scope out the onboarding flow.
-
The Swan
Every summer in Malmö a family of swans nests on the canal. Watching the parent swans chase boats full of drunk tourists is a bit of a local pastime. Recently went for a pedal boat ride on that same canal and was handed this wonderful bit of accidental poetry by the operators of the pedal boat hire company.
-
IAAP EU Interview
Archive copy of an interview with IAAP EU
-
Immigrants in Tech Oppose Tighter Citizenship Rules
Got hold of a link to this open letter just now. It’s titled Immigrants in Tech Oppose Tighter Citizenship Rules and it’s worth a look. If you moved to Sweden for a tech job you might want to think about signing it. I sure have.
-
The Week 12 Boycott
There’s a nationwide boycott of big supermarket chains this week in Sweden and it’s been great fun. Probably the only downside has been all the tedious opinion pieces criticising it.
-
Survival Mode
Stopped using Copilot outside of work a few weeks ago. Coding’s begun to feel fun again since making that change. I hadn’t even noticed the disappearance of that joy until it started coming back either.
-
Onshoring My DNS
I was arsehole deep in American domain name services, I recently noticed. Between Verisign, Tucows and Cloudflare I had rigged my digital identity to blow in the event of any number of increasingly plausible crisis scenarios. I chose to own this mistake and begin the work of fixing it.
-
Codeberg Is The Future
GitHub’s been my most-used digital service for years. Even interviewed (unsuccessfully) there once. To some extent it had become an online “home” for me. You know that feeling when you’ve lived in the same place long enough that you can walk into the bathroom in the dead of night and hit the light switch on your first try with one effortless flick of your arm? That’s been my relationship with GitHub.
-
Shutting down 666a
Since October 31st 2023 I’ve been providing a work environment email service called 666a. On March 31st 2025 it’s shutting down. Today I’m beginning the process of winding it down gently, and I wanted to post something explaining that process and why it’s happening.
-
Accidentally Sending Too Many HTTP Requests
This was originally posted at https://666a.se/news/accidentally-sending-too-many-http-requests and has been migrated here since for long-term hosting.
-
Using AI to help humans translate Swedish labour laws
Over on 666a I provide English translations of Swedish labour laws. For the most part these are based on some translated PDFs that the Swedish government sometimes publish. The government update the laws more frequently than they update the translations though. Providing an up to date resource here meant updating the translations myself, which is a challenging problem.
-
“All we know about is computers”
-
Kubernetes homelab on an old MacBook Air
-
Ergodox, Ten Years Later
-
Goodbye Jane
-
All laws now up to date!
This was originally posted at https://666a.se/news/all-laws-now-up-to-date and has been migrated here since for long-term hosting.
-
Let's update the English translation of the Work Environment Act
This was originally posted at https://666a.se/news/lets-update-the-english-translation-of-the-work-environment-act and has been migrated here since for long-term hosting.
-
We maxed out Sendgrid's free tier
This was originally posted at https://666a.se/news/we-maxed-out-sendgrids-free-tier and has been migrated here since for long-term hosting.
-
About Arbetsmiljöverket's New Webdiarium
This was originally posted at https://666a.se/news/about-arbetsmiljoverkets-new-webdiarium and has been migrated here since for long-term hosting.
-
Eurovision Tourists Go Home
My perspective on Eurovision 2024 as a resident of Malmö
-
Can't Buy Me Love
It’s tax declaration season in Sweden, and I found out I owe an additional 15000kr of income tax for 2023. Ouch! As far as I can tell, it’s a side effect of how quickly I found work after the redundancy last year. I managed to start a new job while still in the old one’s notice period, which meant I got two salaries for a little while, and I think that screwed up the preliminary tax deductions.
-
10 Years Of Global Thermonuclear War
It’s coming up on the tenth anniversary of the release of my infamous global thermonuclear war game. It’s been offline for longer than it was ever online now. I want to get the story of this thing and its general context in my life & career written down and posted in time for the ten year milestone, so here it is.
-
Tailbone: Disk 2
-
Stabilizing Zetkin's Playwright Tests
Reducing end-to-end test flakiness in a real-world open source app.
-
Fixing 666a (again)
So apparently 666a is still capable of surprising me. A few months ago I wrote about the work I’d done to address an issue I’ve been calling “document lag”. Since then, I’ve continued to keep a constant eye on the system’s reliability. This week, something new cropped up.
-
Atuin and chezmoi are the dog's bollocks
My dotfiles repo is the oldest one I still have. Its first commit is from 2012. The message I wrote for that commit tells a familiar story.
-
This Machine Kills Fascists
Really cool photo from a bit of a depressing Arbetsvärlden interview I did.
-
Screencasting Secrets
Screencasting is my secret weapon as a remote software engineer. I’m one of those people who just wants to go fast all the time, and you get to move a lot faster once you get good at showing people what you’ve made and putting them at ease about the idea of shipping it. At any job, one of the most common questions I hear is “How do you do all those GIFs and videos and screenshots and stuff?”. Here’s how.
-
Maining VSCode Terminal
Once upon a time, the main tools I used for work were Vim and tmux. And until recently, once every few months I’d get this compulsive urge to try to recapture those glory days. If you know, you know.. That urge has stopped lately though. Visual Studio Code has reached a tipping point where the Vim support and terminal emulator are a better package than anything I can hack together with lua plugins and tmux config.
-
Zetkin Quote
Zetkin have been doing little interviews with some of the volunteers lately.
-
Night Work, Tech, And Swedish Labour Law
This was originally posted at https://666a.se/news/night-work-tech-and-swedish-labour-law and has been migrated here since for long-term hosting.
-
My SQLite in production epiphany
My work environment email alerts service – 666a – is a Rails app using SQLite for its production database. I’m super happy with this stack, but it wasn’t an obvious choice from the start, and I know a lot of folks still haven’t heard the growing hype about using SQLite in production in the Rails community. Here’s how I ended up shipping a production app with a SQLite database, and how it helped me rediscover some joy in full-stack work.
-
Operating 666a
In the final quarter of 2023 I launched my little side project 666a, which is a service providing work environment email notifications for union reps and people like that. It took a few months of work to build something shippable, and I’ve been refining it ever since to increase its reliability. I thought it’d be nice to share a glimpse of what that refinement work looks like. This is gonna be a technical one, so apologies to anyone who preferred the union propaganda.
-
Sam's Boat
-
It won't grow if you don't delegate
The first time I read It won’t grow if you don’t delegate, I was at Vänsterpartiet Malmö’s studier för förändring course at Kvarnby folkhögskola. It had been translated into Swedish and printed onto paper, and it was all very exciting.
-
Incident Report
This was originally posted at https://666a.se/news/incident-report and has been migrated here since for long-term hosting.
-
You Dumb Son Of A Bitch
-
English translations of Swedish laws
This was originally posted at https://666a.se/news/english-translations-of-swedish-laws and has been migrated here since for long-term hosting.
-
Announcing 666a
This was originally posted at https://666a.se/news/launch-announcement and has been migrated here since for long-term hosting.
-
Almedalsveckan 2023
A happy photo from a magical day in Visby.
-
Negotiation Petition Sent
Big milestone in the campaign.
-
Malmö Live
-
Spotify Workers Logo
Little bit of graphic design work I did for the Spotify campaign.
-
My CPWA Experience
2022 was the year my dream of getting more into accessibility finally came true. While I was studying for the IAAP certifications I was surprised by how valuable I found other people’s accounts of how they studied for them. I promised myself I’d contribute back to that if I passed the exams. And I passed, so here’s what I did!
-
Use Your Hammer, Shithouse
-
Unions Are For Us
Yes even us
-
Squad, Tribe, Union
A new kind of scaling for a new kind of decade.
-
Why A Collective Agreement
If you don't hear boss music playing right now, maybe you aren't listening.
-
#kollektivavtal
This is a full archive copy of the inaugural post I wrote for the #kollektivavtal Slack channel at Spotify. On November 14, 2022 I created this channel and then copypasted in this pre-written text to try to start it off on the right foot.
-
Passport Hacking
The passport system in Sweden collapsed earlier this year when pandemic travel restrictions lifted and half the country tried to renew their passports at once. In March I tried to book an appointment to get passports for the kids so they could visit their extended family for the first time. The date I got was in October.
-
Tailbone Instructions
Jump
-
Sequencer VoiceOver Demo
Retrofitted this drum sequencer UI with some accessibility improvements. Particularly proud of how the use of “bars”, “beats” and “cells” in the ARIA labels makes it possible to perceive a data structure that was previously only represented visually via varying amounts of blank space.
-
Island Village
-
Boomshak
-
moonrise
-
hivernal
-
doomfire
-
itsy studio
-
Natural Cycles Animation
-
Högdalen
-
Home
-
OK Google Say Hey Siri Tell Me My Name
-
Spotify Boilerplate App
-
Guillotine
-
Rap do Bonde
-
Manhattan Trump Protest
-
No Cigar
-
Lost in space
Simulating gravity has made all the other space-related code I’ve written so far for this project seem easy. This has been one of those demoralising problems that you think you’ve solved until you try a new test scenario and suddenly you’re back at square one because it turns out it was never really working right at all. For a good while I genuinely didn’t think I was going to be able to make it work at all.
-
Scalable spacetime
After building last week’s Solar System renderer, I was excited to move on to the fun stuff and see some planets moving around. I rushed on into implementing motion, which on the face of it is pretty simple. If Earth is moving along at 30,000m/s, for example, then you can just add its velocity to its current position once per second and get its new location.
-
Apple Pie From Scratch
This is a quick write-up of my solution to one of the first problems I bumped into in my latest project. I’m building a JavaScript model of the solar system, which in the end will hopefully feature all the planets orbiting the Sun according to some approximation of Newtonian gravity.
-
DownloadHelper Source
-
Gaming's Persecution Complex
I watched a shit documentary recently. It was called Video Games: The Movie. The central theme was a kind of chronological look back through the history of the gaming industry, which turned out to be a goldmine of little video clips of games from decades ago. That part was alright. As a plain nostalgia session, it was okay. Alongside that, though, was this weird little parallel story about “gamers”.
-
That Weird Keyboard
At the start of 2014 I started to pay the price for years and years of typing. A horrible RSI was causing shooting pains in my wrists by mid-afternoon each day. Something had to change, but obviously not typing any more wasn’t an option. The solution I settled on was an ergonomic keyboard, specifically the Ergodox.
-
Monty Is Wrong
Last Friday, at All Your Base 2014, MySQL creator Monty Widenius said some controversial stuff about women. There was a lot of backlash.
-
I am not planning any nuclear attacks
I recently wrote about a strange phone call that I received from the letting agents in charge of the house I live in. They’d recently carried out a routine visual inspection of the house, and were concerned about my whiteboard diagrams for a game idea I’d been working on.
-
The time I got caught planning a nuclear attack on the USA
I missed a phone call at work from my landlord this week. Landlord phone calls are scary. “Our rent payment probably hasn’t gone out or something”, I began to worry. I tend to panic quickly. “Shit, I bet it failed because our bank account is empty. Somebody’s gotten in and emptied out all our money. Fuck.” Fearing the worst, I phoned back straight away to check what was up.
-
Code I Like: Twig Loaders
The Twig templating library for PHP is really quite a nice piece of software. In terms of external quality, it’s stable, open source, actively maintained, and well documented. I’ve been lucky enough to spend some time at work exploring its internals from time to time over the last 12 months or so, and I’ve found the internal quality to be equally high. It’s a pleasure to work with code that has been properly looked after.
-
Monkeypatches broke my build
The prevalence of monkey patching as a Ruby development practice is a complete pain in the arse. Sure, some of Ruby’s expressiveness as a tool for building DSLs is derived from the ability to monkey patch things like 10.days.ago into the core classes. Admittedly, I occasionally indulge my sweet tooth at the Rails all-you-can-eat syntactic sugar buffet. But it’s not my favourite approach to software development by a long shot.
-
Debian Squeeze Vagrant Base Box
In an effort to suck less at dealing with all the various sysadmin-related tasks that come hand-in-hand with being a web developer, I’m learning my way around Vagrant and Chef.
-
switch (true)
A while ago I learned a quirky little programming trick which has occasionally come in handy. It’s something I picked up from some random blog post about ‘cool programming tricks’ that I can no longer find. It involves the switch statement, which is fairly universal in programming languages and normally looks like this:
-
Planarity
-
Alpine Storage
-
University Group Project