work

personal projects. my day job is consumer real‑estate software at luxury presence, which mostly is not mine to publish, so what follows is what i build on my own time. the ones with public source link to it.

tuna

offline-first android music player where playing is caching

every track you play is cached in full, so offline playback needs no download step. eviction is lru with a hard protected set: liked songs, playlists, and the current queue are never touched, and the storage cap is a slider. endless radio queue and android auto.

kotlin, jetpack compose, media3, room, hilt

win-text-inject
github

deliver text into the focused windows app without destroying the clipboard

a rust crate for the last step of every dictation tool: putting text where the caret is. instead of restoring the clipboard on a timer, it publishes a delayed-render promise and restores after the target has actually read the text, so slow apps stop receiving your previous clipboard. clipboard-history opt-out formats, modifier sanitization, and integrity-level checks included. born from a bug that every tool in the category shipped with.

rust, win32

dictate
github

push-to-talk dictation for windows in about a thousand lines

hold a key, speak, release, and the text lands wherever you were typing. no window and no webview: configuration is one toml file, feedback is a tray icon and a small bubble that follows your microphone level without taking focus. transcription runs locally with the model held resident, and text delivery goes through win-text-inject.

rust, win32, cpal

camelo

self-hosted discord bot with a local llm dj

music player with a natural-language dj that takes requests in english and portuguese, a price watcher with drop alerts and screenshots, and reminders. all ai runs locally through ollama, so the bot needs no cloud keys and conversation stays on the box. deploys as a hardened docker container.

typescript, discord.js, sqlite, ollama, docker

ash lumen
github

a monochromatic design system for code-adjacent interfaces

hierarchy through luminance instead of hue. tokens are authored once in dtcg json and compiled to css custom properties, so light and dark resolve from a single source with no dark: prefixes anywhere. semantic color is reserved for meaning, and even the diagnostics are desaturated so a green tag never shouts louder than a headline. ships with a matching vs code theme and the shiki grammars to go with it.

astro, tailwind 4, dtcg tokens, shiki

this site

the design system, eating its own cooking

edfl.dev is built entirely on ash lumen, which is the point: a design system nobody uses is a mood board. the token pipeline that themes the blog is the same one published in the package, so anything that breaks here breaks in public.

astro 6, tailwind 4, vercel

habit-tracker
github

local-first, no backend, no account

react 19 and typescript, with dexie over indexeddb doing the persistence. there is no server, which is the whole constraint: streaks, completion history and the heatmap are all derived on the client from whatever is in the local store, and the app has to keep working with the network off. the streak arithmetic is fiddlier than it looks once you decide what counts as a missed day and whose midnight you are counting from.

react 19, typescript, vite, dexie/indexeddb, tailwind 4