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 →

8 done · 3 in progress · 6 to start · 17 we're aiming at
47%

Aiming at first

What we're trying to land before removing the beta label.

  • Fix intermittent loading crash on Vercel

    perf

    The 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

    integrity

    So 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

    telemetry

    So 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

    content

    So 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

    content

    So 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

    content

    So 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

    perf

    So 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]

    polish

    So 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

    mobile

    So 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

    legal

    So 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

    content

    So 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

    content

    So 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

    mobile

    So 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

    polish

    So 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

    polish

    So 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

    polish

    So 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

    ops

    So 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)

    wallet

    So 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)

    ops

    So 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

    mobile

    So 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

    content

    So 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

    content

    So 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)

    wallet

    So 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

    content

    So 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

    content

    So 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

    polish

    So 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.

Updates often.