Hosting & Making the Website Public
Current state
The whole product already runs on one Cloudflare Worker (tallycaddy) backed by D1 (tallycaddy-cms), R2 (tallycaddy-media) and KV (session store). The problem: the middleware gates almost every public path behind the CMS login, so the site is invisible to visitors.
1Get the domainfirst step
Register tallycaddy.com (or .app / .games). Register it through Cloudflare Registrar so DNS, SSL and proxy all live in one place at cost price. Skip third-party registrars with upsells.
- Add the zone to the same Cloudflare account that hosts the Worker.
- Enable proxy (orange cloud) for automatic SSL + DDoS protection.
- Optional: add a www subdomain and redirect to the apex.
2Point the Worker at the domainsoon after domain
Add a custom route so the Worker answers at the real domain, not just tallycaddy.vitalisdexter.workers.dev.
- In apps/website/wrangler.jsonc, add "routes" with custom_domain: tallycaddy.com (and a wildcard if wanted).
- Keep the workers.dev URL as a fallback while DNS propagates.
- Redeploy: npm run deploy -w @tallycaddy/website (wrangler deploy).
3Open the public pages to visitorsthe key unlock
Relax the auth gate in apps/website/src/middleware.ts so the marketing site is public while the CMS stays locked.
- Whitelist: /, /play/, /help/, /blog/ and the read-only content API (/api/content/*).
- Keep login-gated: /cms/*, all write endpoints (/api/cms/*), and admin.
- The blog already reads from D1, so the cleaned titles from today will show immediately.
4SEO, analytics & polishbefore heavy promotion
- Add a sitemap.xml, robots.txt and Open Graph tags on blog/article pages.
- Add privacy-friendly analytics (Plausible or Umami) on the site and a lightweight event tracker in the app.
- Submit the sitemap in Google Search Console once live.
- Set up Cloudflare Web Analytics (free, no script needed for the site).
5Publish the app to storesafter site is live
- Android: build a release AAB (gradlew bundleRelease) with a real keystore, enroll in Play App Signing, list with package app.tallycaddy.companion. Never publish the debug APK.
- iOS: join the Apple Developer Program and ship via App Store Connect (needs macOS/Xcode).
- Keep the local debug APK pipeline for testing only (scripts/build-android.ps1).
Monetization
App + Website1App: remote-controlled ads (already built)
The app already ships an ad system driven by the remote control config. Flip a toggle in the admin panel and every installed client picks it up on next launch/resume — no store update needed.
- Enable advertisingEnabled and per-slot enabled in the control panel.
- Swap the placeholder iframe provider for a real network (AdMob or AppLovin) in the native shell to get actual revenue.
- Keep interstitial gating with the skip delay to protect UX.
2App: Pro tier / one-time unlockhighest value
Offer a Pro unlock (one-time, e.g. $3.99–$6.99) via Play Store billing / App Store IAP:
- Remove ads.
- Unlock premium asset catalogues (themed boards, extra cards).
- Unlimited players, advanced stats, custom themes, data export.
- Tip jar (one-time donations) as a low-friction option.
3Website: affiliate revenuefastest start
- Join Amazon Associates and recommend board-game sets, card sleeves and accessories from blog posts.
- Add contextual affiliate links inside the 6 strategy articles already live.
- Add a “Shop these games” block on the home page.
4Website: display ads & sponsored contentafter traffic
- Once the blog has steady traffic, add display ads (AdSense or a premium network) on article pages.
- Sponsored posts from board-game brands and small publishers.
- Digital products: printable score sheets, strategy PDFs, custom-catalogue packs ($2–5 each).
5Reuse the existing remote config for all of itarchitecture win
The control panel already pushes branding, defaults and ad toggles to every app. Extend it with a monetization section: feature-flag Pro features, gate catalogues, control ad density — all kill-switched remotely without app updates.
Improve Without Breaking What Works
1Keep the stable-line workflow (already restored)
main stays the public, shippable line. All WIP lives on features/* branches and only merges when it passes local builds and tests.
- Tag every release (v0.18.1, next v0.19.0…).
- Release builds come from main only — the debug APK pipeline (scripts/build-android.ps1) stays for testing.
- Rollback = checkout the last release tag. Cheap and safe.
2Keep the dual-state model honest
The biggest risk is drift between the deterministic core and the legacy DOM state in app.js. Protect the bridge:
- Never mutate the DOM ledger without going through the snapshot ↔ core reconciliation (appSnapshotFromCore / normaliseAppSavedGame).
- Keep core tests green before any merge (npm test -w @tallycaddy/core).
- UI-level changes need manual device testing on top of core tests — the tests can’t see the DOM.
3Additive changes + feature flags
Ship new features behind remote toggles so they can be turned off instantly if something goes wrong:
- Extend the control config with feature flags, delivered through the existing polling/BroadcastChannel plumbing.
- Prefer adding new rules/features in @tallycaddy/core with migration support over editing app.js directly.
- Bump schemaVersion with every breaking shape change; migrateGameSnapshot + validateGameState guard every save/load.
4Protect saves and data
- Never ship a release that breaks existing saved games — the migration gate is mandatory.
- Back up D1 before schema or content changes: wrangler d1 export tallycaddy-cms --remote.
- Keep the import/export and auto-save write-queue paths tested on both localStorage and Capacitor Preferences.
5Release cadence & monitoring
- Small, frequent releases on a fixed rhythm instead of one giant merge (this is what caused the last upgrade to go wrong).
- Use Play Console staged rollout (10% → 50% → 100%) and watch crash reports before full rollout.
- Keep Cloudflare logs/analytics on for the Worker so a broken deploy is visible in minutes.
- Reserve the v0.18.5-mobile-fixes tag / codex/tallycaddy-catalogue-mobile branch as a recovery point for the upgrade work — don’t delete them.
First 30 days — quick checklist
- Register tallycaddy.com in Cloudflare Registrar and add the zone.
- Point the Worker at the domain (custom route) and keep workers.dev as fallback.
- Relax the middleware to make /, /play/, /help/, /blog/ and content API public.
- Add sitemap, robots.txt, Open Graph tags; submit to Search Console.
- Commit and push the 0.18.1 version bump so local, main and origin stay synced.
- Build a release AAB with a real keystore and enroll in Play App Signing.
- Set up AdMob/AppLovin in the native shell and enable ads via the control panel.
- Add Amazon affiliate links to the 6 strategy articles.
- Set up a features branch for the next feature; merge only when green.