|
| 1 | +# Watt City — ETHSilesia 2026 Win Postmortem |
| 2 | + |
| 3 | +**Result:** 1st place, **PKO XP: Gaming track** (sponsored by PKO Bank Polski) at ETHSilesia 2026, Katowice, **2026-04-19**. |
| 4 | + |
| 5 | +**Prize:** 10 000 PLN. **Continuation:** post-hackathon partnership conversations with PKO BP active. |
| 6 | + |
| 7 | +Live: https://watt-city.vercel.app · Repo: https://github.com/B2JK-Industry/watt-city |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## What Watt City is (one paragraph) |
| 12 | + |
| 13 | +Watt City is gamified financial education for kids ages 9–14. Players earn resources from minigames, build a 20-slot city, take a learning-mortgage on a Domek (cottage), and learn how RRSO/APR work without ever touching real money. **The kicker that won the bounty:** it's not a fixed library of games — it's a *generator* of games. A Sonnet/Haiku rotation ships a fresh evergreen minigame every hour, so the platform never feels stale. Pitched to PKO BP as an SKO 2.0 (school savings account) partnership prototype. |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +## What won (one sentence) |
| 18 | + |
| 19 | +**Trojan-horse pivot:** every other team in the PKO Gaming track built *a game*. Watt City built *a generator of games*. Same visual surface as competitors, categorically different product underneath. Judges saw the rotation in 5 seconds and got the difference without a slide. |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## What made the difference (applicable to next hackathons) |
| 24 | + |
| 25 | +### 1. The 5-second visual meta |
| 26 | + |
| 27 | +"Games regenerate every day" wasn't told — it was *shown*. Open the app, watch the rotation tile, get it. No deck, no narration, no setup. Judges who can see your category in 5 seconds remember you; judges who need 5 minutes don't. |
| 28 | + |
| 29 | +If your meta isn't visually demonstrable in 5 seconds, the meta is wrong. |
| 30 | + |
| 31 | +### 2. Substrate-level pivot inside the track |
| 32 | + |
| 33 | +The PKO Gaming track had >5 teams all building "games for kids." The win was deciding to operate at a different layer — not "another game" but "the engine that produces games." Substrate strategy works when: |
| 34 | + |
| 35 | +- Track has >5 teams in the same category (signal of inflation) |
| 36 | +- Meta is visually demonstrable in 5–10 seconds |
| 37 | +- A scaled version of your product would *contain* what your competitors built |
| 38 | + |
| 39 | +When it doesn't apply: small tracks (<5 teams) or metas that need infra you can't build in a weekend. |
| 40 | + |
| 41 | +### 3. Sponsor brand surface > SDK depth |
| 42 | + |
| 43 | +PKO's brand colors (light navy + orange) became the default skin. The app *looked* like a PKO product, not a third-party demo with a PKO logo bolted on. Strict palette + spacing rules in `AGENTS.md` prevented visual drift across PRs. |
| 44 | + |
| 45 | +Sponsors don't need you to use 11 of their APIs. They need to be able to imagine your product on their landing page. |
| 46 | + |
| 47 | +### 4. One primary user, never "platform" |
| 48 | + |
| 49 | +A 9–14 year old who wants to learn finance through minigames. Not "platform for kids + parents + teachers + administrators + regulators." Pitches that mention 3+ user types lose to pitches that mention one. |
| 50 | + |
| 51 | +### 5. Demo with zero onboarding |
| 52 | + |
| 53 | +Click → play → leaderboard. No reading, no signup gates blocking the first action, no "watch this 90-second tutorial." If a judge has to read to use it, you've already lost. |
| 54 | + |
| 55 | +### 6. Single-branch `main` workflow |
| 56 | + |
| 57 | +No long-lived feature branches, no merge drama. Sprint D shipped over a weekend because every change went into `main` immediately, gated by tests. PR queues are a luxury hackathons can't afford. |
| 58 | + |
| 59 | +### 7. Robustness over speed (Daniel's hard rule) |
| 60 | + |
| 61 | +> "až do kedy už nebudeš vediet najst chyby" |
| 62 | +
|
| 63 | +No quick-fix hacks. Test-fix-test cycles until errors stop appearing. Time isn't the constraint; correctness is. Watt City shipped with **635 vitest across 80 files + 13 Playwright specs / ~600 E2E assertions** because the rule was "fix it right or don't fix it." |
| 64 | + |
| 65 | +The trade-off: you ship fewer features, but the features you ship don't blow up in front of judges. |
| 66 | + |
| 67 | +### 8. Continuity beyond the hackathon |
| 68 | + |
| 69 | +The win was an entry ticket, not a trophy. Post-hackathon: PKO partnership track active, deployment continuing on `main`. Hackathons that produce abandoned repos are forgettable; hackathons that produce ongoing partnerships are how you build a track record. |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +## What didn't matter |
| 74 | + |
| 75 | +- **Smart contract complexity** — Watt City is a no-web3 product. Judges in non-web3 sponsor tracks don't reward you for unnecessary blockchain. |
| 76 | +- **AI model showcasing** — the Sonnet/Haiku rotation is *internal*; users see games, not "powered by Claude" badges. |
| 77 | +- **Long-form documentation** — `docs/` has 20+ files; nobody read them. The README and the live demo carried the pitch. |
| 78 | +- **Mobile-native code** — Capacitor was wired in, but the win came from the PWA on a borrowed Chromebook at the booth. |
| 79 | + |
| 80 | +--- |
| 81 | + |
| 82 | +## Stack that won |
| 83 | + |
| 84 | +| Layer | Choice | Why | |
| 85 | +|---|---|---| |
| 86 | +| Framework | Next.js 16 App Router | Vercel deploy, server actions, fast iteration | |
| 87 | +| Frontend | React 19.2 | Latest hooks, strict purity rules **relaxed to warn** for this repo (see `feedback_eslint_react19.md`) | |
| 88 | +| State / queue | Upstash Redis | SADD-backed idempotency for ledger writes; cron + on-render lazy fallback | |
| 89 | +| Hosting | Vercel Hobby tier | Cron at 1h granularity satisfies hourly rotation; rotation has 3 converging triggers (external pinger + Vercel Cron + on-render lazy backstop) — see `docs/decisions/001-hourly-rotation-on-hobby.md` | |
| 90 | +| Testing | Vitest + Playwright | 635 unit / 80 files + 13 e2e specs / ~600 assertions | |
| 91 | +| i18n | 4 locales × 423 keys, zero drift | Caught at CI gate | |
| 92 | +| Linting | ESLint with React 19.2 rules relaxed | Strict purity rules `warn` instead of `error` per repo norm | |
| 93 | +| Mobile | Capacitor | Wired but not the demo path; PWA carried the booth | |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +## Numbers |
| 98 | + |
| 99 | +- **635 / 635** unit tests passing across 80 files |
| 100 | +- **13 Playwright specs / ~600 E2E assertions** |
| 101 | +- **81 API routes** |
| 102 | +- **76 static pages** |
| 103 | +- **4 locales × 423 keys** (zero drift) |
| 104 | +- **20-slot city map** with earn-to-unlock gating |
| 105 | +- **7 resources** in append-only ledger (⚡ 🪙 🧱 🪟 🔩 💾 💵) |
| 106 | +- **Hourly AI rotation** of evergreen minigames (Sonnet/Haiku) |
| 107 | +- **9 evergreen games** preserved at `xp-arena-final-v1.0` tag (pre-Watt-City baseline) |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +## Files / surfaces a future audit should read first |
| 112 | + |
| 113 | +If you want to understand HOW Watt City works in 30 minutes: |
| 114 | + |
| 115 | +1. `README.md` — the pitch and the current shipped state |
| 116 | +2. `app/page.tsx` and `app/miasto/` — the homepage and the city map (the two surfaces judges saw) |
| 117 | +3. `docs/decisions/001-hourly-rotation-on-hobby.md` — the ADR for the hourly AI rotation triple-trigger |
| 118 | +4. `docs/SKO-VISION.md` — the partnership story for PKO BP |
| 119 | +5. `app/api/rotate-if-due/route.ts` — single-flight idempotent rotation endpoint |
| 120 | +6. `AGENTS.md` — strict visual rules (palette, spacing) that kept the PKO brand consistent across PRs |
| 121 | +7. `docs/RETRO-TEMPLATE.md` — sprint retro template (process discipline that supported the test-fix-test loop) |
| 122 | + |
| 123 | +--- |
| 124 | + |
| 125 | +## What ships in v2 (post-hackathon) |
| 126 | + |
| 127 | +- **PKO BP partnership integration** — formal SKO 2.0 prototype handoff |
| 128 | +- **Mortgage learning module deeper math** — RRSO/APR sandbox, no real money |
| 129 | +- **Native mobile via Capacitor** — currently wired, not yet the demo path |
| 130 | +- **Per-classroom teacher dashboards** — class mode (already has admin shortcut for E2E) |
| 131 | +- **Audit feature** — deferred from Sprint D per `project_sprint_d_shipped.md` (R-10 audit deferred) |
| 132 | + |
| 133 | +--- |
| 134 | + |
| 135 | +## Lessons applied at the next hackathon (ETHPrague 2026) |
| 136 | + |
| 137 | +The **substrate strategy** + **5-second visual meta** + **single-branch + robustness over speed** patterns from Watt City directly informed Siren (the ETHPrague 2026 dual-track winner — see Siren's `WIN.md` if you have access). Different domain (web3 reputation vs financial education for kids), same playbook layer. |
| 138 | + |
| 139 | +If you're starting a new hackathon project: read this file, then ask for each row in "What made the difference" — *do we have an equivalent?* If you're missing more than two, the project doesn't have Watt City strength yet. |
0 commit comments