This page lists some of my personal, work, and school projects. You can find the source code for (almost) all of these projects and more on my personal GitHub account and the Radian LLC GitHub organization.
All of my open-source projects receive continued maintenance when needed, except where otherwise noted. The dates below, however, show when most of the major development happened.
Note that most of these projects are owned and operated by Radian LLC, who will be the liable party in the case of legal disputes. A subset are my personal work instead. When in doubt, check the license notice in the relevant GitHub repository. Obviously, work projects are the property and liability of the relevant employer(s), and the same applies to some school projects.
Currently working on
- regex-accountant: Aggregating personal finance record-keeper based on total control of transaction reconciliation and categorization via interactive rules engine and standard interface for ingesting data from reverse engineered APIs.
- Radian (Summer 2016 – Present): Elegant but practical configurations for Emacs, Zsh, Tmux, and Git.
el-patch(Winter 2016 – Fall 2018): Emacs package for future-proofing Emacs Lisp customizations.
straight.el(Winter 2016 – Present): Next-generation, purely functional package manager for the Emacs hacker. Co-maintainer: Nicholas Vollmer.
- diary-manager (Spring 2017 – Summer 2018): Command-line tool and Emacs package for managing daily (encrypted, version-controlled) diary entries.
- elint (Summer – Fall 2017): An attempt at deduplicating various CI utilities for my Emacs packages. It didn’t provide enough value to justify the overhead, although there are other projects which provide the same functionality in a more powerful manner.
prescient.el(Fall 2017 – Winter 2019): Simple but effective sorting and filtering for Emacs.
- heroku-buildpack-emacs (Summer 2018): Heroku buildpack to install Emacs.
- GNU ELPA Mirror (Summer 2018 – Summer 2019):
GitHub mirror of the GNU ELPA and Emacsmirror package
repositories for use with
- Blackout (Fall 2018): Unified replacement for
dim.el; allows hiding or customizing major and minor mode lighters in Emacs.
- Apheleia (Summer 2019): Run code formatters on Emacs buffer contents without moving the cursor position, using RCS patches and dynamic programming.
- Selectrum (Fall 2019 – Spring 2020): Completion and incremental narrowing framework for Emacs, replacing Ivy and Helm. Co-maintainer: Clemens Radermacher.
- CTRLF (Winter 2019 – Spring 2020): Better single-buffer text search interface for Emacs, replacing Isearch and Swiper.
Reverse engineering and web automation
- Messenger Mirror (Fall 2021): Small Python application using Selenium to bypass Facebook Messenger’s anti-bot protections and allow message notifications to be automatically forwarded to email. Part of my initiative to stop using the products of companies I despise. This was eventually blocked by Facebook.
- Unzuckify (Winter 2021): Small Python application using reverse-engineered Facebook login and GraphQL APIs to exfiltrate message notifications and forward them to email. Replaces Messenger Mirror after Facebook blocked it. This project was blocked too, so I just fully deprecated Messenger ahead of schedule.
- Claremont Spam Disabler (Summer 2022): Tiny Google Apps Script project that automatically filters and processes spammy emails sent to students by the Claremont Colleges.
- Venmo Auto Transfer (Summer 2022): Small Python application using reverse-engineered Venmo API to automatically transfer Venmo balance to linked bank account.
- Squeaky Hinge (Fall 2022): Small Python application using reverse-engineered Hinge API to send more reliable notifications on inbox messages.
Web apps and services, browser extensions
- Tidier (Spring 2019): Small application to auto-close abandoned GitHub issues by label and activity.
- Hyperschedule (Fall 2017 – Fall 2019; source): Fast and powerful course scheduler for the Claremont Colleges. Current maintainer: Kye Shi.
- GitHub Email Backlog (Summer 2020): Simple Chrome extension which abuses the GitHub notifications API to automatically update my profile status with an estimate of how long you will wait for a response when you report an issue. This is deprecated since I have gotten my personal life in order and can provide a more reliable base response time.
- smarter-playlist (Fall 2016): Clojure application to generate iTunes playlists combining variety, cohesiveness, and novelty.
- wdx (Fall 2017): Simpler and more robust alternative to wd, written in Python.
- mood-tracker (Spring 2017): Small AppleScript utility to record data about personal mood at regular intervals. This project was abandoned when I realized that trying to systematize everything in my life was actually not making me happier.
- Madeline (Summer 2018): Novel approach to directory syncing, used to maintain complementary mirroring of two filesystem trees via SSH. This idea, while interesting, never served my use case terribly well in the end, and the implementation is terrible. I now use a smaller and better-targeted personal script to serve a similar function.
- pass-ln (Fall 2022): Pass extension for creating symbolic links.
- Sleeping Beauty (Winter 2022): Network utility that puts a stateless TCP web server to sleep when not receiving traffic, to minimize resource utilization.
Research and education
- Kalyn (Spring 2020; blog post): Compile a high-level functional programming language, inspired by Haskell but with Lisp syntax, all the way to ELF binaries targeting x86-64 without using any pre-existing components such as the GNU linker or C standard library.
- TerrariaClone (Spring 2011 – Spring 2013; HackerNews thread): My first major project, a clone of Terraria, preserved as an example of how terrible code can be if you don’t pay attention to its quality.
- Mother’s Day (Summer 2013): Small Java applet that I made for Mother’s Day.
- Watching Paint Dry: The Game (Summer 2013): Small Java applet where you can paint things with the mouse, and then watch the paint dry. Yes, really. For Father’s Day.
- tetris-processing (Winter 2013): Simple clone of Tetris from high school, this one in Processing and featuring music.
- funwithframes (Winter 2013): Simple game in Processing where you try to dodge certain squares while being distracted by other squares.
- 2048 (Spring – Summer 2014): Simple clone of the game 2048, implemented in Java with graphical and command-line interfaces as well as a few auto-solving algorithms.
- tetris-python (Summer 2014): Slightly more advanced clone of Tetris from high school, this one in Python and featuring pentominoes and other nonstandard pieces.
- Christmas Rogue (Winter 2014): Christmas present for my father. Roguelike game inspired by Brogue and implemented in Java. Likely the most over-the-top Christmas present I will ever give.
- Chrono Count (Summer 2013 – Spring 2014): iOS app to manage countdowns and countups under arbitrarily complex schedules, previously available from the iOS App Store.
- Gravity (Winter 2013): Christmas present for my father. iOS app that simulates many-body Newtonian gravity.
- Calculus: Intuitive Explanations (Summer – Fall 2015; source): 67 pages of LaTeX content, from limits to vector analysis, with 35 TikZ figures.
- Differential Equation Solution Strategies (Spring 2016; source): Summary of strategies for solving different types of differential equations, with proofs.
- Linear Algebra Summary Sheet (Spring 2016; source): Quick reference for important linear algebra theorems, grouped so that making connections is easy.
intuitiveexplanations.com(Spring 2017 – Present): Personal website built on GitHub Actions using Make, Eleventy, LaTeX, and hosted on Netlify.
- mla-tex (Spring 2017 – Fall 2018): LaTeX document class for typesetting papers to MLA formatting standards.
- example-website (Summer 2020): Simple template to set up a static site similar to my personal website, for my friends who were interested in making similar websites for themselves.
- TI-84 programs (Spring 2010 – Spring 2016): My first programming ever, on the TI-84 Plus Silver Edition in middle and high school.
- puzzles (Summer 2016): Solvers for KenKen and Sudoku puzzles in Clojure.
- empty (Summer 2016): Absolute bare minimum Leiningen template.
- conway (Fall 2016): A simple solver for generalized Slothouber-Graatsma (Conway) puzzles in Clojure.
(See also my resume.)
- Ecofasten and Alpine Snowboards pricing calculators (Summer 2015, ThinkTopic; proprietary): Frontend and backend work on existing Clojure/ClojureScript/Datomic web applications for generating price quotes for roof-mounted solar panels and alpine snowboards. Teammates: Charles Gruenwald, Keren Megory-Cohen.
- think.recommend (Winter 2015 – Summer 2016, ThinkTopic; proprietary): Library for testing and benchmarking collaborative filtering algorithms.
- cortex.optimise (Spring – Summer 2016, ThinkTopic): General-purpose library for analyzing, visualizing, and comparing gradient descent algorithms.
- think.quality (Summer – Winter 2016, ThinkTopic; proprietary): Tool for running company-wide Clojure code quality audits and dashboard to visualize results.
- CMS Changeset Dashboard (Summer 2017, Quantcast; proprietary): Full-stack administrator dashboard for an internal team to manage an internal database used by an internal webapp used by another internal team to manage another internal database. You can imagine the customer-facing impact.
- lazy-map (Fall 2017, ThinkTopic): Lazy map implementation for Clojure.
- UPM (Summer 2019, Repl.it): Universal package-management interface for Python, Node.js, Ruby, and Emacs Lisp.
- Science fair project (Fall 2011 – Spring 2012, Summit Middle School): Boolean satisfiability solver applied to Sudoku solving.
- Hangman 2 2 3 2 (Spring 2013, Boulder High School, Advanced C++): Class project. iOS app that plays hangman or, depending on usage, the stock market.
- Projectile Simulator (Fall 2013, Boulder High School, AP Physics C): Class project. Hacky Python GUI in Tkinter to solve arbitrary 2D kinematics problems interactively.
- MathViewers (Summer – Winter 2014): Various programming projects for math classes: generative art, complex arithmetic visualization, numerical solution of differential equations.
- MazeGen (Fall 2014, Boulder High School, Design Technology): Java application to generate and visualize laser-cutter schematics for three-dimensional marble mazes.
- layerize (Fall 2015, Boulder High School, Design Technology): Clojure application to generate and visualize laser-cutter schematics for a cross-sectional model of a “Möbius solid”.
- JFLAP Autograder (Fall 2016, Harvey Mudd College, CS 42: Principles & Practice): Script to automatically run test cases against student-submitted DFAs, NFAs, or Turing machines in JFLAP format.
- VotingLib (Fall 2016, Harvey Mudd College, MATH 189G: Mathematics of Voting): Java library written for a short research project investigating the performance of different voting systems assuming voter satisfaction can be modeled as a high-dimensional Eucliean distance metric.
- whales.life (Spring 2019, Harvey Mudd College, CS 121: Software Development; source): Simple webapp for playing chess against an AI using minimax and neural networks. Teammates: Ben Baral, Max Treutelaar, Miles President, Shannon Collier.
- heroku-buildpack-git-lfs (Spring 2019, Harvey Mudd College, CS 121: Software Development): Heroku buildpack to install Git LFS and download assets transparently during build.
- Webapps Done Right (Spring 2019, Harvey Mudd College, CS 121: Software Development; slides and source): Guest lecture I gave to my class on webapp development using Python, Pipenv, Flask, Heroku.
- Lossless Path MTU Discovery (Fall 2019 – Spring 2020, Harvey Mudd College, CS Clinic; slides and Internet-Draft): Implementation in the Linux kernel of a replacement for Path MTU Discovery with improved performance and robustness. Teammates: Bradley Newton, Hakan Alpan, Miles President.
- IPv6 Routing Extension Header Benchmarking (Spring 2020, Harvey Mudd College, CS Clinic; slides and Internet-Draft): Systematic procedure for comparing the performance of IPv6 routing extension headers including Routing Header Type 0, Segment Routing Header, and Compressed Routing Header. Teammates: Bradley Newton, Hakan Alpan, Miles President.
- Life After Mudd (Winter 2019 – Spring 2020, Harvey Mudd College, CS 189: Programming Practicum; source): Geographic visualization webapp for results of a survey on post-graduation plans for the Class of 2020. Current maintainer: Kye Shi.
Abandoned projects (will never be finished)
- space-grid (Spring 2012): An attempt at a clone of the Flash game Star Relic in Python. It didn’t get very far, because I didn’t actually know any game programming.
- CAS (Summer 2014): Failed attempt to create a computer algebra system, like Mathematica.
- dfa (Spring 2016): A quickly-abandoned attempt to use Clojure to generate DFAs using a genetic algorithm.
- MazeGen Neue (Summer 2016): An attempt to rewrite MazeGen to be slightly less of a mess. Unfortunately, I went much too far in the opposite direction and created some Enterprise FizzBuzz, and the project was abandoned.
- minimal-webapp (Summer 2016): Noble effort to create a ClojureScript webapp that did not require a huge number of incomprehensible build system configuration files that nobody quite understood. It almost worked.
- acc (Summer 2017 – Summer 2018): Command-line accounting tool with first-class support for reconciling multiple ledgers interactively. This project was abandoned when it was pointed out to me by a friend that I didn’t actually have to track every single one of my financial transactions. I used a manual spreadsheet (reviewed quarterly) for budgeting and cash flow analysis for some time, and am considering migrating to Lunch Money moving forward.
- Dotman (Summer 2017 – Summer 2018): A very silly idea I had to write a unified package manager (with Ruby DSL) for my entire system configuration (e.g. software installation, configuration, dotfiles, misc scripts, etc.). This was abandoned when I realized I could just manually write down what I did to configure my laptop. If you actually want declarative system configuration, you should probably be using Nix.
- etunes (Fall 2017 – Summer 2018): Declarative, version-controlled music library manager for Emacs. Attempt #1 at a personal music library manager. Replaced by fstunes.
- pset (Fall 2017): Configurable templating system for university problem sets typeset in LaTeX. Will never be finished because I am no longer a college student.
- fstunes (Winter 2018): Extremely minimal music library manager leveraging UNIX filesystem abstractions. Attempt #2 at a personal music library manager. Replaced by µTunes.
- µTunes (Spring – Winter 2019): Aggressively minimal command-line music player and library manager following the UNIX philosophy, with Emacs interface. Attempt #3 at a personal music library manager. Was supposed to be replaced by Pyrelight but is still in current use despite being considered deprecated.
- Tabcrush (Summer 2019): High-performance power tool for editing large-scale tabular data in Emacs, intended for use with µTunes. Deprecated alongside µTunes.
- Mercury (Summer – Fall 2019): Emacs interface to Facebook Messenger, Signal, and SMS (via Google Hangouts). This has been superseded by Matrix for me.
- Pyrelight (Spring – Summer 2020): More sophisticated command-line music player and library manager. Attempt #4 at a personal music library manager. Will be replaced by Shallan.
On-hiatus projects (might be finished someday)
- Ishikk (Summer 2018): Read-write Google Calendar interface for Emacs, with graphical week view. If finished, this would be repurposed to work with Fastmail. However, the 2023 package calfw-blocks might supersede the project.
- Dumbparens (Spring 2020): Sane delimiter-matching package for Emacs with primitives based on syntax tables, replacing Smartparens, Paredit, and Electric Pair mode. This is still relevant but bandwidth has not been available to drive the project to completion.
- Riju (Summer 2020 – Winter 2021; source): Extremely fast online playground for every programming language. Currently working on port to Kubernetes to improve maintainability.
- Shallan (Spring – Summer 2021; not yet published): Personal music library player combining the user-friendly interface and cross-device synchronization of YouTube Music with the flexibility and ownership of a self-hosted open-source solution. Attempt #5 at a personal music library manager.
- Hypercast (Winter 2022): Free, no-hassle watch parties on every streaming platform. Implemented as Chrome and Firefox extension.
- dontbeevilmirror (Spring 2023): Anonymizing proxy CDN for Android apps pulled from the Google Play Store