TwatBot (2023)

A Discord bot that listens for Twitter/X links and replies with a Nitter link. Nitter is an alternative frontend for Twitter which does not require a Twitter account to view.

It is written in Rust using Serenity to interact with Discord.

Eclipse (2023)

Screenshot of Eclipse

A tool for visualizing GLSL shaders. It is written in Lua using the Love2D framework. It is designed to be compatible with shaders from ShaderToy

Orbs in Space - Love2D Game Jam entry (2023)

Screenshot of Orbs in Space

A game made for the Love2D Jam 2023. The theme is "Connection".

You are an orb whose only method of movement is to emit mass in the opposite direction. In order to recover mass you must absorb smaller orbs. The goal is to absorb enough mass to become the largest orb in the level.

Orbs in Space is written in Lua using the Love2D framework. It uses an ECS architecture.

Advent of Code Solutions (2019-2023)

Advent of Code is a yearly programming challenge. Each day in December, a new Christmas themed puzzle is released. I've been participating since 2020.

I like to use Advent of Code as an opportunity to practice a new language or programming paradigm. In 2019 I wrote my solutions in Rust. In 2021 and 2022 I used it as an opportunity to learn pure functional programming in Haskell.

osu! Rapid Host (2022)

A bot that manages osu! multiplayer lobbies. It automatically chooses maps based on the provided filters, and starts the game when all players are ready.

It includes a tool to scrape data for all ranked maps from the osu! API and store it in a sqlite database. This allows the bot to quickly find maps that match the provided filters.

The bot is written in Typescript, and uses bancho.js to communicate with the osu! API.

Opine (2022)

A global state management library for React. It is inspired by zustand, but with the goal of providing an intuitive API around a strictly sliced store structure which is more suitable to large projects.

Zustand allows for a sliced store structure, but it does not prevent actions from modifying state outside of their slice. Opine enforces a strict structure where each slice contains mutations that can only affect that slice. Actions that should affect multiple slices are performed using composition. This makes it easier to reason about the flow of data through the store.

Opine is written in Typescript. It uses the modern useExternalSyncStore hook to inform React of state changes. It has built-in support for Redux's dev tools.

Opine is currently a work in progress, and is not yet ready for use.

Keeb Pro (2020)

Screenshot of Keeb Pro

A typing test built with svelte. It prompts the user to type a random selection of common English words, and displays the user's typing speed in words per minute.

Xorg Autopulse (2018)

A linux utility which automatically changes the audio output device for a given application based on which display its window is on. This is useful if you have a TV connected to your computer, and want to automatically switch the audio output to the TV when you drag a video player to it.

Since most Linux distributions now ship Wayland instead of Xorg, and Pipewire instead of Pulseaudio, this tool will no longer work on modern systems.

Motion (2017)

Screenshot of Motion

Motion is an animation library for the Love2D game framework. It includes a companion GUI tool for composing animations from spritesheets. Motion allows callbacks to be registered for animation events, such as the end of a loop.