Blog

May 15, 2026

Add an LLM policy for rust-lang/rust

May 01, 2026

I can't cancel GitHub Copilot

April 21, 2026

Addressing the harassment

April 19, 2026

Rewrote my blog with Zine

April 06, 2026

The Future of Everything is Lies, I Guess

March 28, 2026

tar: a slop-free alternative to rsync

March 25, 2026

A eulogy for Vim

January 29, 2026

The cults of TDD and GenAI

January 12, 2026

Redesigning my microkernel from the ground up

November 08, 2025

OpenAI employees… are you okay?

October 22, 2025

What's up with FUTO?

September 24, 2025

Cloudflare bankrolls fascists

September 17, 2025

A better future for JavaScript that won't happen

August 20, 2025

Embedding Wren in Hare

August 08, 2025

What's new with Himitsu 0.9?

June 30, 2025

Just speak the truth

June 09, 2025

Unionize or die

May 05, 2025

The British Airways position on various border disputes

April 20, 2025

Resistance from the tech sector

April 04, 2025

A Firefox addon for putting prices into perspective

March 27, 2025

Using linkhut to signal-boost my bookmarks

March 17, 2025

Please stop externalizing your costs directly into my face

February 13, 2025

A holistic perspective on intellectual property, part 1

January 23, 2025

Join us to discuss transparency and governance at FOSDEM '25

January 20, 2025

FOSDEM '25 protest

January 16, 2025

No billionaires at FOSDEM

September 25, 2024

Neurodivergence and accountability in free software

August 30, 2024

Rust for Linux revisited

July 16, 2024

So you want to compete with or replace open source

May 24, 2024

Writing a Unix clone in about a month

April 19, 2024

Copyleft licenses are not “restrictive”

April 09, 2024

FDO's conduct enforcement actions regarding Vaxry

December 26, 2023

Why Prusa is floundering, and how you can avoid their fate

November 25, 2023

Richard Stallman's political discourse on sex

November 09, 2023

Can I be on your podcast?

October 31, 2023

On "real name" policies

October 13, 2023

Going off-script

September 29, 2023

The forbidden topics

September 17, 2023

Hyprland is a toxic community

August 29, 2023

AI crap

August 09, 2023

Hello from Ares!

July 31, 2023

The rc shell and its excellent handling of whitespace

July 25, 2023

Alpine Linux does not make the news

July 04, 2023

Seriously, don't sign a CLA

June 30, 2023

Social media and "parasocial media"

June 29, 2023

Burnout and the quiet failures of the hacker community

June 19, 2023

Reforming the free software message

June 16, 2023

Throwing in the towel on mobile Linux

June 12, 2023

How to go to war with your employer

May 01, 2023

Burnout

April 24, 2023

Who should lead us?

April 18, 2023

rc: a new shell for Unix

April 11, 2023

The Free Software Foundation is dying

April 08, 2023

Writing Helios drivers in the Mercury driver environment

March 09, 2023

When to comment that code

February 20, 2023

Porting Helios to aarch64 for my FOSDEM talk, part one

January 30, 2023

Should private platforms engage in censorship?

January 24, 2023

My plans at FOSDEM: SourceHut, Hare, and Helios

January 22, 2023

Setting a new focus for my blog

December 01, 2022

I shall toil at a reduced volume

November 26, 2022

Codegen in Hare v2

November 12, 2022

In praise of Plan 9

October 27, 2022

Notes from kernel hacking in Hare, part 3: serial driver

October 18, 2022

TOTP for 2FA is incredibly easy to implement. So what's your excuse?

October 15, 2022

Status update, October 2022

October 12, 2022

In praise of ffmpeg

October 03, 2022

Does Rust belong in the Linux kernel?

October 02, 2022

Notes from kernel hacking in Hare, part 2: multi-threading

September 16, 2022

The phrase "open source" (still) matters

September 15, 2022

Status update, September 2022

September 07, 2022

Notes from kernel hacking in Hare, part 1

September 02, 2022

In praise of qemu

August 28, 2022

powerctl: A small case study in Hare for systems programming

August 25, 2022

A review of postmarketOS on the Xiaomi Poco F1

August 18, 2022

PINE64 has let its community down

August 16, 2022

Status update, August 2022

August 10, 2022

How I wish I could organize my thoughts

July 26, 2022

Conciseness

July 25, 2022

The past and future of open hardware

July 25, 2022

Code review at the speed of email

July 18, 2022

Status update, July 2022

July 09, 2022

The Fediverse can be pretty toxic

July 01, 2022

Porting Doom to Helios

June 23, 2022

GitHub Copilot and open source laundering

June 20, 2022

Introducing the Himitsu keyring & password manager for Unix

June 15, 2022

Status update, June 2022

June 13, 2022

The Helios microkernel

May 30, 2022

bleh

May 25, 2022

Google has been DDoSing SourceHut for over a year

May 16, 2022

Status update, May 2022

May 14, 2022

A Hare code generator for finding ioctl numbers

May 12, 2022

When will we learn?

May 09, 2022

Implementing an SSH agent in Hare

April 25, 2022

Announcing the Hare programming language

April 15, 2022

Status update, April 2022

April 01, 2022

Announcing git snail-mail

March 29, 2022

It is important for free software to use free software infrastructure

March 24, 2022

The Netherlands so far

March 15, 2022

Status update, March 2022

March 14, 2022

It takes a village

March 13, 2022

Why am I building a programming language in private?

March 01, 2022

Open Source is defined by the OSI's Open Source Definition

February 19, 2022

Plaid is an evil nightmare product from Security Hell

February 15, 2022

Status update, February 2022

February 13, 2022

Framing accessibility in broader terms

February 07, 2022

Free software licenses explained: MIT

January 28, 2022

Implementing a MIME database in XXXX

January 18, 2022

Pine64 should re-evaluate their community priorities

January 17, 2022

Status update, January 2022

January 15, 2022

The RISC-V experience

December 30, 2021

Breaking down a small language design proposal

December 28, 2021

Please don't use Discord for FOSS projects

December 25, 2021

Please use me as a resource

December 23, 2021

Sustainable creativity in a world without copyright

December 18, 2021

On commercial forks of FOSS projects

December 15, 2021

Status update, December 2021

December 14, 2021

Impressions of Linux Mint & elementary OS

December 05, 2021

What desktop Linux needs to succeed in the mainstream

December 05, 2021

How new Linux users can increase their odds of success

November 26, 2021

postmarketOS revolutionizes smartphone hacking

November 24, 2021

My philosophy for productive instant messaging

November 16, 2021

Python: Please stop screwing over Linux distros

November 16, 2021

I will pay you cash to delete your npm module

November 15, 2021

Status update, November 2021

November 05, 2021

Breaking down Apollo Federation's anti-FOSS corporate gaslighting

October 26, 2021

GitHub stale bot considered harmful

October 22, 2021

How SmarterEveryDay's 4privacy can, and cannot, meet its goals

October 17, 2021

Software developers have stopped caring about reliability

October 15, 2021

Status update, October 2021

October 05, 2021

How reflection works in Hare

September 27, 2021

Developers: Let distros do their job

September 23, 2021

Nitter and other Internet reclamation projects

September 15, 2021

Status update, September 2021

September 11, 2021

visurf, a web browser based on NetSurf

August 15, 2021

Status update, August 2021

August 11, 2021

Tips for debugging your new programming language

August 10, 2021

Police to begin regular, warrant-free searches of homes for child abuse material

August 06, 2021

proxy.golang.org allows many Go packages to be silently broken

August 05, 2021

In praise of PostgreSQL

July 28, 2021

My wish-list for the next YAML

July 15, 2021

Status update, July 2021

July 04, 2021

Is GitHub a derivative work of GPL'd software?

July 03, 2021

How does IRC's federation model compare to ActivityPub?

June 27, 2021

You can't capture the nuance of my form fields

June 24, 2021

A finger client

June 15, 2021

Status update, June 2021

June 14, 2021

Provided "as is", without warranty of any kind

June 07, 2021

I will be moving to the Netherlands

May 30, 2021

Build your project in our new language

May 24, 2021

Using io_uring to make a high-performance... finger server

May 19, 2021

How to write release notes

May 17, 2021

aerc, mbsync, and postfix for maximum comfy offline email

May 16, 2021

Status update, May 2021

May 14, 2021

Pinebook Pro review

May 08, 2021

I try not to make unlikable software (and features)

May 07, 2021

godocs.io six months later

May 06, 2021

In praise of Alpine Linux

April 26, 2021

Cryptocurrency is an abject disaster

April 22, 2021

Parsers all the way down: writing a self-hosting parser

April 22, 2021

Why Lichess will always be free

April 15, 2021

Status update, April 2021

April 12, 2021

The Developer Certificate of Origin is a great alternative to a CLA

April 07, 2021

What should the next chat app look like?

April 02, 2021

Go is a great programming language

March 29, 2021

The world's stupidest IRC bot

March 23, 2021

The complete guide for open sourcing video games

March 19, 2021

We are building a new systems programming language

March 15, 2021

Status update, March 2021

March 06, 2021

The corporate surveillance machine is killing people

March 03, 2021

To make money in FOSS, build a business first

February 25, 2021

Gmail is a huge source of spam

February 21, 2021

A great alternative is rarely fatter than what it aims to replace

February 09, 2021

How to make your downstream users happy

January 28, 2021

Use open platforms — or else

January 20, 2021

Open source means surrendering your monopoly over commercial exploitation

January 19, 2021

Spooky action at a distance

January 19, 2021

Elasticsearch does not belong to Elastic

January 07, 2021

History will not remember us fondly

January 04, 2021

Fostering a culture that values stability and reliability

January 01, 2021

A megacorp is not your dream job

December 25, 2020

How to design a new programming language from scratch

December 18, 2020

godocs.io is now available

December 15, 2020

Status update, December 2020

December 12, 2020

Become shell literate

December 04, 2020

Web analytics should at least meet the standards of informed consent

November 20, 2020

A few ways to make money in FOSS

November 17, 2020

We can do better than DuckDuckGo

November 15, 2020

Status update, November 2020

November 06, 2020

Utility vs usability

November 01, 2020

What is this Gemini thing anyway, and why am I excited about it?

October 23, 2020

I'm handing over maintenance of wlroots and sway to Simon Ser

October 22, 2020

Firefox: The Jewel^WEmbarassment of Open Source

October 15, 2020

Status update, October 2020

October 09, 2020

Four principles of software engineering

October 01, 2020

Spamtoberfest

September 25, 2020

A tale of two libcs

September 21, 2020

TOFU recommendations for Gemini

September 20, 2020

The unrealized potential of federation

September 15, 2020

Status update, September 2020

September 02, 2020

Linux development is distributed - profoundly so

September 02, 2020

Linux development is distributed - profoundly so

August 27, 2020

Embrace, extend, and finally extinguish - Microsoft plays their hand

August 24, 2020

Alice in Wonderland and the theft of the public domain

August 17, 2020

Software engineers solve problems

August 16, 2020

Status update, August 2020

August 13, 2020

Web browsers need to stop

August 10, 2020

I want to contribute to your project, how do I start?

August 01, 2020

pkg.go.dev is more concerned with Google's interests than good engineering

July 27, 2020

The falsehoods of anti-AGPL propaganda

July 15, 2020

Status update, July 2020

July 14, 2020

March 2nd, 1943

June 26, 2020

General-purpose OS, special-purpose OS, and now: vendor-purpose OS

June 21, 2020

Introducing the BARE message encoding

June 15, 2020

Status update, June 2020

June 12, 2020

Can we talk about client-side certificates?

June 06, 2020

Add a "contrib" directory to your projects

May 15, 2020

Status update, May 2020

May 05, 2020

We are complicit in our employer's deeds

April 22, 2020

How to store data forever

April 20, 2020

Configuring aerc for git via email

April 15, 2020

Status update, April 2020

April 06, 2020

My unorthodox, branchless git workflow

March 25, 2020

Designing and 3D printing a new part for my truck

March 18, 2020

The reckless, infinite scope of web browsers

March 13, 2020

GitHub's new notifications: a case of regressive design

March 07, 2020

An open letter to Senator Bob Casey on end-to-end encryption

March 03, 2020

The Abiopause

February 21, 2020

Thoughts on performance & optimization

February 18, 2020

Fucking laptops

February 15, 2020

Status update, February 2020

February 06, 2020

Dependencies and maintainers

January 27, 2020

KnightOS was an interesting operating system

January 21, 2020

The happinesses and stresses of full-time FOSS work

January 17, 2020

A philosophy of project governance

January 15, 2020

Status update, January 2020

January 08, 2020

Following up on "Hello world"

January 04, 2020

Hello world

December 30, 2019

Managing my dotfiles as a git repository

December 18, 2019

PinePhone review

December 15, 2019

Status update, December 2019

December 09, 2019

Developers shouldn't distribute their own software

November 29, 2019

Take action to save .org and prosecute those who sold out the internet

November 26, 2019

Software developers should avoid traumatic changes

November 20, 2019

China

November 15, 2019

Status update, November 2019

October 30, 2019

An old-school shell hack on a line printer

October 15, 2019

Status update, October 2019

October 12, 2019

How to fuck up software releases

October 10, 2019

RaptorCS's redemption: the POWER9 machine works

October 07, 2019

Why Collabora really added Digital Restrictions Management to Weston

September 23, 2019

RaptorCS POWER9 Blackbird PC review

September 17, 2019

Don't sacrifice the right ideas to win the right words

September 15, 2019

Status update, September 2019

September 08, 2019

How I decide between many programming languages

September 02, 2019

Building interactive SSH applications

August 19, 2019

Shell access for builds.sr.ht CI

August 15, 2019

Status update, August 2019

August 09, 2019

DRM leasing: VR for Wayland

July 29, 2019

FOSS contributor tracks

July 15, 2019

Status update, July 2019

July 08, 2019

Announcing code annotations for SourceHut

July 01, 2019

Absence of certain features in IRC considered a feature

June 15, 2019

Status update, June 2019

June 13, 2019

My personal journey from MIT to GPL

June 03, 2019

Initial pre-release of aerc: an email client for your terminal

May 24, 2019

What is a fork, really, and how GitHub changed its meaning

May 15, 2019

Status update, May 2019

May 13, 2019

Webcast: Reviewing git & mercurial patches with email

May 01, 2019

Announcing Wio: A clone of Plan 9's Rio for Wayland

April 29, 2019

The "shut up and get back to work" coding style guide

April 23, 2019

Using Cage for a seamless remote Wayland session

April 19, 2019

Choosing a VPN service is a serious decision

April 15, 2019

Status update, April 2019

April 15, 2019

Announcing first-class Mercurial support on Sourcehut

April 02, 2019

NewPipe represents the best of FOSS

March 25, 2019

Rust is not a good C replacement

March 15, 2019

Status update, March 2019

March 11, 2019

Announcing the release of sway 1.0

March 04, 2019

Sourcehut's spartan approach to web design

February 25, 2019

Tips for a disciplined git workflow

February 18, 2019

Generics aren't ready for Go

February 10, 2019

Wayland misconceptions debunked

February 05, 2019

My experiences at FOSDEM 2019

January 30, 2019

Why I chose Flask to build sr.ht's mini-services

January 23, 2019

Why I use old hardware

January 15, 2019

I'm going to work full-time on free software

January 13, 2019

Backups & redundancy at sr.ht

January 01, 2019

Patches welcome

December 28, 2018

Anatomy of a shell

December 20, 2018

Porting Alpine Linux to RISC-V

December 04, 2018

How to abandon a FLOSS project

November 15, 2018

sr.ht, the hacker's forge, now open for public alpha

October 30, 2018

It's not okay to pretend your software is open source

October 29, 2018

How does virtual memory work?

October 20, 2018

Sway 1.0-beta.1 release highlights

October 08, 2018

Go 1.11 got me to stop ignoring Go

October 05, 2018

Don't sign a CLA

September 30, 2018

Sway & wlroots at XDC 2018

September 10, 2018

Getting started with qemu

September 04, 2018

Conservative web development

August 26, 2018

How to make a self-hosted video livestream

August 22, 2018

The Commons Clause will destroy open source

August 08, 2018

I don't trust Signal

August 05, 2018

Setting up a local dev mail server

July 29, 2018

Writing a Wayland compositor with wlroots: shells

July 23, 2018

Git is already federated & decentralized

July 17, 2018

Input handling in wlroots

July 09, 2018

Simple, correct, fast: in that order

July 02, 2018

The advantages of an email-driven git workflow

June 27, 2018

A quick review of my Let's Encrypt setup

June 05, 2018

Should you move from GitHub to sr.ht

June 01, 2018

How I maintain FOSS projects

May 29, 2018

Embedding files in C programs with koio

May 27, 2018

Why did we replace wlc?

May 13, 2018

Introducing scdoc, a man page generator

May 04, 2018

Redirecting stderr of a running process

May 03, 2018

Google embraces, extends, and extinguishes

April 28, 2018

Sway reporting in from KDE's Berlin development sprint

March 24, 2018

Achtung! Decentralize, decentralize, decentralize!

March 17, 2018

Hack everything without fear

March 10, 2018

How to write an IRC bot

February 24, 2018

The path to sustainably working on FOSS full-time

February 22, 2018

Writing a Wayland Compositor, Part 2: Rigging up the server

February 17, 2018

Writing a Wayland Compositor, Part 1: Hello wlroots

February 13, 2018

The last years

February 05, 2018

Introduction to POSIX shell

January 27, 2018

Sway and client side decorations

January 10, 2018

Learn about your package manager

January 02, 2018

fork is not my favorite syscall

December 28, 2017

wlroots whitepaper available

December 16, 2017

Firefox is on a slippery slope

December 02, 2017

A history of emergent intelligence

November 24, 2017

On taking good care of your phone

November 13, 2017

Portability matters

October 26, 2017

Nvidia sucks and I'm sick of it

October 09, 2017

The future of Wayland, and sway's role in it

September 13, 2017

Analyzing HN moderation & censorship

September 08, 2017

Killing ants with nuclear weapons

August 13, 2017

When not to use a regex

August 09, 2017

State of Sway August 2017

June 19, 2017

Archive it or you will miss it

June 10, 2017

An introduction to Wayland

June 05, 2017

Limited "generics" in C without macros or UB

May 11, 2017

Rotating passwords in bulk in the wake of security events

May 05, 2017

Building a "real" Linux distro

April 29, 2017

State of Sway April 2017

April 13, 2017

MSG_PEEK is pretty common, CVE-2016-10229 is worse than you think

March 15, 2017

Principles for C programming

February 22, 2017

Compiler devnotes: Machine specs

January 30, 2017

Lessons to learn from C

January 13, 2017

The only problem with Python 3's str is that you don't grok it

January 06, 2017

Actually, you CAN do it

December 27, 2016

State of Sway December 2016 - secure your Wayland desktop, get paid to work on Sway

December 06, 2016

A broad intro to networking

November 24, 2016

Electron considered harmful

November 16, 2016

Getting on without Google

November 05, 2016

I'm losing faith in America

September 17, 2016

Using the right tool for the job

September 09, 2016

What motivates the authors of the software you use?

August 02, 2016

Sway 0.9 & One year of Sway

July 19, 2016

Using -Wl,--wrap for mocking in C

June 29, 2016

Life, liberty, and the pursuit of privacy

May 28, 2016

Understanding pointers

May 11, 2016

In Memoriam - Mozilla

April 20, 2016

State of Sway - April 2016

April 12, 2016

How to write a better bloom filter in C

April 11, 2016

Please use text/plain for email

March 22, 2016

Integrating a VT220 into my life

December 20, 2015

State of Sway - December 2015

November 11, 2015

Bring more Tor into your life

November 01, 2015

Please don't use Slack for FOSS projects

July 20, 2015

A practical understanding of Flux

April 19, 2015

Hooks - running stuff on Github hooks

October 10, 2014

On the profitability of image hosting websites

September 02, 2014

Process scheduling and multitasking in KnightOS

June 28, 2014

Python's datetime sucks

June 07, 2014

Go's error handling doesn't sit right with me

February 25, 2014

Hacking on your TI calculator

February 02, 2014

The bug that hides from breakpoints

August 24, 2013

Custom Music Syncing on Android

August 24, 2013

Custom Music Syncing on Android

August 19, 2013

You don't need jQuery

March 01, 2012

Installing Windows 8 - Super-User Guide

January 10, 2012

LibMinecraft and Partycraft

January 03, 2012

Minecraft on Mango

December 01, 2011

Miners' Guild Site

November 29, 2011

Umbraco Certification

August 31, 2011

Free Software Abounds

August 07, 2011

The Cheap Way To Fix a GameBoy Game

July 23, 2011

Creating an Integrated Development Environment

July 23, 2011

On the Use of Internet Filtering

March 07, 2011

Redmond with the Microsoft Student Insiders

March 05, 2011

Post-Session: Windows Phone 7 @ RMTT

February 25, 2011

Rocky Mountain Tech Trifecta

January 27, 2011

Colorado Springs Give Camp

December 11, 2010

Everything you want out of WP7