projects
reverie#
present (work-in-progress)
reverie is a work-in-progress voxel rendering engine. I've been working on it on and off for a while, but most of my current progress is in backend Vulkan abstractions and multithreading technicalities, so I haven't actually tackled the bulk of the voxel rendering work yet, but I've mostly planned out the engine architecture already.
qalc.nvim#
(undergoing rewrite)

qalc.nvim is a reactive text-based calculator inside of Neovim. You can write expressions that depend on others, edit their values, and watch the results update in real time. With libqalculate as a backend, advanced features like unit conversion, algebra, and calculus are available and integrated with diagnostics, syntax highlighting, and autocompletion support.
lwk#
(undergoing rewrite)
return Document {
lang = 'en',
head {
meta { charset = 'UTF-8' },
title 'Hello world!',
},
body(p 'Hello from Lua!'),
}
lwk (Lua Website Kit) is a web templating engine/SSG in ~1300 SLOC. It's mostly a bespoke tool made for this website because I got tired of hand-writing HTML and CSS but didn't want to use a complex JS framework. It allows pages, templates, and reusable components to be authored with a Lua-based DSL, compiling them into raw HTML+CSS. It also supports file handlers (powerful enough to do something like write a markdown processor).
tspmo#

tspmo (TypeScript-Powered Media Organizer) is a basic tagged media gallery. It was built for organizing memes and reaction images for me and a few friends, and primarily designed for interaction via a Discord bot frontend, supporting in-app uploads and search through both tags and full-text search (title and description). It also supports importing posts from Tenor GIFs or attachments on Discord messages.
sidechain#
sidechain is a simple bulk audio transcoder. I wanted a way to automatically to mirror the lossless portion of my music library in Opus for my phone, and the existing solutions I found had limitations like re-transcoding lossy files, so I made this, which uses SQLite to track files and ffmpeg to transcode them, skipping previously transcoded tracks and passing through lossy tracks, album covers, and other unrecognized files.
raytracer#

raytracer is a path-tracing renderer in the browser that supports simple objects (ellipsoids and boxes). It uses a naive stochastic method to approximate realistic lighting, implemented as a fragment shader in OpenGL for GPU acceleration. It's written in Rust using egui for UI interaction and can run as a native application too.