Projects
This page lists some of the things I've built, maintained, or contributed to over the years.
Unless otherwise specified, most of the things listed here are actively developed, and I am open to feedback on them.
I am a strong believer in open-source, so the code for the vast majority of these projects can be found on my GitHub.
Featured
An NVDA add-on that describes images, controls, documents, the camera, and the whole screen, then lets you ask questions about what it found.
The original KeySoft software from the BrailleNote Apex, running on a modern Windows computer with speech, storage, networking, and braille keyboard input.
Reusable building blocks for accessible audio games in JavaScript and TypeScript, whether they run in a browser or ship as native apps.
A Python audio library that keeps simple playback simple, then gives you streaming and full three dimensional sound when you need them.
An NVDA add-on that lets blind accessibility testers measure text and focus indicator contrast against WCAG without asking someone else to look.
Turn an RTL-SDR into a networked radio for AM, FM, shortwave, aviation, NOAA weather, HD Radio, and ACARS.
Accessibility
- Text Information: An NVDA add-on that gives you detailed information about selected text: dictionary definitions, IP geolocation, ISBN details, credit card providers, character and word counts, and more. Get it from NVDA's add-on store, select some text, then press NVDA+; (semicolon).
- audiovault-downloader: Download audio described movies and TV shows from audiovault.net using the command line.
- tauri-plugin-prism: Native screen reader and text to speech output in Tauri applications.
- tauri-plugin-direct_touch: A Tauri v2 plugin for direct touch accessibility regions on iOS.
Audio and games
- PyTeamTalk: A human-friendly wrapper around the TeamTalk 5 TCP API.
- simplenet: The simplest possible ENet wrapper for Python.
- sonosdj: AI is your DJ now. Tell Claude or Codex what you want to hear (a mood, scene, decade, constraint, or pretty much anything). It finds something and plays it on your Sonos system automatically. Great for discovery, or when you have a sound in mind but you are blanking on an artist or playlist.
AI and developer tools
- onmyphone: An opinionated Claude Code and Codex skill that simplifies coding on your phone, when you use Claude Code in RC (remote control) mode.
- Gettext Auto: A Claude Code skill that automatically localizes missing strings in any application that uses the Gettext internationalization (i18n) and localization (l10n) system. The goal is to be able to provide any product to the estimated 75% of the internet that does not speak English as their native language. It has out-of-the-box support for NVDA add-ons as well.
- vcw: An experiment wherein I try to vibe code something new every week. A lot of random stuff here. Notably, this is the one place where I let agents write code that I don't review, and sometimes don't read.
- logsetup: Painless log initialization for any Python project.
- tformat: Efficient conversion of timestamps to human-readable text.
- dictionary-api: An API and frontend for looking up words in the WordNet dataset, originally written to power my Text Information NVDA add-on when Princeton got rid of the WordNet web interface. You can try it out at dictionary.ctemm.me.
- ollama-client: A lightweight wxPython frontend for Ollama. This was written a while ago. There are almost certainly better and more full-featured UIs that are available now (OpenWebUI comes to mind).
Everyday utilities
- invoice-gen: Free command-line and lightweight invoice generator without subscriptions or watermarks.
- todoist-sync: Keep your Todoist and Excel task lists in sync, both ways.
- habitica-api: A natural Python interface to the Habitica productivity RPG.
- grenam-remover: Remove and revert the damage caused by the Win32/Grenam malware, because Windows Defender just makes it worse.
Other work
First-of-its-kind AI-powered PDF accessibility remediation service that actually works at scale. I helped shape the product from its earliest stages, my primary responsibility being to ensure that it works for the community it's meant to serve, and on the ugliest and most complex of documents imaginable. DocAccess was recently acquired by CivicPlus.
A monthly newsletter covering the latest developments, releases, and happenings in accessible gaming curated by the audiogames.net community, the number one source for accessible gaming news since 2002. As far as I'm aware, this is the only publication of its kind on the internet right now. These days, I mostly just help run the infrastructure that keeps it going.
Newsletters
I write two monthly newsletters with QualityLogic:
- Accessibility Industry Update: A comprehensive roundup of accessibility news, legal developments, industry trends, and thought leadership. I read probably hundreds of articles every month, then link the most important and thought-provoking ones so you can stay ahead in the time it takes to drink your morning coffee.
- Quality Trail: Covering QA, software testing methodologies, and where they intersect.
Both available at QualityLogic's newsletter page.
Older work
Projects from my early days, mostly from the BGT era of audio game development. They aren't maintained, but they're still up for anyone who finds them useful.
- RBDL: Download and organize Repeaterbook Ham and GMRS data in the CLI. Following a sternly worded note wherein I was told that this was never how the platform was meant to be used, Repeaterbook made it extremely difficult to scrape or pull data from their site without authentication. If you are licensed, you can sign up for an account and pull it with your API key. If you aren't, you will have to find another way.
- bgt_includes: The largest collection of includes for the BGT scripting language still available today. BGT has mostly been superseded by NVGT.
- BGTPackFile: A reverse engineered backward compatible Python implementation of the BGT pack_file format.
- prowl-bgt: A BGT class for sending notifications with the Prowl API.
- teamtalk-spotify-bot: A text-only TeamTalk controller for Spotify playback.
- pybeamit: A Python wrapper around the Just Beam It file sharing API.
- codestats: In-depth information about the makeup of a project in any language.
- cloud-util: An experimental frontend for iCloud account services. The API changed years ago, so I am not sure what (if anything) will still work.