Skip to content

Outhere mobile app, every prototype screen, on Supabase - #4

Draft
EmotiveImpact wants to merge 106 commits into
claude/web-app-build-nig9rlfrom
claude/mobile-app-build-nhob8r
Draft

EmotiveImpact wants to merge 106 commits into
claude/web-app-build-nig9rlfrom
claude/mobile-app-build-nhob8r

Conversation

@EmotiveImpact

@EmotiveImpact EmotiveImpact commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Requested by Edem · project thread

Before: the app ran entirely on the phone with simulated players. It had no database, used the older green look, and covered only part of the prototype.

After: the mobile app has every screen of prototype demo v29 that a phone app can show, in the approved dark midnight design, on a real Supabase schema that every Outhere app shares. Rings mean membership. A blue dot means out now and a red dot means just stopped. In the stories row the ring shows the story instead: bright blue until watched, thin grey after. Without Supabase settings, the app still runs on local demo data.

This PR sits on top of #6.

What's in the app.

  • Getting started: a launch screen, then onboarding for anyone in the UK: email code, Apple or Google sign in, username, goal, city or town, crew and motion. There are under 18 rules.
  • Home: the stories row and the outside now carousel.
  • Move: live runs and walks with routes, splits, the climb chart, history, sharing and safety. A live race shows lanes against your rival.
  • Outside: the arena, challenges, drops with checkout and orders, events with tickets, QR check-in and who's going, and news.
  • Battles: all six modes, the season and fair play review.
  • Swipe: picks, challengers, the reveal and mystery challengers, all over 18 only.
  • Cities: city v city, call-ups, rising places, the hex map and countdowns. Smaller towns play for their region until they reach 100 active.
  • Crew: club chat, the feed, calendar, run clubs, founding and claiming, the club league and friendlies.
  • Stories: Pro and Black post.
  • Profile and money: membership (Pro £5.99 a month or £59.99 a year, Black £12.99 a month or £129.99 a year), wallet, friends, badges, emotes and settings.

Finish and the lush layer.

  • Every area was restyled on a shared Skia finish kit (components/ui, FINISH.md) and checked side by side against the prototype.
  • Skia shaders (components/ui/shaders): a brushed sheen on the Black card, aurora skies, shimmering live tug bars, liquid step rings and bars, foil on badges and emotes, and city lights on the night side of the globe. Live canvases pause off screen, in the background and under reduce motion.
  • Feel: a named haptics vocabulary (services/haptics.js) wired into countdowns, swipes, results, holds and checkout, plus rolling digit numbers and lift on press.
  • Real 3D (components/three, three.js through react-three/fiber): the race lobby globe, loaded on demand with the Skia globe as the fallback. A 3D coin was tried and dropped; the wallet keeps its coin image.
  • /lush (Settings › The lush layer) shows all of it on one page.

Screen audit. All 189 demo screens were checked in a browser. 174 are built: 122 match, 22 have small differences, and for 30 the app has the newer version of the screen. The 15 not built need native targets: the Apple Watch, the home-screen widget, and the lock screen and Live Activity. The full list is in the project files (outhere-mobile-build/screen-audit.md).

How. supabase/ holds 25 migrations, the seed and DB tests that run on plain Postgres. Anything that moves XP, OUT, tiers or results goes through a database function, and pg_cron settles battles, fixtures and friendlies. Story photos live on Cloudflare R2 behind the story-media Edge Function. scripts/build_setup_sql.py writes one SQL Editor file: it wipes the database, then runs every migration, the seed and the migration history, in one transaction. apps/mobile/src/data/source.js picks remote.js (Supabase) or engine.js (local).

Checks. The Mobile and Database workflows pass. Locally, every DB test passes on a fresh build and on a wiped-and-rebuilt one. Jest passes 106 of 106 tests, tsc is clean, and the web export works.

Known gaps.

  • The typing indicator is local only.
  • There are no direct messages.
  • Cards can't be saved as images; Save copies the result line instead.
  • The ticket doesn't brighten the screen.
  • The text size setting doesn't change text size yet.
  • Garmin and Strava say coming soon.
  • Home's drop slide still lists drops in pounds.

Still to do on the hosted project (bpquinogyvlgjtpppktc).

  • Edem runs the setup file.
  • Deploy story-media.
  • Edem sets the R2 and Vault secrets and turns on the Apple and Google sign-in providers.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV

- Make apps/mobile the only app: remove the old Emergent frontend/ app
  and generated root files (model.patch, test_result.md, move_events.js,
  Task.zip, empty test dirs)
- Remove the Anything (create.xyz) runtime from apps/mobile: global fetch
  override, launcher menu, remote error reporting, sandbox messaging,
  unused auth/upload helpers and the @anythingai/app dependency
- Fix step sync posting 0 steps every 30s (stale closure) and use the
  local calendar day
- Only show DEV BYPASS in development builds; a failed signup no longer
  onboards a local-only account
- Wait for the persisted user store before routing, so onboarded users
  aren't sent back to /welcome
- Remove the committed Mapbox token; route planning falls back to OSRM
- App identity: OutHere name, outhere scheme, com.outhere.app bundle ID,
  real permission strings; stop committing the generated ios/ project
- Use Apple Maps on iOS (Google Maps needs an SDK and key we don't ship)
- Install react-native-calendars from npm instead of a GitHub tarball
- Backend: installable requirements.txt, correct .env.example, tests
  moved to backend/tests
- Docs: add Docs/ROADMAP.md and point docs at apps/mobile

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
The app now runs entirely on the phone until a server stack is chosen.
engine.js owns state in AsyncStorage, simulates seeded players and applies
the XP, OUT, streak, battle, crew, event, drop and reward rules. hooks.js
wraps it in React Query; components/ui is the shared design kit. The root
layout gates on the stored profile and syncs the pedometer into the engine.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
Home, Outside (arena, events, drops, news), Move, Crew and Profile, plus
detail routes for battles, events, drops, news, crews and players, and new
membership, rewards, notifications and settings screens. All mock data,
/api fetches and dead buttons are gone. Removes the old API client, user
and club stores, and the unused Mapbox and RevenueCat packages so the app
runs in Expo Go.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
Springy presses, entrance motion, count-up numbers, skeleton loading,
toasts for every action, shared sheets, and Cover artwork with bundled
photography so nothing renders as a grey box. Reworked heroes and layouts
on Home, Outside, Move, Crew, Profile and every detail screen.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
Green is kept for the primary action, progress, the live dot and the
active tab. Glows, gradients, borders and nested boxes are gone, type
carries the hierarchy, and every screen has more room to breathe.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
… 600

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SZUVp63ghHjfkQMuinHMsq
Seven migrations cover people, places, run clubs, events, steps and runs,
the out-now dot, the XP and OUT ledger, battles in six modes, challenges,
the city and club leagues, feed, stories, club chat, notifications,
safety, subscriptions, the club fund, Outhere Locals and drops. Every
table has RLS and anything that moves XP, OUT, tiers or results goes
through a SECURITY DEFINER function.

supabase/tests/run.sh applies them to plain Postgres and checks the
rules; CI runs it on every change under supabase/.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
@EmotiveImpact EmotiveImpact self-assigned this Oct 15, 2026
The app now follows the approved concept demo: dark midnight colours,
Barlow Condensed headlines with Inter copy, surfaces lit from above,
blue gradient buttons and a floating tab bar in Edem's order (Home,
Move, Outside, Crew, Profile) whose active tab glows.

Every photo wears its membership ring (Free grey, Pro blue glow, Black
gunmetal with a travelling light) and the out-now dot (blue while out,
red once stopped). In a 1v1 you are blue and the rival is red.

Home is rebuilt to fit one screen: greeting with the PRO or BLACK mark,
friends row, two-tone headline, goal dial, three quick buttons and the
auto-sliding outside now carousel. Arena, Challenges (streak flame and
month calendar, now a tab inside Outside), Crew and Profile get photo
heroes, and Move's start panel ends in a Touch grass button. The seeded
world uses the bundled Outhere photography instead of remote stock.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
- data/source.js picks the Supabase adapter (data/remote.js) when
  EXPO_PUBLIC_SUPABASE_URL is set, the local engine otherwise
- remote.js maps profiles, steps, wallet, people, dots, leaderboards,
  challenges, battles, clubs, chat, runs, events, drops and
  notifications onto the schema's tables and functions
- onboarding asks for an email code first in Supabase mode
- event check-in takes the organiser's code
- new finish_onboarding function pays the welcome bonus once

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…ghtly purge

- In the Home stories row the ring now shows the story alone: bright
  blue until watched, then thin grey. Membership rings stay everywhere
  else; dots unchanged.
- stories gain an audience (public, followers, club) and saved_at for
  highlights; RLS and the storage read policy follow the story row, so
  signed URLs only work for people allowed to see it.
- purge-stories edge function, scheduled nightly by pg_cron, removes
  expired unsaved stories through the Storage API.
- services/media.js keeps story files behind one small interface and
  resizes photos to 1080px WebP before upload.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
… step, mobile CI

Story photos upload straight to R2 through presigned links from the
story-media Edge Function, which also signs views against the story's
audience and purges expired stories each night. Adds the full screen
story viewer with emotes, posting for Pro and Black, the logo and slide
to start Welcome, a daily goal step, new app icons and a mobile workflow.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV

Copy link
Copy Markdown
Owner Author

CI on this PR is red, but no job has actually run. Every job (check, functions, migrations) finishes in about 2 seconds with no steps, no log and no output, on this commit and on all earlier ones. That pattern is GitHub refusing to start Actions runners for the account, usually because of a billing or spending limit, rather than a failure in the code.

The same checks pass locally on 31a924c: database rules and RLS tests, regenerated types with no diff, tsc, 12 jest tests, web export in both modes, deno check on story-media and the 4 R2 signing tests.

To fix it, check Settings, Billing and plans (Actions usage and spending limit) on the EmotiveImpact account. Once runners start, a push or a re-run will show the real result, and I'll fix anything that comes up.


Generated by Claude Code

Moves the website thread's apps/site/db/website.sql into supabase/ as a
migration, with its tests, so one schema serves every app. The tables
have RLS on and no grants; the site reaches them only through four
anon-callable functions.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
EmotiveImpact pushed a commit that referenced this pull request Oct 15, 2026
The waitlist, club claims and Black requests now live in
supabase/migrations/20261015100900_website.sql (PR #4), so drop
apps/site/db and the website's own database CI job, and point the
docs there.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A3KTjkLAXTgUTh3vXAChDA
…led blind trial, ghost, last one standing, hold the route

Database: ready_battle, submit_battle_result scored from a saved run, mode-aware
settling, battle_entry_count to stop the entries policy recursing. Each DB test
file now runs in its own copy of the database.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
… going official, fixtures settling, club v club friendlies

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Find a run club (near me, tonight, beginners), club runs with RSVP by pace
group and check-in, founding clubs and their road to official, claiming a
club with Instagram, Strava or video call proof, the club league table and
weekly derby fixture, and friendlies: challenge a club or a mystery club in
five modes, members vote, captains accept. Works on the local engine and on
Supabase.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
@vercel

vercel Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
outhere-site Ignored Ignored Preview Oct 16, 2026 8:10am UTC

…oad function

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…app in

The phone app is now the @outhere/mobile workspace package. Its npm
overrides and patch-package patches moved to pnpm-workspace.yaml (two stale
RevenueCat patches dropped), its package-lock.json is gone, CI installs with
pnpm, and it takes counted steps and the reserved slugs from packages/core.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
@EmotiveImpact
EmotiveImpact changed the base branch from claude/project-thread-jn157m to claude/web-app-build-nig9rl October 15, 2026 13:12
…s, staff actions

One new migration (20261015101300_web_gaps.sql) with tests:
- profiles.public_profile with a profile_cards view for the public basics
- clubs.tags, filters and join_policy; club_members.pace_group;
  club_join_requests with decide_join_request; join_club returns
  joined or requested
- rename_club with reserved slugs copied from packages/core rules.ts
- club_message_reactions, club_channel_reads, read_channel, club_unread,
  club_channels.description
- borough_week_steps view
- staff RPCs verify_club, review_steps, remove_from_squad, set_reveal_held,
  each writing audit_log; seasons.reveal_held holds settle_due_fixtures
- badges and member_badges, seeded, awarded by award_badge from triggers
- notifications.actor_id, events.activity, battles.stake_note, 120 hour
  battles, and respond_battle telling the challenger on decline

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
claude added 30 commits October 15, 2026 22:04
Profile takes the prototype's photo hero, lit level card with the level
tile from 132, stat trio, blended badges, streak and OUT wallet nudges.
Account screens get the glow hero with their objects, glass round
buttons, lit groups, act gradient toggles and segments, and the tab bar
where the prototype shows one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
- Pills read Arena, Challenges, Events, Drops, News (the chosen chal6 order)
- Arena scoreboard, challenge rings, doors, call-up and battle cards are lit Surfaces; rings glow
- Challenges streak hero with the blended flame, .cal.sm calendar, lit Today and XP cards
- 1v1 builder hero with the OUT stack, lit face picker and stake box
- GlowHero gains optional photoFocus and headlineSize props (backwards compatible)
- global.css: canvas min-height 0 so small Skia canvases keep their size on web

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
- Drops, drop, checkout and event heroes drop the faint photoOpacity and match the prototype heights
- Drops hero is the headline drop: one opening within six hours, else the newest live drop in stock
- Event posters are full-photo cards with a frosted day badge; lit week strip
- Ticket sits on the event photo; who's going gets the photo slab, inline buttons and the tab bar
- News story cards at prototype size on lit Surfaces
- Shop cards, size picker, address, summary and order timeline on lit Surfaces; order shows the tab bar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…ick OUT bar

- Wallet laid out like the prototype: coin inside the balance card, clear of the avatar
- Ledger gets the coin slab, prototype-sized rows and the tab bar
- Plans, compare, welcome, ring key and manage use BlendImage cards (no black boxes)
- Compare: avatars aligned over their columns, Black column in brushed silver with a moving sheen
- Welcome: full-strength photo with the Black card floating over it
- Ring key gets the blue-lit slab and the tab bar; manage gets the thick earn bar
- Pay sheet close is a small grey system-style button

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…ay, challenger)

Fixture gets the photo or live map, the kit tug bar with its white spark and
meter compare bars. The relay shows each leg with the runner's face. The
challenger banner is blue with a round glowing mystery crest.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Friends, someone else's profile, search, the share card and invites get
lit cards, compact prototype sizes, glass buttons, glowing act buttons
and the tab bar. The share card sits on its own photo, blurred; invites
gets the gift and lists everyone you've brought in. Join a crew, crew
settings and the report sheet follow the prototype. Streak at risk goes
amber with a grey flame; badges get the medal hero and the grid.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Story viewers get a slimmer reply pill and emotes blended onto the photo; the
members sheet sits over a darker scrim. The race bars are thicker and lit,
the podium object is sized to fit, feed posts carry their numbers over the
photo or the route map, the goal card and crew days get the finish, the busiest
heat cell glows, and the board keeps the tab bar with a centred title.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…fline

The club v club story card follows the prototype card with Save and
Share to story under it. Running solo gets the podium and lit option
rows. Loading uses Home's own skeleton layout; the error and offline
states get the prototype's compact cards, amber offline bar and lit
sync list, keeping the extra rows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Battles: a new race lobby with a Skia globe that spins, then draws a
glowing arc with runners between the two players (RaceGlobe, BattleSkia).
Live race, sealed blind trial and the reveal get their own screens with
portrait cards, slanted tags and turning rays. The live battle, invite,
win and lose screens use VersusSplit, TugBar, Surface, GlowButton and
BlendImage objects (no black boxes). Character select is a fighting game
stage on VersusSplit with slanted, side-lit tiles and the prototype's
stat bars; FaceOff and BattleCard move to the kit TugBar and portrait
cards. Emotes and the emote drop use BlendImage tiles on lit backings.

Swipe: slimmer cards, glowing round actions, photo backed mystery,
challenger, reveal (slanted VersusSplit) and safety screens.

Cities: the UK map object on the league, city photos on the fixture,
call-up and rising screens, the founders medal, the crest on areas, the
street map under the hex map with glass labels, thicker lit bars, and
the trophy, coin stack, medal and ticket on season results. Before
Saturday the fixture and fair screens show each side's week from the
league instead of zeros.

Shared: global.css canvas min-size fix; new asset assets/images/oh/map.jpg.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…review

Locating and location off on the blurred night map with the pin blended
into its orb. Idle pills and the lit CTA at the prototype's sizes. Route
sheets with lit route cards, the glowing name input and the club toggle
always shown. Run history, run detail, route detail, the summary and
safety on the prototype's slab with the route lit on the night map (or
the object blended in). Run review gets its map with the too-fast
stretch in red. Pilot gets the city horizon. Countdown map shows
through a lighter veil.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Every preview is now its own full screen page, like the prototype: swipe
between them, use the arrow keys or the edge arrows on the web, or open
the list from the counter to jump. The lock and home screens fill the
screen with no frame. Each watch screen sits on its own stage with the
blue glow, and the challenger tick, the club crest and check in pill and
the hold to finish ring get their glows. The Live Activity's Pause is
frosted glass and Finish the glowing act button.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
The profile restyle gave the account GlowHero a 44px default headline to
match the settings slabs. The goal, patch and permissions steps were
restyled against the old 48px default, so after the merge their
headlines shrank below the prototype. Pass size 48 on those three steps
and leave the settings default alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
The fixture ended yesterday, so for the first hour after midnight in
London the test's earlier club run (an hour ago) fell inside it and
turnout read two of three. The fixture now ends two days back.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Settings gains "The lush layer", which opens /lush: a Shaders, Feel and 3D
segment, each backed by a component in components/lush so the three parts
can be built side by side.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Serves the Expo web export as a single page app, with canvaskit.wasm sent
as application/wasm and long cache headers on hashed files.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…card lifts

Haptics gains a vocabulary of thirteen named moments (tap, select, beat, go,
swipe, commit, win, lose, levelUp, holdTick, holdDone, slideEnd, warn), each a
composed pattern from one table that also draws the waveform in the demo, all
silent on the web and in the simulator. GlowButton takes a haptic prop, the
countdowns beat and go, swipe, hold to finish, slide to start, off route, GPS
lost, stakes, drop claims and results all fire their moment.

Rolling.jsx adds RollingNumber (every digit a wheel on a spring, staggered
from the right, separators still, reduce motion jumps), CountUp on the kit's
expo ease, and Lift, the spring from a card into its page. Applied to the
wallet and profile OUT balances, live battle scores, the home step count, the
run summary distance, the battle results and the blind reveal, and the club
and drop cards.

The Feel section of the lush layer demos all three.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Five runtime effects on a Reanimated clock, each a wrapper that measures,
falls back to plain views until Skia is ready and pauses when it cannot be
seen (background, another screen on top, scrolled away, reduced motion):

- Sheen: brushed metal with a light that sweeps across every six seconds.
  The Black membership card is now drawn with it (BlackCard) on the plan
  picker, compare plans and Welcome to Black, and the profile's card row.
- Aurora: soft ribbons of light on a near-black sky, behind the welcome
  hero, the city call-up and Welcome to Black.
- Shimmer: the live tug of war with a heat ripple and a hot core (TugBar
  live), on the live battle and the live club fixture. Meter gains liquid;
  the Home step ring and the manage membership OUT bar fill as a liquid.
- Foil: holographic foil masked to the object, on badges and emotes.
- City lights: the race globe's night side, with twinkling cities, a soft
  terminator and a thin atmosphere; CityLights draws a planet on its own.

The lush layer's Shaders section shows each one at its real size.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
…rter labels

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
three.js and react-three/fiber (exact versions, React 19 and RN 0.81) behind
components/three, loaded on demand so screens that never ask pay nothing.
Globe3D: a night Earth with shader-drawn land dots from the coastline table,
city lights as one Points, a thin fresnel atmosphere, pins and a glowing
arc with sparks; drag to turn. Coin3D: a thick brushed steel coin with the
mark embossed, lit by a painted studio environment, with a spring flip.
The race lobby and the wallet balance card swap them in once 3D is ready
and keep their Skia and image versions until then. The lush page's 3D tab
shows both plus a status card with the frame cost on this device.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
A CountUp changes its value every 70ms, and a layout entering animation that
restarts on every render left new columns stuck below the line until the
count finished. Each column now slides in from below and out upwards on its
own shared values, with columns that have just gone kept for 200ms to leave.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
The 3D OUT coin was turned down. The wallet goes back to its coin image,
the 3D tab on /lush shows only the globe and the status card, and the
coin scene is removed. The frame cost card says when the figures come
from a software renderer rather than a GPU.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
The race lobby draws a three.js globe once 3D has loaded and keeps the
Skia globe until then; the Skia clock still pauses off screen. The pin
cards now keep their names and cities clear of the screen edge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV
Bars, the tug bar and the step ring are now Skia paths painted by a
shader, with two blurred copies underneath, on canvases that bleed past
the track, so the edges are antialiased and the glow fades out into the
card instead of stopping at a box or a circle. The white caps, sparks
and flow bands are tinted with the tone. The foil is a cool
iridescence on the highlights with a glint and a blurred blue bloom
behind the object. The aurora has curtains with fine rays and its sky
feathers into whatever holds it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV

This branch had an error being deployed

1 failed (outdated) deployment
Preview — 94312cb8 Deployed Oct 15, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants