projects
omnia#
present (work in progress)
omnia is a work-in-progress tag-based file organizer. I'm working on this because I wanted a general-purpose tag-based file organizer for saving and sharing memes, wallpapers, music, textbooks, and other files, but none of the existing softwares had all the features I wanted. I plan to support files of any type, full-text search, predicate-based access control, and external file libraries. This is a ground-up redesign of an older project that I am no longer satisfied with.
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. Because of this, I haven't actually tackled the bulk of the voxel rendering and graphics 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. It allows you to 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).
sidechain#
sidechain is a simple bulk audio transcoder. The existing solutions I found for mirroring lossless music libraries to lossy formats had limitations of some kind, so I made this. Designed to be run in a cron job or systemd timer, it uses SQLite to track files and ffmpeg to transcode them, skipping previously transcoded tracks and passing through lossy tracks, album covers, and other non-audio files.
raytracer#

raytracer is a path-tracing renderer that supports simple objects (ellipsoids and boxes). It uses a naive stochastic method to approximate realistic lighting, implemented in a fragment shader in OpenGL for GPU acceleration. It's written in Rust using egui for UI interaction and can run either in the browser (via WebAssembly and WebGL) or as a native application. It's not super optimized and was mainly built while I was learning basic graphics programming concepts.