Projects

Personal projects built to solve problems I encounter.

A secure file sharing platform with end-to-end encryption, granular permissions (view/edit, time-limited links), and a minimal registration process, built with Rust + React/TypeScript

Lokr is a secure file sharing platform with end-to-end encryption, granular permissions (viewer/editor/password links), and a minimalist registration process (username + password only, 2FA). Built with a Rust backend and React/TypeScript/MUI frontend, it runs live at lokr.cyanistic.com and supports both account-based and anonymous uploads. Deployed to an Ubuntu server via Cloudflare Tunnels with GitHub Actions for continuous deployment.

Compile-time trait reflection for Rust. Register a capability once per trait and discover it on any type, on stable.

Every other tool wanted per-type setup. That missed the point. I register once per trait. It covers each type that fits. Past, present, future.

The part I like most is generic capabilities. Register once for Stream<Item = I> or Future<Output = O> and the compiler resolves the concrete item type at each probe site. Envelopes come in owned, shared, and mutable flavors, and registries keep slot numbers from colliding between libraries.

A cross-platform (Win/macOS/Linux) Tauri 2.0 desktop app for audio tag editing with real-time preview and metadata tools

I created this because I couldn’t find any mp3 tagging applications that I liked. So I made my own. A GUI version for the average user and a CLI for those who prefer the efficiency of the command line.

Keep the tools you need. Leave the rest in a catalog the model can search.

Keep the tools you need. Leave the rest in a catalog the model can search. It adds two moves. Search tools that are off with query_tools. Turn exact tools on or off with manage_tools.

Install with pi install npm:@cyanism/pi-toolbelt and check /toolbelt status. From the keyboard, /toolbelt tools stages a live set and /toolbelt settings edits the baseline. Install changes nothing until you pick a smaller set, which is the whole point.

A local music listening stats tracker, your personal Spotify Wrapped but for your entire music library

I got inspired to create this after noticing most people getting their Spotify wrapped at the end of the year, meanwhile I was just kind of left in the dark as to what I listened to. Mpdtrackr is much more powerful than Spotify wrapped when used with correctly tagged audio files, as it tracks listening time locally on a daily basis, allows you to group by different fields (e.g. title, artist, genre, album), and different time frames (e.g. day, week, month, year, all time) while providing a way to easily export your data in JSON format to another application better suited for data visualization. So instead of receiving wrapped data for only the past year, you can get it for the past month, past week, or any time range for that matter.

A compile-time template engine for Rust. Templates live in TOML, the output is const strings with zero runtime cost.

Tomplate started as a workaround for sqlx::query!. That macro wants a string literal, so you cannot hand it a const or compose fragments with ordinary code. I wanted reusable SQL pieces without giving that up, and it grew into a general compile-time template system.

Templates live in .tomplate.toml files. A build script turns them into const &str. Pick Handlebars, Tera, or MiniJinja. Eager mode feeds the result into other macros.

A safe Rust wrapper around the SoundTouch C++ audio library for tempo, pitch, and playback-rate control.

The old sys crate had no update in 5 years. So I wrote new bindings and a safe wrapper on top. It changes tempo, pitch, and playback rate. The API stays close to the original C++ one, so the upstream docs still apply.

Linking lives in the companion crate soundtouch-ffi, which handles bundled versus dynamic linking. The main crate stays a thin, safe layer on top: set channels, sample rate, and tempo, push samples in, read them back out.

A cross-platform CLI and GUI application to modify osu! beatmap parameters, built because the Windows-only trainer didn't work on Linux

I created this as cross-platform and CLI-friendly alternative to the popular windows-only application, osu! trainer. Since I use Linux on my main machine, osu! trainer didn’t work well at all and I couldn’t even get it to load. Eventually I decided it would be worthwhile to just make my own version with more features.

A CLI tool for escaping and unescaping sequences, built to make http requests from the command line easier.

I made this to make http requests from the command line easier.