Things I'm building
A RAG system that verifies every citation against the retrieved chunks before it ever reaches the screen, and answers the question of retrieval quality by measuring it rather than asserting it. The corpus is ~3,000 pages of the PostgreSQL 17 manual — full of passages that look nearly identical (pg_dump vs pg_dumpall, five different work_mem settings), exactly where naive vector search quietly returns the wrong paragraph. Across 46 evaluation questions, cross-encoder reranking scores recall@5 0.978 and MRR@10 0.834 against 0.652 for plain vector search, with citation validity at 1.000 and zero hallucinated citations out of 168. Embeddings and reranking run locally through ONNX, so ingestion makes no outbound calls at all.

An evidence-based, bilingual (EN/es-US) sobriety PWA that also ships as an Android app. Built on Better Auth, Drizzle, and Postgres with web-push notifications and offline (IndexedDB) support, wrapped as a TWA and published to Google Play. Positioned as a general-wellness tool, not a medical device.
AI sourcing assistant SaaS I built while preparing my own sourcing business. Analyzes Alibaba/1688 product screenshots with AI to calculate margins, assess risks, and auto-generate supplier messages. Solo full-stack development across web, desktop, and Chrome extension with Stripe billing, Shopify integration, and 5-language support.

A mental health SaaS I designed around Judith Herman's three-stage trauma recovery model. I built AI-guided journaling with a Gemini-powered crisis-detection safety pipeline (GREEN/AMBER/RED) — deliberately fail-closed on input and fail-open on output, validated by an LLM-judge eval harness with zero tolerance for missed crisis cases — plus peer support circles, Stripe billing, and an Android build via Capacitor, solo full-stack across web and mobile.

A real-time OSINT situational-awareness web app styled as an intelligence watch floor. I aggregated 10+ live public feeds (USGS, OpenSky ADS-B, CISA KEV, NASA, GDELT, CelesTrak…) through a config-driven feed registry with server-side caching, and visualized them across four views, including a Three.js 3D globe, a cyber-vulnerability board, and satellite/orbital tracking.

An open-source, bilingual (EN/ES) web app that estimates which rent law protects an LA renter — City RSO, AB 1482, LA County RSTPO, or just-cause — from their address, plus the current legal increase cap and a rent-increase legality checker. With no public RSO-registry API to lean on, I designed an 'honest estimator' over live LA County Assessor and US Census open data (cross-verified against the county roll), with a four-regime rules engine that leans protective at every ambiguous boundary and degrades to 'pending — confirm with LAHD' rather than ever being confidently wrong. Locked by 222 tests; a profiled indexed-query fallback cut lookups from 13–55s to ~1s. PageSpeed 100/100/100/100, WCAG AA in light and dark.
An Electron command deck for developers juggling a pile of Claude Code, Codex and Antigravity projects. It scans git repos under configured folders and surfaces git state, how long each has been neglected, and per-agent session history as cards, resuming your last session in one click. On Windows a Cockpit replaces the wall of external terminals with in-app ones: each session shows its model, active working time, a context percentage that colors up as it nears the limit, and a one-line summary of what it is actually working on — grouped by urgency, so you can see who is waiting on you. When AI refinement is on, each summary is condensed by that session's own agent CLI, so one vendor's quota is never spent on another's work. I treated Electron security as a first-class concern (contextIsolation, sandbox, argv-not-string-interpolation against command injection) and backed it with 465 tests and a Playwright + axe e2e gate.

A set of file-conversion tools that run entirely inside the browser, with no upload. Moving all free-tier computation to the client drops the marginal server cost to zero and turns "your file never leaves the machine" into a differentiator incumbents structurally cannot match — for them, server-side processing is the ad inventory. Image, PDF, video and audio conversion run on Web Workers and WASM (pdf-lib, pdf.js, libheif, mp4box, tesseract.js, DuckDB-WASM), results hand off directly from one tool into the next, and the site also ships explainer articles and a Lab. There is no backend at all.

A Next.js + Turborepo monorepo I assembled to ship many MVPs quickly, and the crypto horse-racing game actually shipped on top of it. Auth, billing, database, SEO, observability, security and analytics live as workspace packages each app opts into, and those packages were extracted from real usage rather than pre-invented — every integration gracefully no-ops until you add its key, so the app and its tests run without one. The game ships as a PWA wrapped in a TWA on Google Play.
An Android game I am building in Unreal Engine 5.8, built around a cairn of wishing stones with night ambience, a kept bell, and round-robin knock sounds. What distinguishes it is that the development loop is itself automated: an MCP plugin drives the Unreal editor, a Python screen audit captures and measures pixels every cycle, an audio audit checks the sound, and a release gate reads the built APK without needing a phone. The game logic is all Blueprint, with no C++ module.
A Chrome extension that overlays normalized unit prices ($/oz, $/fl oz, $/ct) directly onto Amazon, Weee and Target product pages, so comparing across mismatched package sizes stops being mental arithmetic. Zero backend dependency is a hard design constraint: inference runs in-browser on WebGPU via transformers.js, falling back to WASM and then to regex-only. Where the store already prints a unit price the extension adopts it instead of recomputing, and the best-value mark is placed so it never covers the store's own deal price.
A Chrome Manifest V3 extension that records Amazon desktop customer-support chats locally and exports a readable PDF plus a verifiable evidence ZIP. The ZIP carries a self-contained preservation HTML, a schema-versioned JSON, a plain-text copy, metadata (URL, local times, counts, completeness warnings), and SHA-256 hashes covering all four files and the PDF. There is no account, server, telemetry, or ad SDK, and no developer access to the contents; after a successful export the popup offers to delete the temporary recording. The product states plainly that its files are user-created records, not official Amazon transcripts.
A pipeline for finding local businesses, building them a static site up front, and pitching it through cold outreach. Lead collection, draft generation, review and sending are wired together in Python, with per-vertical templates (acupuncture, bakery, cleaners, salon) stamping out each draft. The review step was rewritten from a one-off script into a permanent gate that catches structural defects before anything goes out, and seven real client drafts have been built and deployed.

A web app that scores your outfit honestly from a single photo — rating color, fit, sizing, shoes, and situational appropriateness, then giving blunt advice. Next.js 16 and React 19 with Gemini 2.5 Flash Lite vision (structured responseSchema output); free, no sign-up, and uploaded photos are never stored. Trilingual EN/KO/ES.

A first-person, photorealistic walkthrough of an old one-bed Taiwanese apartment. A build-free static site that loads Three.js r184 via importmap, with a day/night cycle, door and fan interactions, and PBR textures. The furniture and appliance 3D assets were generated by my own pipeline (3d-asset-studio).
A local Electron dashboard that summarizes the key metrics of many Google Analytics 4 properties on one screen. Sign in once via OAuth 2.0 loopback and it aggregates every GA4 property you can access — active users, sessions, key events — each with a Δ% vs. the prior period. MIT open source with five UI languages; the third of the -deck family alongside DevDeck and MarketDeck.
A local-first Windows (Electron) tool + MCP I built to manage the marketing readiness of my whole ~40-project portfolio on one screen. It scans local git repos and scores each with 14 deterministic signals (README screenshot, demo-URL reachability, SEO meta, JSON-LD, CHANGELOG freshness…), producing a 0–100 score and a traffic light, sorting the least-ready first. No accounts, no telemetry — all local.

A gallery of six procedurally-generated low-poly Backrooms horror creatures, built from pure Three.js geometry — no Blender, no textures. Browse searchable cards, drop a creature into a fog-filled void viewer, and stare too long up close to trigger its per-creature jumpscare. Every creature exports as a reusable .glb.
A tray companion for Discord free users. It auto-compresses clipboard images that exceed the 10 MB free-upload limit (WebP→JPEG→downscale), and since v2.0 replaces the Nitro-gated emoji/sticker/GIF picker with a hotkey popup (WebView2, Discord-style dark UI) — no client mods, no account automation (ToS-safe by design), with APNG→GIF conversion and auto-paste on select while sending stays manual. Python, MIT, five languages.
A tool that turns any YouTube URL into a falling-lane rhythm game you play in the browser. It pulls audio with yt-dlp, analyzes BPM/beats/onsets with librosa to build a chart JSON, then plays it back via the Web Audio API. FastAPI backend + web frontend; personal-use and open source.

A browser simulator for turning car-centric LA into a transit city. It renders lines and 3D vehicle meshes over a real map with deck.gl and MapLibre, backed by Neon Postgres as the data layer. Built with Vite and Zustand.
An AI-native Next.js + Turborepo starter you assemble and own for shipping many MVPs fast — not a rented SaaS boilerplate, not a black-box fork. You wire vetted libraries (Next.js, Drizzle, Better Auth, Stripe, shadcn/ui) with pnpm generators, composing only what you need. Built to be driven by Claude Code via a root CLAUDE.md and a .claude/ directory of skills and subagents. Open source.

An anonymous venting PWA — the successor to Minddump. Built on the shipwright starter with Better Auth, an offline PWA shell, and file upload, then wrapped as a TWA and published to Google Play as 'Kindling: Vent Anonymously'. It targets Android 16 and opts into edge-to-edge display with safe-area padding.
A five-modality personal generation factory where Claude drives image, video, 3D, voice, and music through MCP tools — generate → machine gate → inspect the thumbnail directly → retry. I consolidated a shared kernel (GPU arbitration, a SQLite asset store, thumbnails, a common server skeleton), per-modality MCP servers, and a FastAPI + React gallery into a single monorepo via history-preserving subtree merges, centralizing the generation GPU, data, and frontend on one RTX 4080 laptop. The gallery now carries an agent harness: describe what you want in natural language and a local LLM calls the tools itself, walking generation through review. Character-preserving edits, a multi-hop lineage tree, collection filters and tag autocomplete make the library browsable. Asset lineage and review verdicts live in the DB so an agent's judgment flows back into the library, locked by 320+ tests. Development runs across two machines, with machine-specific values isolated into profiles and a six-layer fingerprint (code, Python, ComfyUI, models, runtime, machine) answering whether they are actually in the same state. It absorbs and succeeds 3d-asset-studio, which supplied the assets for Studio Apartment.
A production pipeline that turns subjects whose engineering setbacks and fixes survive in the record into English-language YouTube Shorts. Every video and voice asset comes out of my local generation factory (studios); this repo never copies an asset, referencing them by id only, and owns just the state — what stage an episode is at, and what was rejected and why. Seven stages run from candidate to published, each behind a gate. Fact-checking is not done until there are two or more sources, a check table with a row per narration sentence, and a written list of the numbers I decided not to use; an episode reaches review only after clearing a three-second average cut length and -14 LUFS; and production approval is the one step never automated — a human presses it. Assembly, cuts, overlays, subtitles, grading, sound effects and upload are chained through Node tooling, and after publishing the YouTube Data API snapshots performance so the next episode is designed on evidence. The first measurement is recorded as it came: 98.8% of views arrived from the Shorts feed against 0.4% from search, and — a negative result kept rather than buried — the episode that won on views actually lost more viewers in its opening seconds. It started on r/todayilearned material, then redefined what qualifies once it was clear the fixed four acts (subject, setback, reframe, birth) only hold when the subject itself contains a setback and a fix.
A personal research project that quantitatively analyzes why some YouTube music videos travel and others are buried, running 100% locally. An extreme-group design compares the top 25 and bottom 25 by views-per-subscriber across 50 Vocaloid MVs, replicated on 50 K-pop MVs. Effect sizes are reported as Cliff's δ for cuts per minute (23.9 vs 5.5), median shot length (1.5s vs 6.2s) and whether the thumbnail carries text (9/25 vs 24/25) — and the signals that do not separate the groups (lyric themes, sentiment, song length, upload time) are written up separately as genre convention rather than quietly dropped. Collection runs on yt-dlp, scene boundaries on PySceneDetect, audio on librosa, scene tagging and hard-sub OCR on a local VLM (Ollama qwen2.5-vl), and lyric transcription on demucs plus faster-whisper, with GPU stages serialized so they never overlap inside 16 GB of VRAM. One cycle-one finding — that a premiere release helps — vanished under a within-channel matched reanalysis of 55 pairs (Wilcoxon p=0.46), so it is recorded as channel-level confounding and the project publishes the reversal of its own result. An IMRaD paper draft is complete; the code opens once data reliability is further validated.
An operations toolkit for driving my 4080 AI server over SSH (via Tailscale). It ships a wrapper that sends PowerShell safely as an EncodedCommand, idempotent ssh-alias setup, and status checks for GPU/ports/Funnel/Caddy — designed so a Claude Code session can operate the box directly. Internal tooling.
A personal-productivity program that synthesizes my favorite character's voice to nag me about my to-dos on a tablet PC. Claude writes context-aware nagging lines, and loudness-normalized character voice clips make avoidance expensive — a 'sulky coach' persona that only gets more persistent the more you ignore it.
A habit-breaking app I built from my own experience with trichotillomania. Detects hand-to-face contact in real time through your webcam and alerts you instantly. Customize detection zones for scalp, eyebrows, cheeks, and more, then track your progress with daily stats and streaks. All video processing stays on your device — nothing is ever sent externally.

A horoscope content platform aimed at the US and Latin American markets, now also an Android app. I built a birth-chart calculator on real planetary positions (astronomy-engine) and statically generate zodiac, compatibility, and astrology-learning pages across a three-language (EN/ES/PT) SEO architecture designed to capture organic search traffic. The PWA is wrapped as a TWA and published to Google Play as 'Zodiacly: Zodiac Compatibility', and I fixed the sitemap and schema.org dateModified silently tracking build time on every deploy.

A web app for discovering places across Greater LA — beaches, hikes, date courses — reachable without a car. I built the full data pipeline (GTFS ingestion, OSM scraping, PostGIS reachability scoring) and ran a self-hosted OpenTripPlanner 2 instance for live multimodal routing. To keep recommendations honest I reconciled straight-line 'nearest stop' estimates against the real router from multiple origins, and deployed the whole thing through a GitHub Actions CI/CD pipeline on Docker.
A multi-user PWA that turns a receipt photo into a tidy budget entry — Gemini OCR extracts merchant, total, date, and category. I scoped every endpoint per user (down to the SSE-stream and image-serving seams), made the usage quota concurrency-safe with transactional row locks, and added a janitor that reclaims OCR jobs stranded by a mid-process redeploy. More recently I added a weekly report that emails cron-scheduled spending insights.
A real-physics multiplayer browser game inspired by SpaceX's Mechazilla booster catch. I implemented suicide-burn physics calibrated against public SpaceX data, real-time competition and a leaderboard on an authoritative Colyseus server, and Three.js WebGL rendering with nine camera modes and a bilingual EN/KO UI.
A self-hosted image and video generation platform that uses Claude Code as an automated prompt engineer — turning Korean or English input into optimized prompts and ComfyUI API-format workflow JSON. I built the full multi-user layer around it: a sequential job queue, thumbnail pipeline, and a social gallery with likes and comments.
A Windows tray app for the TP-Link Kasa KL125 smart bulb. I drive the bulb directly over the LAN with python-kasa and built an Ambient mode that samples a selected monitor's dominant color in real time and mirrors it to the bulb — Philips Hue Sync for a single bulb. Built with PySide6 with multi-monitor selection, global hotkeys, a color-preset library, and a bilingual KO/EN UI; credentials live in Windows Credential Manager and it ships as a single-file EXE via PyInstaller.

A WW2 browser FPS/defense game holding the 1944 Normandy cliffs. I built a hybrid battlefield in Three.js — commanding infantry, operating tanks, helicopters and fighters, naval engagements, and an RTS-style supply-truck economy — with PeerJS-based P2P co-op multiplayer and a bilingual KO/EN UI, shipped as a single deployable HTML build.
A local tool that auto-transcribes piano performances from an audio file or a YouTube URL into sheet music (PDF/MusicXML) and MIDI. It extracts notes with a PyTorch piano-transcription model and renders scores through the MuseScore CLI, with a pipeline that still returns partial results when a conversion step fails.

A real-time, participatory web app inspired by the divergence meter in Steins;Gate. It pulls live news feeds from Reddit to nudge a shared world-line value, and lets visitors submit positive observations ("D-Mails") that pull the divergence toward its canonical attractor. I hand-built the nixie-tube / neon-CRT terminal UI.

A local-business review-analysis SaaS: paste a Google Maps or Yelp URL and it scrapes the reviews, analyzes them with AI, and returns scores, keywords, and growth suggestions. I built the full stack — a FastAPI backend that scrapes with Playwright and analyzes with OpenAI, and a React frontend with a React Three Fiber 3D card UI.

A web hub collecting several mini-games plus a standalone Socket.io multiplayer server. It serves five games built on different engines (2D Canvas, Babylon.js, CesiumJS, Three.js): an escape racer, a 3D survival world, a flight sim over real Earth, a desert drifter, and Fryffel Tower. Most recently I built a 3D fry-stacking game on cannon-es physics with real-time 2–4 player competitive multiplayer — each client simulates its own tower while the server relays heights and adjudicates best-of rounds — with pure logic under Vitest and the games under Playwright E2E, gated in GitHub Actions CI.

A comedic PS2-retro construction-management game where a hot-tempered foreman bullies incompetent workers into raising a building. I designed a double-edged-sword loop — pushing workers boosts output but raises their rage, leading to slacking, sabotage, fleeing, or riots — with delegating AI managers (veteran/drill/vibe/intern), deterministic seeded RNG, and pure-logic unit tests. Built on build-free Three.js ESM with a PS2-style render pipeline (vertex snapping, dithering, fog), including a Story Mode (Act 1). Extracted from Mini Games into its own repo.