Work in progress
Where we're at. Tidewatch is built by community members in spare time. This isn't an official roadmap — items move, get added, get dropped, and timing depends on life. Nothing here is a promise.
Companion page: how each soul's traits will show up in the game →
Aiming at first
What we're trying to land before removing the beta label.
- ✓
Fix intermittent loading crash on Vercel
perfThe shore was unreachable for a meaningful share of cold-cache visitors. Top blocker before any further mechanics work.
Game would freeze or fail to load entirely on the live site — net::ERR_NETWORK_CHANGED on GLB fetches followed by THREE.WebGLRenderer Context Lost. Worst on Chrome and Firefox, intermittent, both on tidewatch.xyz and savedsoulsavatars.vercel.app. Vercel server logs stayed clean throughout, so this was a client-side bandwidth/queueing failure, not a server one.
Root causes: (a) ~220 MB of GLBs and ~14 MB of WAVs preloaded in parallel at module init created a single-socket HTTP/2 stream pileup that aborted on flaky networks, (b) Vercel's default Cache-Control of `public, max-age=0, must-revalidate` forced full revalidation of every asset on every page load. Fixes shipped: (1) long-cache headers (`max-age=31536000`, no `immutable`) on /models/, /sounds/, /animations/ via next.config.ts; (2) dropped useGLTF.preload for non-spawn-critical scenery (flotsam, driftwood, coral, seaweed, crab, shark), cutting parallel fan-out from ~15 GLBs to ~7 at module init; (3) lazy-instantiated large audio elements (wind_loop, ocean_loop, foghorn, lose_muffle, win_chime); (4) re-encoded uncompressed-WAV ambience to Opus/MP3 (~13.3 MB → ~580 KB total); (5) <link rel=preload as=fetch> for the soul GLB on /game so it races the JS bundle download. Brave-fast-but-Chrome-slow during diagnosis was cache state, not browser difference — Vercel isn't advertising HTTP/3 (no alt-svc header) so HTTP/2 is the floor on cold visits. Still latent: first-time-visitor cold-cache load is ~117 MB; if it becomes a problem, Draco compression of distant scenery is the next lever.
- ◐
Cheap anti-cheat on score writes
integritySo the leaderboard means something once people start looking at it
Rate-limit /api/players and /api/contact, server-side cap on max plausible score per tide, idempotency keys on save submissions so the same tide can't be replayed. Without it the leaderboard and constellation are forgeable with curl.
- ◐
Game telemetry via Vercel custom events
telemetrySo we learn from the launch wave instead of guessing about it
Wire ~8-10 events: tide_started, mark_collected, hazard_hit, refuge_used, save_crossed, soul_saved, tide_abandoned_at_phase, share_clicked. The launch wave is the most valuable signal we'll get; missing it means tuning blind.
- ◐
Trait-driven variation on the base avatar
contentSo walking a different soul actually feels like a different soul, not a label swap
Rework the generic mesh so unmodeled souls visually reflect at least body type, clothing/cosplay, and ring placement from their traits. With 3 of 9,999 souls modeled, this is the believability floor — without it most walks feel like a stock NPC.
Traits affect gameplay
contentSo every soul's traits show up in the walk, modeled or not
Every trait category contributes to the walk — visual, atmospheric, or mechanical — so a soul's full trait set is reflected in how it plays. Some categories (Background, Body) stay visual-only by design; others (Ring, Clothing, Eyes, parts of Hats n Hair) drive mechanics. Independent of 3D modeling progress: drives off canonical trait values, not asset availability.
Per-tide jitter on object placement
contentSo replaying a soul doesn't immediately feel like the same walk
Per-soul scenery is already deterministic by tokenId; layer per-tide randomization on top of flotsam, marks, hazards. Cheap to implement, big payoff for 'this isn't the same walk twice.'
Mobile-focused performance pass
perfSo shares from holders on X don't land on a phone that chugs
Measured pass on iOS Safari, mobile Chrome, mid-range Android. Frame time, GLB bundle size, scenery instancing. Bound the work — don't over-engineer with 7 players' data, just clear obvious cliffs.
Per-soul OG tags on /game/[tokenId]
polishSo a shared link to soul #4321 previews soul #4321, not the homepage banner
Holders will share specific souls. Share previews need to render that soul's image and name, not the homepage banner.
Mobile long-session sanity check
mobileSo we learn what breaks at 20 minutes before a beta tester does
Play 20+ minutes on a real phone, watch for thermal throttling, audio drift, lost-context recovery on tab background/foreground. Cheap to do, surfaces the real issues.
Privacy/terms review for game scope
legalSo privacy/terms language matches what the game actually does — player progress, contact, leaderboard
Existing /privacy and /terms were written for the avatar viewer. Game adds player progress storage, contact form/email, leaderboard. Make sure the language covers it.
- ✓
Marks pacing across low-tide phases
contentSo tide pacing doesn't front-load all the objectives at the start of the walk
7 marks now roll out across ~3 low-tide phases instead of dumping all at once. Mark completion converges with flotsam at the save threshold around tide 3.
- ✓
Per-soul scenery seeding
contentSo walking a different soul actually reads as a different shore, not the same set re-skinned
Palms, driftwood, coral, seaweed positions now hash off tokenId. Walking soul A then soul B feels like different shores.
- ✓
Mobile audio crash fixed
mobileSo mobile Chrome players make it past tide 2 without the renderer dying
Voice pool replaced unbounded HTMLAudioElement cloning. Mobile Chrome no longer kills the renderer on tide 2.
- ✓
Tide Card share-prep panel
polishSo sharing on mobile actually completes instead of dropping into a broken X handoff
Copy tweet / Copy image / Open in X app / Post to X. All gesture-preserving so the mobile share doesn't lose the gesture handoff.
- ✓
Contact form and submission storage
polishSo bug reports and feedback don't sit only in Discord DMs
/contact form backed by Mongo contacts collection + Resend email notification. DB row is source of truth, email is notification.
- ✓
Branding pivot to Tidewatch
polishSo the site has one clear identity instead of two competing for attention
Tidewatch is now the primary site brand on banner H1 and navbar wordmark. 'Saved Souls Avatars' stays as a sub-line on the homepage naming the project.
- ✓
tidewatch.xyz registered
opsSo there's a real address to share before the soft-launch in Discord
Public domain secured ahead of going live.
After that
Likely first follow-up batch — order and scope will move.
Optional wallet sign-in (read-only)
walletSo holders can show 'verified holder' on the leaderboard without it gating play
Coinbase Smart Wallet + Base, just enough to verify 'I hold this soul.' Doesn't gate play — adds a 'verified holder' marker on the leaderboard. Delegation comes later.
Error reporting (Sentry or equivalent)
opsSo real bugs at 2am surface before the next morning
Once there's traffic, catch WebGL/runtime errors. Mostly useful as a tripwire, not as a daily tool.
PWA manifest / Add to Home Screen
mobileSo players who like the game can keep it on their home screen
Small file, outsized retention payoff. Discord folks who like the game will want to open it like an app.
Model additional traits
contentSo the visual variety isn't bottlenecked on a handful of modeled bodies
Expand the trait set the engine can render — depends on the base avatar rework landing first so new traits compose cleanly with body/clothing variation.
Individual marker modeling
contentSo the seven marks on a tide read as seven different things, not seven of the same
Replace placeholder markers with distinct models so the 7 marks across a tide feel like 7 different things, not 7 of the same thing.
Parking lot
Ideas worth keeping. No commitment, no schedule, may never happen.
Wallet delegation (Base)
walletSo holders can play with hot wallets without exposing the cold wallet
Coinbase Smart Wallet session keys or EIP-7702 path so holders can play with hot wallets without exposing the cold wallet. Real engineering — only worth it once read-only sign-in shows holders actually want this.
Weekly rotation of objects and markers
contentSo returning players see the shore evolve week to week
Retention mechanic — rotates the world subtly each week so returning players see something new. Only meaningful once there are returning players to retain.
Lighthouse involved in gameplay
contentSo the lighthouse is more than a backdrop — but only with a design that doesn't dilute its symbolic role
Worth doing, but needs a specific design first — the lighthouse is currently the visual symbol of the save threshold, and turning it into a gameplay object risks muddying the strongest icon in the game.
Music score and audio variety
polishSo five saves don't sound like one save replayed five times
Voice pool is bounded and stable. Next pass: dynamic music tied to tide phase, expanded VO, per-shore soundscape that pairs with the per-soul scenery already in place.