TallyCaddy · Go-Live Roadmap

From local build to a live product

A practical plan to host TallyCaddy publicly, open the website to real visitors, make money from the app and the site, and keep shipping improvements without breaking what already works.

Prepared for the BoardBank / TallyCaddy project · Infrastructure already on Cloudflare (Worker + D1 + R2 + KV)

PHASE 1

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).
Hosting summary: everything already runs on Cloudflare’s free tier (Worker + D1 + R2 + KV). The only new costs are the domain (~$10–12/yr) and Play Console ($25 one-time). No VPS, no servers, no maintenance.
PHASE 2

Monetization

App + Website

1App: 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.

Realistic order of revenue: (1) App Pro unlock + ads first — you already have the plumbing; (2) Amazon affiliates on the blog next; (3) display ads + digital packs once traffic grows. The blog titles cleaned up today are the first content step toward affiliate income.
PHASE 3

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.
Golden rule: public = main, experiments = branches, everything controllable remotely, every save migration-tested, every release tagged and rollback-able.
NOW

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.