Apps

Everyday apps I've built to solve real problems.

CPA Study App

An offline-first study app for CPA exam prep โ€” adaptive quizzes, a full analytics dashboard, and a built-in tutor, with no backend at all.

Installable and works without a connection, running entirely client-side in vanilla HTML/CSS/JavaScript with zero backend or framework. Deployed as a static site on Vercel with custom cache-control headers so service worker and manifest updates roll out immediately instead of going stale. Features an adaptive quiz engine (weak-area drilling, timed mode, custom quizzes, question-of-the-day), a full analytics dashboard (accuracy, streaks, topic breakdowns, weekly heatmap), multi-profile support with JSON backup/restore, and a built-in tutor that explains every question three ways โ€” plain English, step-by-step, and "why the trap."

Vanilla JavaScriptProgressive Web App (PWA)Offline-first / service workerVercel deploymentClient-side state & analytics

Opportunities to learn

  • Having built state management from scratch in vanilla JS, a future project could compare how a framework like React handles the same problem
  • Now that offline-first caching works end to end, a future app could add real-time sync across devices once there's an actual backend

Doorstop

A pre-leave checklist app โ€” swipe through stove, locks, and garage before you walk out the door, with streaks and cross-device sync.

Set up a checklist once (stove off, garage closed, doors locked...) and swipe through it every time you leave, like a pre-flight check for the house. Each item is a full-screen card โ€” swipe right to confirm, left to flag it for a second look. Supports multiple profiles ("Leaving for work" vs. "Leaving for vacation", each its own ordered subset of items), a streak and history log, and accounts with row-level-security-scoped Supabase sync so the same checklists show up on every device. Also includes an honestly-scoped location nudge: while the app is open it can flag that you've left home without checking in today, clearly labeled as foreground-only, since a browser tab can't watch location in the background the way a native app could.

ReactTypeScriptViteTailwind CSSFramer Motion (gestures)PWA / offline supportSupabase (Postgres, Auth, Realtime)

Opportunities to learn

  • Having built a foreground-only geofence nudge here, a future project could explore a native wrapper (Capacitor, React Native) to get real background location
  • Now that Supabase realtime sync (postgres_changes) works end to end, a future project could reuse the same pattern for any multi-device app that needs live sync