This page lists some of my open source projects and writing on technical topics. For my professional experience, see my resume.
- rank_files: CLI tool for finding the top k files according to arbitrary given criteria, using an LLM as the judge (2025)
- obsidian-paste-quote-plugin: helps with formatting and citing quotes when pasting into Obsidian (2025)
- basic_ollama_management_ui: simple web UI for managing models in Ollama (2025)
- 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)