projects

reverie#

present (work-in-progress)

  • Rust
  • Slang
  • Vulkan

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)

  • Lua
  • C++
  • Neovim
  • libqalculate

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)

  • Lua
  • HTML
  • CSS
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#

  • TypeScript
  • ElysiaJS
  • discord.js

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#

  • Rust

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#

  • Rust
  • GLSL
  • WebGL
  • egui

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.