FindMyETH · branch comparison

Main vs my mock

Feature-by-feature comparison of the team app on main (ios/FindMyETH, web/src, backend) and the clickable mock on laurence/3-frontend-mock (mock/ios/FindMyETHMock, mock/web). The branch only adds files under mock/, so merging creates no file conflicts; the differences are in features and data models.

Only in main (could adopt)Only in my mock (could bring to main)In both, differentbackend needs the serverspec which side matches the spec

App shell & navigation

Only in main

  • Custom tab bar + header with Marauder quill underline Shell/MainTabView.swift
  • Deep links, universal-link plan, Spotlight continuation, APNs + local notifications backend
  • AppConfig base URL / gateway auth, session-expiry logout backend

Only in my mock

  • Launch arguments for automated screenshots -fme-screen, screenshots.sh
  • Global toast

Different

  • Main: hand-made header + tab bar. Mock: native TabView + toolbar. Only main has the quill underline main

Socials & food picker

Only in main

  • Real sessions with live updates, Decide now, restart backend
  • Real QR generation + scanning, ShareLink invites
  • Real dish photos with credit line
  • Skeleton / empty / error states in the deck

Only in my mock

  • New "My Friends" page: groups, Contacts roll-out, group/contact detail with Hungry? + Stats leaderboard
  • Simulated friends finishing, rolling counters

Different

  • Both: groups, Tinder swipe with stamps, filters, top pick + 2 runner-ups, confetti
  • Mock QR and invite link are fake; mock price chip is fixed, main uses the profile price cap

Schedule

Only in main

  • Real .ics import, on-device OCR of screenshots + review, catalogue search, per-week loading catalogue
  • "No lectures today. Next: …" hint

Only in my mock

Nothing significant.

Different

  • Same layout (merged header, Mon–Fri, next highlighted); mock add-course flows are placeholders

Profile, settings & stats

Only in main

  • Stats from a real on-device presence log
  • Group-level sharing, friends list with remove backend
  • Settings: map style, routing mode, step-free, language, licences, real log out
  • "Findable by username" toggle

Only in my mock

  • Live avatar pose opt-in with explanation
  • "I'm hungry" toggle, Mischief managed button
  • Full-body profile hero, photo viewer

Different

  • Same section order; mock stats are static; mock Edit Profile is much richer

Avatars & identity

Only in main

  • Avatar presets
  • Photo upload backend
  • Static map avatar snapshots (no animation, photos not loaded yet)

Only in my mock

  • Sticker avatar system: art pipeline, composer + renderer, parity test, 16 skins, 18 hair styles incl. hijab/turban, bodies, wheelchair/crutches, 7 poses
  • Avatar creator: randomise + undo, reset, autosaved draft
  • Edit Profile: live preview, name rules, initials colours, photo crop, undo
  • Context poses from motion + campus places

Different

  • Main: simple round builder. Mock: full-body figures with poses, closer to the design answers ("animated, pose follows context") mock
  • Mock web still uses the old avatar style

Find-my, privacy & realtime

Only in main

  • End-to-end encrypted location sharing, send policy, per-friend/group access, vanish now, arrival notifications, realtime client backend

Only in my mock

UI toggles only.

Different

  • Same layout in Profile; only main does anything real

Positioning & sensors

Only in main

  • ETHPositioning package: Bluetooth beacon localizer, fusion engine, scanner, recorder, tests
  • Location service (beacons first, then GPS), AR assist, Improve-accuracy missions
  • Note: iOS fusion not wired yet (docs/TODO.md)

Only in my mock

  • PoseEngine: location + motion only to pick a pose

Different

  • Mock README still says "no location permission", but live poses ask for it after opt-in (doc out of date)

Onboarding

Only in main

  • Welcome → log in → opt-ins → avatar (login needs the backend)

Only in my mock

None; starts in the tabs.

Different

n/a

Design system

Only in main

  • Type scale helpers (28/22/17/15/13) + SemiBold font
  • Full Marauder set: ink-blot loader, wax seal, quill stroke, flourish, torn edges, fold-out sheets
  • Skeleton, error pill, empty state components

Only in my mock

  • Two-tone teal brand pin with ETH cut-out: app icon (light/dark/tinted) and header logo, shared by iOS and web
  • Palette passed through the environment (no tab reset on theme switch)

Different

  • Dark-mode status colours: main keeps the spec's red/green, mock uses lighter ones main
  • Three different logos: main iOS "E" pin, main web "E" pin, mock ETH pin

Web app

Only in main

  • Router, data caching, installable PWA, /admin console, /explore 3D, Improve accuracy, Web Bluetooth positioning, encrypted find-my, realtime

Only in my mock

  • Simulated walk on routes; single-store app

Different

  • Both MapLibre with Google-like style; desktop breakpoint 768 px (main, per contract) vs 900 px (mock) main

Build & release tooling

Only in main

  • Tag-driven release: staging deploy + TestFlight; project generated on CI

Only in my mock

  • Committed Xcode project, live.sh (pull → build → relaunch), build-check.sh, screenshots.sh, Linux Swift checks

Different

  • Main ignores the Xcode project in git; the mock commits it

Conflicts to sort out before combining

  1. Avatar data model. Main stores builder/preset/photo with number-based options; the mock stores initials/photo/avatar with named options and keeps all three. The server can't store the mock's version yet.
  2. Pose names differ between main iOS, main web and the mock. Poses travel inside the encrypted location message, so the team must agree on one list.
  3. Same type names (NavigateView, ProfileView, AvatarPose, RootView, …) can't share one app target.
  4. Theming mechanics and settings keys differ (environment palette vs global tokens).
  5. Map stack: SwiftUI MapKit annotations vs MapKit/MapLibre image markers; only MapLibre can match the spec colours.
  6. Location data: mock floors like "E" vs main's level ids like ETH.HG.F.
  7. Project settings: bundle ids (can coexist), iOS 18 vs 17, packages vs none, committed vs generated Xcode project.
  8. Spec departures in the mock: friends list panel, MapKit base map, native tab bar without quill, dark status colours.

Recommended adoption list

From main into my mockEffort
Type scale + SemiBold; align dark red/green with the specS
Tab bar with quill underline + headerS
Marauder extras (loader, fold-out sheets, torn tags, flourishes)S–M
Skeleton / error / empty statesS
Details as a real bottom sheet; decide on the Friends listS
Indoor rooms by type + occupancy (in progress via subagent)M
MapLibre "HELPS" renderer for the spec paletteL
Offline onboardingM
Real QR + ShareLink invitesS
.ics import + on-device OCR against mock coursesM
Route header, unverified warnings, pick a start (in progress)S
Real dish photos + creditS
From my mock into mainEffort
Sticker avatar system (needs one agreed avatar schema)L
Friends as full-body map figures + clustersM
Edit Profile flowM
Photo crop + photo viewerS–M
Avatar creatorM
Context poses (after agreeing names + privacy wording)M
Draggable list panelS–M
Rolling numbersS
Unified two-tone logo + app iconS
Demo-mode simulated walkS–M
Canteen dishes + "Friends here" in detailsS
Dev loop tooling (live.sh, build-check, screenshots)S