Web application for discovering single-player games. Includes user accounts, newsletter signup, production hosting, and a mobile app shell. A production product I built and operate myself.
Most discovery tools mix multiplayer noise into the catalog. This product is built for single-player only — find games, keep a personal list, and skip the multiplayer-first clutter, battle-pass pressure, and endless uncurated dump.
Outcome: a public site with dual catalog (editorial + algorithm), accounts and cloud-synced My List, newsletter + welcome email, blog, Stuck Assist (ranked video/guide links for in-game moments), production HTTPS hosting, and a Capacitor Android shell on the Play path.
Delivery shape: roughly two weeks of focused work after a mid-project pause (~eight intensive build days order of magnitude) — plan through deploy without a handoff chain.
Static frontend on a self-hosted origin; auth, database, and edge functions on Supabase; email via Resend. No application server on the home box beyond Caddy serving files.
flowchart TB A["Browser / Android"] --> B["Cloudflare"] B --> C["Caddy static files"] C --> D["Supabase Auth + Postgres"] C --> E["Edge Functions"] E --> F["Resend / Stuck Assist"]
Product site: singleplayergamers.com is on Cloudflare Pages. Game covers sit on R2.
This case study is a page on dunleavyorganization.com (also Cloudflare Pages).
Cloud services (not on the home box): Supabase (auth, Postgres, edge functions) and Resend (transactional email). Game catalog browse works from static JSON even if Supabase is paused — My List / auth / newsletter depend on Supabase.
Deploy: catalog scoring on the Windows machine, then
publish_pages.ps1 to Cloudflare Pages. Covers go to R2. Secrets stay off the browser and off the public repo.
Chosen for speed, maintainability, and a solo operator — not a large platform team.
| Layer | Choice | Why |
|---|---|---|
| Frontend | HTML, Tailwind CDN, vanilla JS | No build step; fast iteration; easy static deploy |
| Game data | Static JSON (curated + algorithm catalogs) | Git-tracked; works without a DB for browse |
| Scoring / ingest | Python + RAWG + IGDB (+ Steam where app id known) | API keys stay local; deploy only the result JSON |
| Backend | Supabase (Auth, Postgres, RLS, Edge Functions) | Accounts, My List, newsletter, Stuck Assist API surface |
| Resend (+ Edge Function welcome flow) | Reliable transactional delivery | |
| Hosting | Ubuntu + Caddy + Cloudflare | Self-hosted control + edge performance / TLS |
| Mobile | Capacitor (Android shell) | Same web app packaged for Play Store path |
| Analytics | Google Analytics 4 | Traffic and conversion events (e.g. newsletter) |
Want a product built end to end?
Brief project notes are enough — I reply by email.