Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
18bd198
Phase 0: clean foundation for the OutHere rebuild
claude Oct 11, 2026
15fb2ba
Add local-first data engine, query hooks and design kit
claude Oct 11, 2026
f72803b
Run every screen on the local engine with the new design kit
claude Oct 11, 2026
666e556
Design kit: motion, toasts, sheets, covers and bundled imagery
claude Oct 12, 2026
ab32940
Design and feel pass across every screen
claude Oct 12, 2026
2408723
Clean the look: calmer kit and decluttered screens
claude Oct 12, 2026
b7ba8da
Lighten the type: Clash Grotesk Medium for display, weights capped at…
claude Oct 12, 2026
7fbf505
Home: put Outside now at the top
claude Oct 12, 2026
5e9d8cd
Add the Outhere Supabase schema, seed, tests and types
claude Oct 15, 2026
6a04aa1
Mobile: midnight design kit, rings and dots, rebuilt Home
claude Oct 15, 2026
0e86233
Mobile: run on Supabase when configured, with email code sign in
claude Oct 15, 2026
19bc3bb
Stories: story-only rings in the stories row, private story files, ni…
claude Oct 15, 2026
31a924c
Stories on Cloudflare R2, story viewer and posting, new Welcome, goal…
claude Oct 15, 2026
cea5574
Database: website waitlist, club claims and Black requests
claude Oct 15, 2026
bb7a788
Six battle modes: character select, mode picker, live race lobby, sea…
claude Oct 15, 2026
23db482
Club play database: claim a club from the app, review, founding clubs…
claude Oct 15, 2026
a64f2ac
Run clubs and club v club in the app
claude Oct 15, 2026
94312cb
Only Pro and Black post stories, enforced in the database and the upl…
claude Oct 15, 2026
7ba1832
Join the monorepo: merge the pnpm and Turborepo root, move the phone …
claude Oct 15, 2026
2412842
Database gaps for the web app: private profiles, join requests, badge…
claude Oct 15, 2026
245e108
Merge branch 'worktree-agent-aa9d777621c4c5d5a' into claude/mobile-ap…
claude Oct 15, 2026
4c0d8e9
Run the Edge Function checks from their own folder
claude Oct 15, 2026
1fc52d7
Club links with no clashes: reserved words table, letters and numbers…
claude Oct 15, 2026
4199004
Account data: settings, privacy, under 18 mode, your patch and your week
claude Oct 15, 2026
f8dab73
Move and runs data: saved routes, suggestions, run history with split…
claude Oct 15, 2026
b2eb4ac
Profile area data: plans, streak freezes, emotes, badges, invites and…
claude Oct 15, 2026
bd25ea4
Crew data: race, goal, crew days, challenges, stats, boards, feed, ch…
claude Oct 15, 2026
0341106
Outside in the database: UK places, the City League, swipe and myster…
claude Oct 15, 2026
88966e3
Website goes UK-wide: waitlist, claims and Black requests take a city…
claude Oct 15, 2026
6feaf9d
Crew data on Supabase: remote twins for the Crew tab, stories with st…
claude Oct 15, 2026
7e04c26
QR codes for tickets and the photos the Outside screens use
claude Oct 15, 2026
11856d1
Merge branch 'claude/mobile-app-build-nhob8r' into worktree-agent-ad0…
claude Oct 15, 2026
fe3e9c4
Regions use the website's eleven names, and town claims land in a lau…
claude Oct 15, 2026
a304b64
Profile area screens: membership, wallet, friends, invites, search, b…
claude Oct 15, 2026
50282c1
Active members per place, so a town can see how close it is to 100
claude Oct 15, 2026
8eedda3
Outside data layer: places, the City League, swipe, mystery challenge…
claude Oct 15, 2026
cd79b30
Profile area polish after the web pass: lit Black column, streak acti…
claude Oct 15, 2026
70eda88
Merge branch 'worktree-agent-aaf8ca1a2d68e454c' into claude/mobile-ap…
claude Oct 15, 2026
a3f76cb
Outside: glass pill bar, new Arena and Challenges screens
claude Oct 15, 2026
e6f34a9
Close the rest of the web app's schema gaps (part 16)
claude Oct 15, 2026
5201e5f
Merge fix: the profile badges join the first seven; types regenerated
claude Oct 15, 2026
7291756
Merge branch 'worktree-agent-a3f42bfeb20d8bce4' into claude/mobile-ap…
claude Oct 15, 2026
ae38c0b
Outside: rename migration to 101720; drops, checkout, orders, events …
claude Oct 15, 2026
811da9f
Call pgcrypto through the extensions schema, as hosted Supabase insta…
claude Oct 15, 2026
3facc06
Merge branch 'claude/mobile-app-build-nhob8r' into worktree-agent-ad0…
claude Oct 15, 2026
85c51bc
Crew and stories screens: crew tab, feed, chat, challenges, stats, bo…
claude Oct 15, 2026
bc2e060
Outside: event detail, QR ticket and who's going screens
claude Oct 15, 2026
bf19da7
Merge branch 'worktree-agent-aab362fd30d837854' into claude/mobile-ap…
claude Oct 15, 2026
1d98b7f
Outside: battle invite, live versus, results, countdown, quick create…
claude Oct 15, 2026
8222522
Getting started, Home, Your week, Settings, inbox and app states
claude Oct 15, 2026
6d800f4
Add the splitter used to apply migrations through the Supabase connector
claude Oct 15, 2026
d2417f2
Outside: swipe deck, picks, mystery challengers, reveal and safety; b…
claude Oct 15, 2026
8d0a184
Home live count reads right before anyone is out
claude Oct 15, 2026
e7e230f
Merge branch 'worktree-agent-a19b8d2d164859ad6' into claude/mobile-ap…
claude Oct 15, 2026
eeb8d27
Outside: City League, city v city, called up, rising, fair play, area…
claude Oct 15, 2026
c4af774
Merge branch 'claude/mobile-app-build-nhob8r' into worktree-agent-ad0…
claude Oct 15, 2026
d87a189
Move and runs screens: live run, routes, history, sharing and safety
claude Oct 15, 2026
cbd3512
Merge branch 'worktree-agent-aa117181c24136aa7' into claude/mobile-ap…
claude Oct 15, 2026
eeef43b
Outside: build on the crew and account merge
claude Oct 15, 2026
fdc0376
Outside: fixes from the web screenshots
claude Oct 15, 2026
703ffbf
Add a clean-slate setup file builder for the SQL Editor
claude Oct 15, 2026
7d4ca27
Merge claude/mobile-app-build-nhob8r (Move and runs) into Outside
claude Oct 15, 2026
8c9290d
Set Pro's yearly price to £59.99 and mark both yearly prices confirmed
claude Oct 15, 2026
46e6928
Merge branch 'worktree-agent-ad03a539963eb83c9' into claude/mobile-ap…
claude Oct 15, 2026
96f67b7
Reserve every place name as a club link, regenerate types
claude Oct 15, 2026
a37819f
Move: live race lanes over the map and today's challenges before a run
claude Oct 15, 2026
16c2707
Launch: the ring draws in, the dot springs into the gap, then the liv…
claude Oct 15, 2026
c5ce01b
Fixes from the screen audit
claude Oct 15, 2026
4433740
Show icons on blue buttons on the web
claude Oct 15, 2026
8acde26
Saved routes keep their altitude, so the climb chart shows
claude Oct 15, 2026
83508b3
Event detail: draw the route on the map card
claude Oct 15, 2026
c45b658
Previews of the watch app, widgets and lock screen, linked from Settings
claude Oct 15, 2026
9d0afac
NATIVE_TARGETS.md: what the watch app, widgets and Live Activity need
claude Oct 15, 2026
c9ea4c0
Add the finish kit: the prototype's light, glass and glow as shared p…
claude Oct 15, 2026
f467b2b
Move: prototype map texture, live HUD, countdowns on Spotlight
claude Oct 15, 2026
5544498
Clubs restyle: launch into welcome, onboarding objects, run club scre…
claude Oct 15, 2026
80f359d
Restyle Profile and Account screens with the finish kit
claude Oct 15, 2026
459cf6d
Outside restyle: Arena, Challenges and the 1v1 builder on the finish kit
claude Oct 15, 2026
5278e74
Outside restyle: Drops, Events, News and the shop at full strength
claude Oct 15, 2026
14b0589
Wallet and membership restyle: blended cards, silver Black column, th…
claude Oct 15, 2026
968a006
Clubs restyle: club v club screens (fixture, league, pick, modes, rel…
claude Oct 15, 2026
099631c
Merge outside area restyle
claude Oct 15, 2026
6ba2e35
Restyle social, crew admin, streak and badges screens
claude Oct 15, 2026
1219d75
Clubs restyle: stories, crew tabs and the city board
claude Oct 15, 2026
6978e87
Restyle the state screens: story card, empty crew, loading, error, of…
claude Oct 15, 2026
ef24aa7
Merge clubs, crew and stories restyle
claude Oct 15, 2026
559b141
Restyle battles, swipe and cities onto the finish kit
claude Oct 15, 2026
fe5ebd2
Move: restyle locating, idle, route sheets, runs, routes, safety and …
claude Oct 15, 2026
062455e
Make the watch, widget and lock screen previews full screen pages
claude Oct 15, 2026
438108c
Merge battles, Swipe and cities restyle
claude Oct 15, 2026
5f516eb
Merge profile, account and previews restyle
claude Oct 15, 2026
d333b06
Merge move, runs and countdowns restyle
claude Oct 15, 2026
c247dda
Keep the onboarding step headlines at 48 after the merge
claude Oct 15, 2026
6f1f694
Stop the fixture turnout test failing just after midnight
claude Oct 15, 2026
ea12e43
Add the lush layer page with three empty sections
claude Oct 16, 2026
467a005
Add a Vercel config so the phone app's web build can be previewed
claude Oct 16, 2026
b2db81e
Give the app a physical feel: named haptic moments, rolling numbers, …
claude Oct 16, 2026
f72aa7c
Add the Skia shader kit and apply it to the screens
claude Oct 16, 2026
b7e3c47
Tidy the Feel demo tiles: three to a row, bars dark until played, sho…
claude Oct 16, 2026
9567e47
Add real 3D: the race globe and the OUT coin with three.js
claude Oct 16, 2026
1784014
Merge the Skia shader kit
claude Oct 16, 2026
c053dfd
Roll digit columns in and out with shared values, not layout animations
claude Oct 16, 2026
2828084
Merge haptics and rolling numbers
claude Oct 16, 2026
91722b3
Drop the 3D coin and keep the flat coin on the wallet
claude Oct 16, 2026
937e7b4
Merge the real 3D race globe
claude Oct 16, 2026
b539a77
Let the lush glows feather past their shapes and redo the foil
claude Oct 16, 2026
8f2652f
Tighten the glow on bars and badges so they read sharp
claude Oct 16, 2026
1c52427
Give the bars a crisp white shimmer and bring back the first aurora
claude Oct 16, 2026
45d8f93
Add three bar looks to pick from: neon, liquid glass and pulse
claude Oct 16, 2026
421828f
Make neon the look for every bar and the step ring, and clean it up
claude Oct 16, 2026
1bbc8eb
Add the Fighter Pack contract: slots, poses, credits, silhouettes
claude Oct 16, 2026
237d07b
Fighter Pack in the game: versus look, pack pictures, runner choice
claude Oct 16, 2026
a3a630f
Fighter Pack flow screens: consent, face scan, verified, making, revi…
claude Oct 16, 2026
278840a
Add the Fighter Pack schema: credits, consent, scans, packs and poses
claude Oct 16, 2026
e3cf4c4
Add the avatar-pack Edge Function: scans, fal generation, webhook and…
claude Oct 16, 2026
bbfc4cd
Add the Fighter Pack data layer: local engine, Supabase twin and hooks
claude Oct 16, 2026
50d6b19
Merge branch 'pack-data' into claude/project-thread-g9s6ow
claude Oct 16, 2026
c66a66d
Pack scan: let the data layer shrink the shots
claude Oct 16, 2026
d132516
Pack: error state at the door, portrait samples, scan holds each angle
claude Oct 16, 2026
746124f
Fighter Pack: AI pictures of members across the game (#8)
EmotiveImpact Oct 16, 2026
4e0c2a8
Merge main (web app and website) into the mobile app
claude Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 0 additions & 5 deletions .emergent/emergent.yml

This file was deleted.

46 changes: 46 additions & 0 deletions .github/workflows/mobile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Mobile

on:
pull_request:
paths:
- "apps/mobile/**"
- "packages/core/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- ".npmrc"
- ".github/workflows/mobile.yml"
push:
branches: [main]
paths:
- "apps/mobile/**"
- "packages/core/**"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"

concurrency:
group: mobile-${{ github.ref }}
cancel-in-progress: true

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
# Typecheck and test the phone app and the shared package it uses.
- run: pnpm turbo run typecheck test --filter "@outhere/mobile..."
- name: Web build (local data)
working-directory: apps/mobile
run: pnpm exec expo export --platform web --output-dir /tmp/web
- name: Web build (Supabase mode)
working-directory: apps/mobile
env:
EXPO_PUBLIC_SUPABASE_URL: https://example.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY: ci-placeholder
run: pnpm exec expo export --platform web --clear --output-dir /tmp/web-remote
51 changes: 51 additions & 0 deletions .github/workflows/supabase.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Database

on:
pull_request:
paths: ["supabase/**", ".github/workflows/supabase.yml"]
push:
branches: [main]
paths: ["supabase/**"]

jobs:
migrations:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:17
env:
POSTGRES_PASSWORD: postgres
ports: ["5432:5432"]
options: >-
--health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 10
env:
PGHOST: localhost
PGUSER: postgres
PGPASSWORD: postgres
steps:
- uses: actions/checkout@v4
- name: Migrate, seed and test
run: ./supabase/tests/run.sh
- name: Types are up to date
run: |
createdb oh_types
sed "/^create role/d" supabase/tests/shim.sql | psql -d oh_types -q > /dev/null
for f in supabase/migrations/*.sql; do psql -d oh_types -q -v ON_ERROR_STOP=1 -f "$f" > /dev/null; done
python3 supabase/scripts/gen_types.py oh_types /tmp/database.ts
diff -u supabase/types/database.ts /tmp/database.ts

functions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
# Run from the functions folder so Deno reads its own deno.json and
# leaves the pnpm workspace at the root alone.
- name: Typecheck Edge Functions
working-directory: supabase/functions
run: deno check story-media/index.ts
- name: Test the R2 helper
working-directory: supabase/functions
run: deno test --allow-env _shared/r2_test.ts
8 changes: 4 additions & 4 deletions Docs/Prd.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

## Status
- This document defines product behaviour, rules, and UX requirements.
- Engineering execution order lives in docs/BUILD_PLAN.md.
- Codex tasks live in docs/TASKS/.
- Engineering execution order lives in Docs/ROADMAP.md (phases) and Docs/build_plan.md (original tasks).
- Task specs live in Docs/Task/.

## Non-negotiables
- City-first identity (no borough dependency).
Expand All @@ -14,8 +14,8 @@
- Tabs: Home, Move, Outside/Arena, Clubs (Crews), Profile.

## Current repo notes
- Expo Router tabs live in frontend/app/(tabs)/
- API client in frontend/src/services/api.ts defines current endpoints.
- Expo Router tabs live in apps/mobile/src/app/(tabs)/
- API client in apps/mobile/src/services/api.js defines current endpoints.

## Product Requirements Document (PRD)

Expand Down
70 changes: 70 additions & 0 deletions Docs/ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# OutHere Roadmap

The app's screens and navigation are largely built, but much of what they show is hardcoded, there are no real accounts, and the backend trusts whatever the phone sends. This roadmap replaces what sits underneath the screens, one phase per pull request, without redesigning them.

Each phase starts only once the previous phase's "done when" check passes.

## Phase 0: Clean foundation (done)

- One app: `apps/mobile`. The old Emergent `frontend/` app and generated root clutter are removed.
- The Anything (create.xyz) runtime is gone: no fetch override, launcher menu, remote error reporting or sandbox messaging.
- Step sync posts the real count (it used to post 0 every 30 seconds) and uses the local calendar day.
- The DEV BYPASS button only exists in development builds; a failed signup no longer onboards a local-only account.
- The committed Mapbox token is removed; route planning falls back to OSRM without one.
- App identity: name `OutHere`, scheme `outhere`, bundle ID `com.outhere.app`, real permission strings. Native projects are generated by `expo prebuild` / EAS instead of committed.
- iOS maps use Apple Maps (Google Maps needs an SDK and key we don't ship).
- The backend installs from `requirements.txt` and its smoke tests live in `backend/tests`.

**Done when:** the app bundles for iOS, Android and web with only OutHere's own config.

## Phase 0.5: The whole app working on the phone (done)

The server decision is parked so the product can be built and felt first.

- `src/data/engine.js` owns all data in AsyncStorage, simulates a seeded world of 24 players and 5 crews, and applies the rules for XP, OUT, streaks, battles, crews, events, drops, rewards and memberships.
- Every screen reads through React Query hooks (`src/data/hooks.js`) and is built from one design kit (`src/components/ui`). All mock arrays, fake fallbacks, `/api/*` fetches and dead buttons are gone.
- Membership limits are enforced and open an upgrade sheet. Payments are not live, so switching plan is free in this build.
- The old `services/api.js` client and the unused Mapbox and RevenueCat packages are removed, so the app runs in Expo Go.

**Done when:** every tab and detail screen works end to end offline. A server later replaces `engine.js` behind the same functions.

## Phase 1: Accounts and real data

- A dedicated Supabase project: real tables, Row Level Security, Storage for crew logos.
- Sign in with Apple, Google or an email code. The random `device_id` is retired.
- Step ingest goes through a server function that rejects future dates, caps backdating at one day and caps daily steps.
- `src/services/api.js` moves onto Supabase.

**Done when:** two test users cannot read or change each other's data.

## Phase 2: Core loop for real

- Home, Move, Crew and Arena on live data; runs saved to the server.
- Battles and the XP/OUT ledger become database functions with unique keys (no double payouts), and battles complete on a schedule.
- Crew chat and feed in realtime. Every mock array and fake fallback is removed, with proper empty and error states.

**Done when:** none of the five main tabs shows hardcoded data.

## Phase 3: Memberships and payments

- RevenueCat in-app purchases for Pro and Black, with a 14-day Pro trial.
- A store webhook sets the membership tier; gating is enforced on the server.
- Black application and invite flow behind the 14-day streak.

**Done when:** a sandbox purchase unlocks Pro end to end.

## Phase 4: Events, drops, rewards and social

- Events and drops run from a simple admin, with RSVP capacity enforced.
- Rewards catalogue and OUT redemption with weekly limits.
- Friends, user search, news feed and push notifications.

**Done when:** spec tasks 001 to 008 in `Docs/Task` all pass their checks.

## Phase 5: Launch readiness

- Apple Health and Google Fit, background step tracking.
- Crash reporting, analytics, anti-cheat caps and rate limits.
- EAS builds, TestFlight beta, store listings and a privacy policy.

**Done when:** a TestFlight beta is live with real users in London.
Binary file removed Docs/Task.zip
Binary file not shown.
43 changes: 23 additions & 20 deletions Docs/build_plan.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# docs/BUILD_PLAN.md
# OutHere Build Plan (Single Source of Execution Truth)
# Docs/build_plan.md
# OutHere Build Plan

> Tasks 001 to 008 below are largely built as a demo. The current plan for making them real
> (accounts, real data, payments, launch) lives in [ROADMAP.md](ROADMAP.md).

## Goal
Deliver OutHere in stable, shippable increments without breaking existing tracking, UI, or API.
Expand Down Expand Up @@ -38,26 +41,26 @@ This plan is deliberately strict because it prevents the agent from “helpfully
---

## Repo structure assumptions (for agent context)
- Frontend lives in: `frontend/`
- Frontend lives in: `apps/mobile/` (the old `frontend/` app was removed in phase 0)
- Backend lives in: `backend/`
- Tabs and navigation live in: `frontend/app/(tabs)/`
- API client lives in: `frontend/src/services/api.ts`
- Tabs and navigation live in: `apps/mobile/src/app/(tabs)/`
- API client lives in: `apps/mobile/src/services/api.js`
If the repo differs, tasks must be adjusted to actual paths without inventing new architecture.

---

## Working Method (How to Run Codex)
For each task:
1. Ensure the following files exist and are current:
- `docs/PRD.md`
- `docs/BUILD_PLAN.md` (this file)
- `docs/TASKS/00X_*.md` (the task you are running)
- `Docs/Prd.md`
- `Docs/build_plan.md` (this file)
- `Docs/Task/00X_*.md` (the task you are running)
2. Create a branch named:
- `task/00X-short-name`
3. Run Codex with instructions:
- Read `docs/PRD.md`
- Read `docs/BUILD_PLAN.md`
- Read the target task file in `docs/TASKS/`
- Read `Docs/Prd.md`
- Read `Docs/build_plan.md`
- Read the target task file in `Docs/Task/`
- Implement **only** that task file
- Output **git diff patch only**
4. Apply patch locally.
Expand Down Expand Up @@ -98,10 +101,10 @@ If a task introduces regressions:

# Execution Tasks (These are the ONLY tasks to run)
These tasks must be completed in order.
They are stored as markdown files in `docs/TASKS/` and numbered 001–008.
They are stored as markdown files in `Docs/Task/` and numbered 001–008.

## TASK-001 - Arena Tab (Replace Challenges) + Hub Layout
**Task file:** `docs/TASKS/001_ARENA_TAB.md`
**Task file:** `Docs/Task/001_ARENA_TAB.md`

Purpose:
- Establish the new product centre: Arena as the hub.
Expand All @@ -119,7 +122,7 @@ Smoke test focus:
---

## TASK-002 - Backend: 1v1 Battles (Create, List, Detail, Complete)
**Task file:** `docs/TASKS/002_BATTLES_1V1_BACKEND.md`
**Task file:** `Docs/Task/002_BATTLES_1V1_BACKEND.md`

Purpose:
- Create the first “competitive retention loop”.
Expand All @@ -140,7 +143,7 @@ Smoke test focus:
---

## TASK-003 - Frontend: 1v1 Battles UI (Create + List + Detail)
**Task file:** `docs/TASKS/003_BATTLES_1V1_FRONTEND.md`
**Task file:** `Docs/Task/003_BATTLES_1V1_FRONTEND.md`

Purpose:
- Make battles visible and usable from Arena.
Expand All @@ -157,7 +160,7 @@ Smoke test focus:
---

## TASK-004 - XP + OUT Ledgers (Server Source of Truth) + Client UI
**Task file:** `docs/TASKS/004_XP_OUT_LEDGER.md`
**Task file:** `Docs/Task/004_XP_OUT_LEDGER.md`

Purpose:
- Establish the platform economy correctly from day one.
Expand All @@ -179,7 +182,7 @@ Smoke test focus:
---

## TASK-005 - Memberships: Free, Pro, Black + Feature Gating + Black Eligibility (14-day)
**Task file:** `docs/TASKS/005_MEMBERSHIPS_GATING.md`
**Task file:** `Docs/Task/005_MEMBERSHIPS_GATING.md`

Purpose:
- Add monetisation and status access control without breaking the UX.
Expand All @@ -200,7 +203,7 @@ Smoke test focus:
---

## TASK-006 - Crews: Ownership, Roles, Logo Upload (Pro/Black) + No Custom Colours
**Task file:** `docs/TASKS/006_CREW_OWNERSHIP_LOGOS.md`
**Task file:** `Docs/Task/006_CREW_OWNERSHIP_LOGOS.md`

Purpose:
- Turn crews into identity assets and community engines, without design chaos.
Expand All @@ -223,7 +226,7 @@ Smoke test focus:
---

## TASK-007 - Drops + Rewards Catalogue + OUT Redemption
**Task file:** `docs/TASKS/007_REWARDS_DROPS_SHOP.md`
**Task file:** `Docs/Task/007_REWARDS_DROPS_SHOP.md`

Purpose:
- Introduce the commerce loop (drops + redemption) without building a full e-commerce platform prematurely.
Expand All @@ -246,7 +249,7 @@ Smoke test focus:
---

## TASK-008 - Events: List, RSVP, Check-in, Rewards
**Task file:** `docs/TASKS/008_EVENTS_RSVP_CHECKIN.md`
**Task file:** `Docs/Task/008_EVENTS_RSVP_CHECKIN.md`

Purpose:
- Make OutHere physical and sponsor-ready, linking digital status to real-world presence.
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ pnpm workspaces with Turborepo.
- `apps/web` - the website at weouthere.app
- `apps/app` - the member app: clubs, battles, league, Club HQ, and the public club pages (`/<club>`, `/join/<club>`, `/@<handle>`)
- `apps/admin` - Outhere HQ, the staff app
- `apps/mobile` - Expo phone app (primary client). It still installs with npm from its own folder: one dependency is a GitHub tarball, and its patch-package patches and npm overrides move to `pnpm-workspace.yaml` when it joins.
- `apps/mobile` - Expo phone app (primary client). Run it with `pnpm --filter @outhere/mobile start`. Its package pins and patches live in `pnpm-workspace.yaml`, and it shares rules with `packages/core`.
- `supabase` - the database: migrations, seed data, tests and Edge Functions (see [supabase/README.md](supabase/README.md))
- `packages/core` - shared types, rules and data access (example data and Supabase)
- `packages/ui` - shared React components and the stylesheet
- `backend` - API/backend services
Expand Down Expand Up @@ -76,15 +77,14 @@ Bottom tabs:
### Install

```bash
cd apps/mobile
npm install
corepack enable
pnpm install # from the repo root
```

### Run mobile app

```bash
cd apps/mobile
npx expo start
pnpm --filter @outhere/mobile start
```

Useful options:
Expand Down
3 changes: 3 additions & 0 deletions apps/admin/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import { defineConfig } from "vite";

export default defineConfig({
plugins: [react()],
// The workspace installs a flat node_modules for the phone app, which hoists
// its older React to the root. Resolve React from this package everywhere.
resolve: { dedupe: ["react", "react-dom"] },
// Share the member app's images (/img/...) and favicon instead of copying them.
publicDir: "../app/public",
server: { port: 5174 },
Expand Down
8 changes: 6 additions & 2 deletions apps/app/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@ import { defineConfig } from "vite";

export default defineConfig({
plugins: [reactRouter()],
resolve: { tsconfigPaths: true },
// The workspace installs a flat node_modules for the phone app, which hoists
// its older React to the root. Resolve React from this package everywhere.
resolve: { tsconfigPaths: true, dedupe: ["react", "react-dom", "react-router"] },
server: { port: 5173 },
// weouthere.app is the website, which passes every path it doesn't own to
// this app. A folder name the website will never use keeps the two apart.
build: { assetsDir: "_app" },
ssr: {
// Workspace packages ship TypeScript source, so Vite compiles them.
noExternal: ["@outhere/core", "@outhere/ui"],
// React and React Router are bundled too, so the server render and
// react-dom always share this app's copy of React.
noExternal: ["@outhere/core", "@outhere/ui", "react", "react-dom", "react-router"],
},
});
14 changes: 12 additions & 2 deletions apps/mobile/.env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# OUT HERE Mobile — Environment Variables
# The backend URL for API calls. When running the backend locally:
# Outhere mobile environment variables. Copy to .env and fill in.

# Backend API base URL (the FastAPI server in /backend while it is still in use).
EXPO_PUBLIC_BACKEND_URL=http://localhost:8000

# Mapbox public token for walking route planning. Optional: without it the
# Move tab falls back to the public OSRM router.
EXPO_PUBLIC_MAPBOX_ACCESS_TOKEN=

# Outhere's own Supabase project (never the other app's). Leave blank to run
# on local demo data on the phone.
EXPO_PUBLIC_SUPABASE_URL=
EXPO_PUBLIC_SUPABASE_ANON_KEY=
Loading
Loading