This page lists some of my open source projects and writing on technical topics. For my professional experience, see my resume.
All the projects here were at least usable at some point—no vaporware.
- On finishing my master’s degree (2024)
- obsidian-auto-image-alt-plugin: Obsidian plugin that populates image alt-text using an LLM (2024)
- Matrix bots: invoke LLMs; survey yourself at semi-random intervals; echo to text file (2024)
- Notes on the Strange Loop conference: 2013, 2014, 2017, 2023
- Pandoc plugins: a writer that targets Goodreads; a filter that relativizes links; a filter that adds section numbers (2023)
- Why this site is the way it is (2022)
- LousyJob: a very simple background job runner for macOS, designed to be easier to use and troubleshoot than launchd. (2021)
- Hammerspoon plugins: manage command palette and hotkeys; window management; create command palette from app menu; task execution helper (2021)
- Mark Headboard VS Code plugin: a UI that lets you use Markdown files as kanban boards. (2020-2021)
- paste-relative-path VS Code plugin: when the clipboard contains a file path, this command pastes the relative path to that file from the active file. (2020-2021)
- tueson: simple indentation-based data notation that uses the JSON data model, and a javascript-based parser/generator. (2021)
- notesdir: command-line note management, designed to avoid lock-in. (2020-2021. As of 2023, I use Obsidian instead.)
- Making backup validation easier (2020)
- A variety of tools for exporting data from various services, organizing the exports, and verifying their quality. (2020-2021)
- replicate-evoarch: partial replication of experiments from the paper “The Evolution of Layered Protocol Stacks Leads to an Hourglass-Shaped Architecture” (Saamer Akshabi, Constantine Dovrolis). (2020)
- Stuff I learned writing a javascript tracer (2020)
- blunt-instrument: a Babel plugin for automated instrumentation/tracing of Javascript code and a browser app for exploring traces. Try it online! (2019-2020)
- object-graph-as-json: library and spec for encoding arbitrary Javascript objects (including circular references and details that would be lost when serializing directly to JSON) in a JSON-safe structure. (2020)
- htmltopdf-batch-puppeteer: converts HTML files to PDFs. In batches. Using—as you may have guessed—puppeteer. (2020)
- A few programming challenge walkthroughs (2019)
- js-syntaxtree-explorer: UI for viewing javascript syntax tree as parsed by esprima. Runs in-browser. (2019)
- task-rotator-todoist: allows creating tasks in Todoist that change their description according to a rotation when they are completed. (2019)
- trello_backup_renderer and sms_backup_renderer: tools for creating HTML documents from backups. (2017-2019)
- scrimp: browser-based tool for interactively testing Thrift APIs. (2013ish)
- noir-servlet, noir-war-archetype, and per-ring-request: old stuff for the Clojure web service ecosystem. (2012)
- Thinking functionally about a simple function (2011)
- On Clojure and Ring (2011)
- irc-indexer and irc-index-viewer: indexes IRC logs into Elasticsearch and makes them viewable in a webapp. (2011)