Selected Projects
Thirty-nine projects: client systems, web apps, RAG and MCP experiments, PWAs, games and Chrome extensions. Each card links to the live site where one exists.
Thirty-nine projects: client systems, web apps, RAG and MCP experiments, PWAs, games and Chrome extensions. Each card links to the live site where one exists.
Six projects that show the most range: a safety-critical health app, a client HR system, RAG, row-level security, a Laravel PWA and a reconstructed game.
Laravel 12 · Livewire · Tailwind · Three.js · SQLite · PWA · Sentry
exec(), and 295 PHP and 14 JS tests. It is informational, with a visible disclaimer, not medical advice.
Django 5.2 · Django REST Framework · Vue 3 · TypeScript · Pinia · Tailwind 4 · PostgreSQL · Docker Compose · Nginx
Built for a client: internal system, no public link. Screenshot shows demo data only
React · Vite · Supabase (Postgres + pgvector, Auth, Storage) · Deno Edge Functions · Gemini · Tailwind v4
Next.js 16 (App Router) · Supabase (Postgres/Auth/RLS) · Vitest
Laravel 12 · PHP 8.2 · Blade · Tailwind v4 · Alpine.js · MySQL · Pest
.htaccess to beat a weak host-injected policy, a per-agent AI-crawler allow/deny list, route rate limiting, a 404 for inactive records, noindex on the logged-in shell, and a generated Open Graph image.
Laravel 12 · PHP 8.2 · Blade · Tailwind · Livewire 4 · SQLite · Pest · three.js
Client systems, tools, experiments and games.
Vite 6 · Three.js · GSAP + Lenis
Vite 6 · Three.js · GSAP + Lenis
Python · Django · PostgreSQL · QODBC
Internal enterprise system, no public link. Screenshot shows demo data only
Ruby on Rails 7 · ActiveAdmin · Devise · PostgreSQL · RSpec · Render
Private client system, no public link. Screenshot shows demo data only
FastAPI · Next.js 16 · React 19 · TypeScript
Next.js 16 · React 19 · TypeScript · Recharts
Python 3 · PySide6 (Qt6) · keyring · pytest
Built, cross-platform release candidate
Chrome Extension · Manifest V3 · declarativeNetRequest
declarativeNetRequest, ahead of Chrome's MV2 sunset.
Eleventy (11ty) · Vanilla JS · pdf-lib · fflate
innerHTML) in 9 tools, then closed title, meta-description and structured-data gaps across the site.
Chrome Extension · Manifest V3 · Playwright
Eleventy (11ty) · GSAP/ScrollTrigger · Three.js
Python · MCP Python SDK · httpx · Pydantic
Cloudflare Workers · Hono · D1 · Cron Triggers · Resend
Qdrant · LangChain · RAGAS · MCP · LangGraph · CrewAI · Gradio
Vite · React 19 · TypeScript · Supabase (Postgres + RLS) · vite-plugin-pwa
SECURITY DEFINER function with anonymous execute revoked: owner-only records, a revocable read-only share, and an invite, claim and owner-approve handshake. No permission checks in the application layer.
Eleventy · GSAP & ScrollTrigger · Web3Forms
Next.js 15 (static export) · React 19 · Tailwind v4 · shadcn/ui + Base UI · TypeScript
prefers-reduced-motion timing bug, a single-source-of-truth violation and an invisible focus indicator before merge.@theme inline gotcha where a CSS custom-property override compiled to a dead value, and a Base UI button-versus-anchor semantics warning.
Laravel 11 · PHP 8.2 · Blade · Tailwind · Alpine.js · Livewire 3 · SQLite · Pest
exists:categories,id, so a forged ID leaked another user's private category name onto the attacker's dashboard. Closed with policy authorization and mass-assignment hardening (user_id removed from $fillable, relationship-based creates).
Laravel 12 · PHP 8.2 · Blade · Tailwind · Alpine.js · Livewire 3 · SQLite · Pest
game:sweep runs seeded nights across a level and shrine-level grid and flags "no wall", "pushover" and "spike" cases, and game:progress runs Monte-Carlo player trajectories under different spend policies to report median, p10 and p90 nights to the boss.Livewire::test(...)->set('state.rewards.gold', 999999999)->call('claim') credited the forged amount. Fixed by recomputing rewards inside a database transaction from server-only session state.
Laravel 12 · Blade · Livewire 4 · Tailwind 4 · SQLite
<meta http-equiv> tag the host can't touch, and a test decodes the HTML entities to prove they match.
React · TypeScript · Vite · Dexie (IndexedDB) · Tailwind · Playwright · PWA
Scripture text: World English Bible, public domain
Three.js · matter-js · Vite · PWA · Vitest · Playwright · Sentry
Unofficial, non-commercial fan project
Three.js · Vite · PWA · Vitest · Playwright · Sentry
Vary: Origin header, and vendored 28 costume pairs with a wardrobe.Unofficial, non-commercial fan project
Three.js · Vite · PWA · Vitest · Playwright · Sentry
Unofficial, non-commercial fan project
Three.js · Rapier · Vite · PWA · Vitest · Playwright · Sentry
'wasm-unsafe-eval' in the CSP, then added the directive and lazy-loaded the physics so the first load dropped from 5.0 MB to 684 kB.Unofficial, non-commercial fan project
Three.js · Vite · PWA · Vitest · Playwright · Sentry
Unofficial, non-commercial fan project
Three.js · Vite · PWA · Vitest · Playwright · Sentry
Unofficial, non-commercial fan project
Three.js · Vite · PWA · Vitest · Playwright · Sentry
Unofficial, non-commercial fan project
Vue 3 · TypeScript · Three.js · Vite · PWA · Vitest · Sentry
Unofficial, non-commercial fan project
Finished builds that are not deployed or are shelved for now.
Next.js 16 · TypeScript · Prisma 7 + PostgreSQL · Playwright · Cheerio
Built, not deployed. v2 rebuilds the same concept on Prisma, PostgreSQL and a scheduled sync
TypeScript · Node.js · Express · Puppeteer · FFmpeg
Built, not deployed
FastAPI · yt-dlp · curl-cffi · React 19 + Vite
Built, not deployed
Next.js 16 · TypeScript · Cheerio · lightweight-charts
Built, shelved for now