Projects

Current work.Four codebases, all in active use.

The software I am building and maintaining right now. Each repository carries an up-to-date README covering architecture, technical choices and current status — written to be read, not archived.

01

ProfileForge

A self-hostable Next.js app that turns an uploaded CV into a structured profile with bullet-level provenance, then generates a tailored CV and cover letter for a given job description. Matching and scoring are deterministic functions; the LLM (via the user's own OpenRouter key) only extracts requirements and rewrites evidence-keyed content, so every claim traces back to profile data. PDF exports are gated by a two-level text-extraction check before they can be downloaded.

TypeScript · Next.js 16 · Prisma · CI green — GitHub →
02

RunLens

An Android app that reads the latest Garmin run through Garmin's Personal API and enriches it with the original FIT file for per-second running dynamics. A pure-Kotlin analysis engine computes aerobic decoupling, grade-adjusted pace (Minetti model), HR-zone distribution and form trends, then a tip engine turns those numbers into prioritised recommendations that cite them. Works offline, with FIT-based fallbacks when Garmin's curated endpoints come up short.

Kotlin · Compose · FIT SDK · v1.0.0 — GitHub →
03

sleep-analysis

A privacy-first Android sleep tracker. Overnight audio runs through a microphone foreground service; snore bursts are detected on-device with a spectral heuristic and stored as short event clips with full provenance in Room — full-night audio never leaves the phone. An optional Garmin import adds wearable context, explicitly labelled as vendor estimates, and a small Python toolchain supports fixture tuning and analysis.

Kotlin · Compose · Room · private repository — GitHub →
04

stillroom

Offline breathing, attention and focus practice where all sound is synthesised live: an AudioWorklet layers filtered noise into non-looping soundscapes, scheduled on the Web Audio clock with a fixed lookahead so timing never depends on the UI. A native foreground service with a media session keeps sessions running while the phone is locked, mapping audio-focus changes to a unit-tested pause/duck/resume policy.

React 19 · Capacitor · Web Audio · v1.2 — GitHub →

RunLens lives in the analysis-garmin repository. sleep-analysis is private while the detection work settles; its README is kept current regardless.

The common thread

Small, inspectable systems.

Local-first where the data is sensitive, deterministic where correctness matters, and documented enough to pick up and run. Tests and CI over promises.

How I work →