Products
Things I have shipped
11 cards. Status is honest: live store listings, open testing, GitHub, or still a WIP.
Chrome extension
QA Studio Pro
Local-first record and replay for QA flows. Capture once, run again — on your machine. No account, no server, no AI.
Stack
- TypeScript
- Manifest V3
- Chrome DevTools Protocol
- Dexie / IndexedDB
- esbuild
- Tailwind CSS
- Vitest
What I built
I needed to record a real-site flow without writing a Playwright harness first. A content script captures clicks, typing (including contenteditable), uploads, drag-and-drop, and SPA navigations; replay attaches chrome.debugger and fires CDP input, with selector retries and wait-for-settle. Flows group into folders (fail-fast run), swap environments via {BASE_URL}-style variables, and export JSON, YAML, or Playwright TypeScript. Storage is IndexedDB in this browser.
Android
InFlow
A private second brain. Notes, links, photos, voice, and tasks on-device, with optional Google Drive backup. Play listing may 404 until it is public.
Stack
- Kotlin
- Jetpack Compose
- Material 3
- Coroutines
- Google Drive API
- Coil
- Media3
What I built
I wanted a vault that works offline and treats Drive as backup, not a product cloud. The app writes a versioned JSON vault (schema 7, soft delete) to app-private storage; Google sign-in is optional and uses drive.file under InFlow/inflow-db.json plus attachments. Home is a share-target composer (text, links, photo, voice, files). If the device and Drive both changed, it asks which copy to keep. Compose UI is screenshot-tested with Roborazzi.
VS Code extension
Telegram Agent Console
A side panel for chatting with one Telegram bot — typically the agent on your machine. Read, reply, slash-command typeahead. Own site later; GitHub for now.
Stack
- TypeScript
- VS Code Webview
- gramjs / MTProto
- esbuild
- SecretStorage
What I built
My agent only speaks Telegram, so I was leaving the editor every time it pinged. The extension logs in as my user over MTProto (not the Bot API), mirrors one bot chat in a side-panel webview, and stores api_id / api_hash / session in OS-encrypted SecretStorage. Slash-command typeahead comes from the bot's registered commands. Scope is cut on purpose: no chat list, no media gallery, no notifications after VS Code closes.
Web app
mymarkdown
Fast markdown editor for local browser notes and real files on disk. Folder tree, auto-save, live preview.
Stack
- React 19
- TypeScript
- Vite
- Tailwind CSS v4
- Zustand
- File System Access API
- react-markdown
What I built
I wanted an editor that can open a real folder, not only notes trapped in the tab. The File System Access API plus idb-keyval keeps the directory handle; edits debounce-save (1s) back to the original .md file. Local notes still live in localStorage for browsers without the folder API. Live GitHub-flavored preview, dark/light, search, and session restore of the last folder.
Android
Mindful Work
A calmer launcher for focused work. List-based app menu, usage insights, and limits — less visual noise, more intention.
What I built
Play listing: a list-based home without app icons, usage tracking, and per-app limits so the screen stays quieter. No public source repo turned up for this package (com.app.mindfulwork), so the stack stops at Android. Last Play update: 13 Sep 2023.
Windows
localdevenv
WinUI 3 dashboard for local development: parse projects, run tasks, watch ports and processes, manage env files in one place.
Stack
- C#
- WinUI 3
- .NET 8
- Windows App SDK
- SQLite
What I built
I wanted one Windows window instead of a pile of terminals for local-dev clutter. It parses package.json, Cargo.toml, pyproject.toml, requirements.txt, .csproj, and docker-compose; edits .env files with secret masking; maps ports to PIDs and can kill them; and talks to local Postgres / MySQL / Mongo / Redis. Service interfaces plus DI (project parse, processes, tasks, logs, versions, dependency audit).
Web app
webcrecorder
Browser recording studio — camera, mic, and screen with picture-in-picture. Recordings stay in a local gallery. Previous Vercel deploy is gone; GitHub is the source.
Stack
- React 19
- TypeScript
- Vite
- Tailwind CSS
- Electron
What I built
A recording studio in the browser (README: Lumina Capture) using camera, mic, and screen capture with a picture-in-picture overlay and a local gallery to rename, download, or delete takes. The repo also packages the same UI with electron-vite / electron-builder for a Windows desktop build. The old Vercel URL is gone.
Android
waterintake
Kotlin / Jetpack Compose tracker for daily water intake — goals, reminders, charts. Still being built.
Stack
- Kotlin
- Jetpack Compose
- Hilt
- Room
- WorkManager
- Coroutines / Flow
What I built
WIP hydration tracker: log intake, set a daily goal, ml or oz, reminders, dashboard charts, streaks, and export/backup. Clean Architecture (data / domain / presentation), Room for history, Hilt for injection, WorkManager and AlarmManager for reminders.
Fitbit
mindfulminutes
Clock face for Fitbit Versa 3. Minutes, not noise.
Stack
- JavaScript
- Fitbit SDK 6.1
- Versa 3 (atlas)
What I built
A Versa 3 clock face: hours/minutes/seconds, date, weekday, live heart rate, and step count, with a settings companion and an optional haptic pulse. Built with @fitbit/sdk ~6.1 against the atlas target.
Fitbit
digital_matrix
A matrix-style clock face for Fitbit Versa 3.
Stack
- JavaScript
- Fitbit SDK 6.1
- atlas / vulcan
What I built
Analog-style hands on a matrix-looking face, plus date, weekday, heart rate, and steps. Same Fitbit SDK 6.1 toolchain as mindfulminutes; build targets atlas (Versa 3) and vulcan (Sense 2).
Library
timerjs
A small JavaScript timer class: start, pause, stop, reset, and callbacks when the clock changes state.
What I built
A single-file IIFE Timer: countdown via setInterval, hh:mm:ss on a target element, and onStart / onPause / onStop / onReset / onFinish hooks. No build step, no dependencies.