Mostly tech. Subscribe through RSS.
-
Letting Claude Play Text Adventures
12 January, 2026 * Experiments in cognitive architecture.
-
There Is No New Aesthetics
5 January, 2026 * On the exhaustion of man.
-
1Password Dependency Breaks Syntax Highlighting
27 December, 2025 * Why does a password manager need a syntax highlighter?
-
Using the Brother DS-640 Scanner on NixOS
27 December, 2025 * I suffer so you don't have to.
-
Books I Enjoyed in 2025
22 December, 2025 * A short list.
-
Coarse is Better
21 December, 2025 * Make AI weird again.
-
I Wish People Were More Public
10 December, 2025 * On sharing more of yourself.
-
Ad-Hoc Emacs Packages with Nix
16 November, 2025 * Creating ad-hoc Emacs packages in a few lines of code.
-
Linux on the Fujitsu Lifebook U729
15 November, 2025 * A short review and troubleshooting guide.
-
Agda on NixOS
14 November, 2025 * Troubleshooting notes.
-
Hashcards: A Plain-Text Spaced Repetition System
5 October, 2025 * Announcing my latest open-source project.
-
Adding Planets to Celestia on macOS
29 July, 2025 * A beginner's guide to modding Celestia.
-
Notes on Managing ADHD
12 June, 2025 * Strategies and tactics for staying productive.
-
Inboxes are Underrated
24 May, 2025 * On inboxes as application-specific todo lists.
-
You Can Choose Tools That Make You Happy
20 May, 2025 * Stop falsifying your motivations.
-
Two Years of Rust
15 April, 2025 * Reflections on using Rust professionally for two years.
-
My Backup Infrastructure, 2025 Edition
13 April, 2025 * How I back up my personal data.
-
We Live In a Golden Age of Interoperability
8 April, 2025 * On the growth of open standards.
-
Domain-Agnostic and Domain-Specific Tools
3 April, 2025 * Software that can do everything does any one thing poorly.
-
Non-Fiction Has Bad Incentives
3 February, 2025 * On publishing as a play for status and legitimacy.
-
Composable SQL
24 January, 2025 * Better SQL through typed, composable query fragments.
-
Adding Colour to macOS Folder Icons
17 January, 2025 * A short experiment with Python, ImageMagick, and iconutil.
-
Implementing FSRS in 100 Lines
10 January, 2025 * A tiny implementation of the most advanced spaced repetition algorithm.
-
How I Use Claude
1 January, 2025 * Exploring Anthropic's data export.
-
Implementing SM-2 in Rust
27 December, 2024 * An implemenation of the SuperMemo-2 algorithm.
-
Ephemerality in User Interfaces
21 December, 2024 * On hypermedia, UI design, and user agency.
-
Client Freedom
24 November, 2024 * On the decline of open protocols.
-
The Best Emacs Microfeature
5 June, 2024 * Why I keep using Emacs in 2024.
-
The Design Space of Wikis
2 June, 2024 * An exploration of the design space of wikis.
-
Type Inference Was a Mistake
29 March, 2024 * On type inference as an academic computer science lab leak.
-
Thoughts on LLM Agents
5 January, 2024 * Entropy, criticality, and complexity classes of cellular automata.
-
You Need More Constraints
30 July, 2023 * A checklist of useful SQL constraints.
-
Type Systems for Memory Safety
22 July, 2023 * A survey of type systems for memory safety.
-
Why Checked Exceptions Failed
15 July, 2023 * Programming language features are never orthogonal.
-
Test Against Reality
8 July, 2023 * Against mocking.
-
Test Autodiscovery is a Silver Bullet
24 June, 2023 * To encourage good practices, make them frictionless.
-
Second-Class References
12 June, 2023 * On Graydon's Rust, Val, and mutable value semantics.
-
Depth-First Procrastination
9 June, 2023 * When subgoals recur infinitely.
-
Why Lisp Syntax Works
5 June, 2023 * On uniform vs. specific syntax.
-
Sketch of a Post-ORM
2 June, 2023 * A better way to interact with databases.
-
Language Pragmatics Engineering
30 May, 2023 * On best practices and gradient descent.
-
What is a Software Engineer?
27 May, 2023 * Blake, Newton, Turing.
-
Typing Persian in Emacs
25 May, 2023 * A tutorial introduction to farsi-transliterate-banan.
-
Language Tooling Antipatterns
14 May, 2023 * We will build a tower of Webpack wrappers to reach heaven.
-
Return Reasons, Not Booleans
11 May, 2023 * A short post on a consequence of Boolean blindness.
-
NixOS for the Impatient
7 May, 2023 * Using NixOS for a more tractable computing setup.
-
How Capabilities Work in Austral
5 May, 2023 * A walkthrough of Austral's capability-based security features.
-
Two Years of OCaml
30 April, 2023 * My thoughts on OCaml after two years of building a compiler with it.
-
Dependency Resolution Made Simple
23 April, 2023 * Resolving dependencies with a homebrew SAT solver.
-
My Experience with Bupropion
18 April, 2023 * Autism, antipsychotics, and the striatum.
-
The Best of Orion's Arm
16 April, 2023 * Summarizing ten thousand years of future history.
-
Effective Spaced Repetition
10 April, 2023 * "To flash conviction on the mind."
-
Spaced Repetition is Checkpointing for Learning
6 April, 2023 * Effective autodidactism for the scatterbrained.
-
Design of the Austral Compiler
9 March, 2023 * A high-level walkthrough of the Austral bootstrapping compiler.
-
The Gallery of Sand
5 March, 2023 * Sampling image space with DALL-E.
-
And Yet It Understands
22 February, 2023 * In high-dimensional vector spaces, numerical optimization is omnipotent.
-
Building a DIY Clozemaster
19 February, 2023 * Replacing Duo the owl with a simple Python script.
-
Shells are Two Things
1 February, 2023 * Command languages and scripting languages are and should be different things.
-
How Austral's Linear Type Checker Works
29 January, 2023 * A walkthrough of Austral's linearity checker algorithm.
-
Better XML Editing for Emacs
13 January, 2023 * Improving completion in nXML mode.
-
A Brief Defense of XML
6 January, 2023 * On the difference between markup and data exchange languages.
-
Roam, Twenty Years Before Roam
3 January, 2023 * Wikipedia has had bidirectional links for twenty years and nobody noticed.
-
Introducing Austral: A Systems Language with Linear Types and Capabilities
28 December, 2022 * Introducing a new programming language.
-
Unbundling Tools for Thought
26 December, 2022 * Disparate thoughts on personal information management after traversing the hype cycle.
-
Astronomical Calculations for Hard SF in Common Lisp
19 December, 2022 * Hard SF worldbuilding with the HYG database, Dijkstra's algorithm, and Lisp.
-
You're Not Going Anywhere
20 November, 2022 * Twitter, Dante, and the World State.
-
Simplicity and Survival
2 September, 2022 * How do programming languages survive indefinitely?
-
First Impressions of Mochi
17 August, 2022 * Mochi is a new multi-platform spaced repetition app.
-
Lessons from Writing a Compiler
5 July, 2022 * Collected tips from building the Austral compiler.
-
Signed Integers are Asymmetrical
11 October, 2021 * An edge case in integer safety.
-
Reading a File in OCaml on Windows
12 September, 2021 * Adventures in officially unsupported architectures.
-
Languages are not Ecosystems
2 September, 2021 * The size of language ecosystems obscures the inherent design problems of programming languages.
-
Parsing with Menhir, Part I: Forth
26 August, 2021 * A tutorial on parsing Forth with Menhir.
-
Parsing with Menhir
25 August, 2021 * A tutorial series on parsing with the Menhir parser generator for OCaml.
-
Linear Types and Exceptions
7 August, 2021 * On the incompatibility of linear types and traditional exception handling.
-
Compiling LLVM IR to Binary
10 November, 2019 * A note to my future self.
-
Forth and Complexity
7 November, 2019 * On the unsustainable complexity of modern computing.
-
The Uselessness of the Accept-Language Header
6 November, 2019 * Old man yells at cloud.
-
Linear Types and Safety
6 January, 2019 * An example of hardening an API using linear types.
-
A Bibliography of 2018
28 December, 2018 * Every paper I read this year.
-
FreeBSD with Encrypted ZFS and X11 on a Laptop
24 August, 2018 * My installation notes.
-
Portable Backups with Duplicity and GnuPG
17 August, 2018 * Managing on-site Duplicity backups with a secure GPG key.
-
A Case Study in Propositional Logic
13 May, 2018 * Design decisions, and using types to prevent illegal states.
-
Calling C from MLton
5 April, 2018 * A tutorial on MLton's foreign function interface.
-
February Updates
28 February, 2018 * Changes in this website for February 2018.
-
Libraries: The Database Engineering Perspective
22 February, 2018 * Evolving a schema for libraries one counterexample at a time.
-
The Twelve Islanders Problem
10 February, 2018 * A brain teaser implemented in OCaml.
-
Inheritance and Disjunctions
16 December, 2017 * A case study in porting a compiler.
-
A Wishlist of Zero-Cost Abstractions
5 March, 2017 * A wishlist of language features, their use cases, and how they affect language complexity.
-
Using LMDB from Common Lisp
7 April, 2016 * Announcing an LMDB binding, and a tutorial.
-
State of the Common Lisp Ecosystem, 2015
25 August, 2015 * The state of Common Lisp's library ecosystem, from the perspective of a contributor.
-
Common Lisp with Travis and Coveralls
7 June, 2015 * How to set up Travis CI and Coveralls.io with a Common Lisp project.