Writing.
Writing about computers and making them do things.
43 posts
2026
- Riot is dead, long live Riot!
A look back at Riot's OCaml actor runtime, the scheduler and I/O challenges it faced, and what comes next.
2024
- Exceptions are Ok
A comparison of exceptions and results in OCaml, from signaling failures to handling and reporting errors ergonomically.
2023
- Parsing with Binary String Pattern Matching
Parsing WebSocket frames in OCaml with bitstring pattern matching, inspired by Erlang, Elixir, and Gleam.
- Unix Module Considered Harmful
A socket-pool bug reveals the low-level pitfalls of OCaml's Unix module and makes the case for safer networking APIs.
- Type-safe state machines using type-state
Use type-state in OCaml to make invalid state-machine transitions impossible while keeping the API approachable.
- A quick guide to GADTs and why you ain't gonna need them
An OCaml validation example shows when GADTs help, when they add complexity, and why simpler types often suffice.
- Exploring domains in OCaml is cheaper and faster
Model a web router with OCaml types to explore a domain, challenge assumptions, and refine the design quickly.
- HashSets with zero boilerplate
Make Rust HashSet literals easier to write with array conversions and a small set! macro.
- Solving for them vs Solving for us
A reflection on the tension between building tools for your own problems and solving problems that matter to other people.
- Structuring large ReScript projects
Lessons from a large ReScript codebase on standard libraries, bindings, package interfaces, and maintainable project structure.
- Making the ReScript type system work for you (Part II)
Build on ReScript's type-checking rules to understand how the compiler types functions and compound expressions.
- Making the ReScript type system work for you (Part I)
A practical introduction to how ReScript infers types for variables and uses the environment to check code.
- Founding a Startup as a Neurospicy Digital Nomad
An account of starting Warp while managing ADHD, constant distractions, and the rhythms of digital nomad life.
2022
- ReScript vs TypeScript: Building a Concurrent Queue library
Build a concurrent queue in TypeScript and ReScript to compare correctness, developer experience, and interoperability.
- ReScript on Deno: Command Line Tools and the Flags module
Bind Deno's Flags module from ReScript to parse command-line arguments with stronger types and a cleaner API.
- Exploring ReScript on Deno
Explore using Deno to build and distribute standalone ReScript programs without relying on Node.js tooling.
2021
- Semantic Data ain't the Golden Path (yet)
Why semantic data tools still make domain modeling, schema evolution, and code generation harder than they should be.
- The Best OCaml is the Worst OCaml
An OCaml command-line library shows how powerful abstractions can become difficult to use without approachable APIs and documentation.
- Code Evolution: Organic & Artificial
A comparison of organically grown systems and planned architectures, and the tradeoffs between immediate value and long-term design.
- An Imaginary Compiler
A short story about a programmer who learns to carry a critical, constructive compiler into every code review.
- Easy-to-Write Code Considered Harmful
Code that is easy to write can burden future readers unless its hidden context and assumptions are made explicit.
- Why Most Prototypes Suck
Fast prototypes can still be maintainable when their domain concepts are explicit and implementation details stay behind clear boundaries.
2020
- Why Typing Erlang is Hard
An attempt to type Erlang exposes the challenges of unions, records, receive expressions, and dynamic dispatch on the BEAM.
- On Tolerating Complexity
A hands-on journey from Markdown to a live-updating website argues for understanding and managing complexity rather than hiding it.
- Building a Dota Ontology, Part 4: Affinities and Attribute Effects
Extend a Dota 2 ontology so different kinds of ability affinity can describe how one effect changes another.
- Building a Dota Ontology, Part 3: Modeling Affinities
Model Dota 2 ability affinities as relationships and explore how an ontology can represent synergy between spells.
- Building a Dota Ontology, Part 2: describing the world of Dota
Describe Dota 2 heroes and abilities in an ontology to reason about why particular spells work well together.
- Building a Dota Ontology, Part 1: Introduction
Start a Dota 2 ontology in Protégé with the goal of reasoning about interactions between heroes and abilities.
- The Hard Stuff about Ontologies...
The hardest part of ontology work is acquiring and questioning domain knowledge, not learning formal logic or tooling.
- Making Ontologies Practical through Metaprogramming
Generate application code from ontology data to make semantic models more practical for everyday engineering.
- Engineering Knowledge: Identity
Global, durable identifiers can help knowledge systems keep their data meaningful as software and ownership change.
- Data Languages
Every data language makes tradeoffs about validation, domain fit, and how much information a program can express.
2019
- Building WebApps Like It's 1972
Revisit older computing ideas to rethink web applications around failure isolation, asynchronous work, and parallel execution.
2017
- Symbols and Values in JavaScript
Compare JavaScript symbols with atoms in other languages and show how Symbol.for creates stable, reusable names.
2015
- Daemons in Docker
A pragmatic look at running long-lived services in Docker and deciding when each process deserves its own container.
2014
- So I Stopped Programming
A woodworking detour and a family illness prompt a reflection on time, craft, and choosing what deserves attention.
- My actual activity on Github
Public GitHub activity tells only part of the story when much of a developer's work happens in private repositories.
- Troubleshooting Ember-App-Kit on PhoneGap
Practical fixes for building a PhoneGap app with Ember App Kit, from assets and bootstrapping to REST adapters.
- Moving On
Leaving home for Denmark becomes a reflection on change, resilience, and learning to trust your own direction.
- Designing an Unobtrusive Development Process
A proposal for a lightweight development process that connects code changes, deployment, planning, and team communication.
2013
- Why do I test
Testing can sting because it exposes mistakes, but that discomfort is what helps us write better software.
- TucJS, a hacker community
How TucJS helped a local JavaScript community in Tucumán grow into new meetups and lasting connections.