Repository navigation
Outhere mobile app, every prototype screen, on Supabase - #4
EmotiveImpact wants to merge 106 commits into
Conversation
- 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
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
|
CI on this PR is red, but no job has actually run. Every job ( The same checks pass locally on 31a924c: database rules and RLS tests, regenerated types with no diff, 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
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
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
…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
…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
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
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.
Finish and the lush layer.
components/ui,FINISH.md) and checked side by side against the prototype.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.services/haptics.js) wired into countdowns, swipes, results, holds and checkout, plus rolling digit numbers and lift on press.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 thestory-mediaEdge Function.scripts/build_setup_sql.pywrites 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.jspicksremote.js(Supabase) orengine.js(local).Checks. The
MobileandDatabaseworkflows 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.
Still to do on the hosted project (bpquinogyvlgjtpppktc).
story-media.🤖 Generated with Claude Code
https://claude.ai/code/session_01GuNoar5FSdqFXBKo7d7CmV