FindMyETH main features

main is the branch the team agreed on for FindMyETH, Team HELPS' ETH Zurich campus app from VISCon Hackathon 2026: a native iOS app, a web app with an admin console, and a FastAPI backend. This page lists every feature on origin/main at commit 685635f (2026-10-10 16:53 UTC), checked against the code and against docs/TODO.md and docs/DEVIATIONS.md.

The iOS app was written on Linux. At this commit docs/BUILD-IOS.md still says it has never been compiled, and the TestFlight pipeline was still being brought up, so iOS rows describe code on main, not behaviour checked on a phone.

126features listed
101Done
12Partial
13Planned / stub
63need the backend
Features per platform and status
Platform Done Partial Planned / stub Total
iOS716885
Web717583
Server476558

App shell & navigation12

The frame every screen sits in and how you jump between tabs and into the app.

Three-tab shell with header

Done

Socials, Navigate and Schedule tabs with the logo on the left of the header and your avatar on the right, which opens Profile.

iOSWeb
  • ios/FindMyETH/Shell/MainTabView.swift
  • web/src/components/Shell.tsx

Custom FMETabBar and AppHeader

Done

A hand-built iOS tab bar (icon above label) instead of the system one, so Marauder mode can draw a quill underline under the active tab.

iOS
  • ios/FindMyETH/Shell/MainTabView.swift

Frosted mobile chrome on web

Done

Header and tab bar are blurred overlays; on Navigate the map runs full-bleed underneath both bars.

Web
  • web/src/components/Shell.tsx
  • web/src/styles/app.css

Desktop layout on web

Done

From 768 px wide the web app switches to a Google Maps style layout: a 400 px sidebar with sections and the map on the right.

Web
  • web/src/lib/theme.ts
  • web/src/styles/app.css

Invite deep links

Done

findmyeth://invite?code=…, https://…/invite/CODE or a pasted code all accept a friend invite; the web has a matching /invite/:code route.

iOSWebNeeds backend
  • ios/FindMyETH/App/AppModel.swift
  • ios/FindMyETH/App/FindMyETHApp.swift
  • web/src/screens/socials/AcceptInvite.tsx

Universal links

Planned / stub

https invite links open the web app; the iOS target only registers the findmyeth:// scheme and has no Associated Domains entitlement yet.

iOS
  • ios/project.yml

Spotlight search

Done

Zentrum rooms, buildings and canteens are indexed into Core Spotlight, so typing "HG F 30" on the home screen opens the room in Navigate.

iOS
  • ios/FindMyETH/Navigate/SpotlightIndexer.swift
  • ios/FindMyETH/App/FindMyETHApp.swift

Push and local notifications

Partial

The app asks for permission, registers with APNs and uploads the token; the server does not send pushes yet, so arrival alerts are local notifications while the app runs.

iOSNeeds backend
  • ios/FindMyETH/App/FindMyETHApp.swift

Guide me there hand-off

Done

Buttons in Socials, Schedule and friend cards switch to Navigate and start a route to that canteen, room or person.

iOSWeb
  • ios/FindMyETH/App/AppModel.swift
  • web/src/lib/guide.ts

Skeleton, empty and error states

Done

Skeleton loaders while data loads, friendly empty states such as "No lectures today" and "No canteens open today", and inline red error pills.

iOSWeb
  • ios/FindMyETH/Design/Components.swift
  • web/src/components/ui.tsx

Haptics

Done

Light and medium taps on swipes, matches and walk checkpoints; the web uses navigator.vibrate where the browser supports it.

iOSWeb
  • ios/FindMyETH/Design/Components.swift
  • web/src/lib/haptics.ts

Login challenge on expired session

Done

A 401 from the API sends you back to the login screen instead of leaving a broken screen.

iOSWebNeeds backend
  • ios/FindMyETH/Networking/APIClient.swift
  • web/src/lib/api.ts

Socials & food picker11

Groups of friends swipe on today's dishes and get one place to eat.

Groups

Done

Group cards with "+ New group" and an editor to rename, add or remove members.

iOSWebServerNeeds backend
  • ios/FindMyETH/Socials/SocialsView.swift
  • ios/FindMyETH/Socials/GroupEditorView.swift
  • web/src/screens/socials/Groups.tsx
  • server/app/routers/social.py

Add friends by QR, link or username

Done

A real QR code, a share sheet invite link (ShareLink, Web Share or copy) and search by exact handle or discoverable users.

iOSWebServerNeeds backend
  • ios/FindMyETH/Socials/FriendQRViews.swift
  • web/src/screens/socials/GroupEditor.tsx

Solo mode

Done

Every user has a private "Just me" group, so you can use the picker alone.

iOSWebServerNeeds backend
  • server/app/routers/food.py

Swipe deck

Done

Dish photo on half the screen, name and price, canteen below, veg, vegan and price filter chips, swipe gestures plus two buttons.

iOSWebNeeds backend
  • ios/FindMyETH/Socials/FoodSwipeDeckView.swift
  • web/src/screens/socials/Swipe.tsx

Real dish photos with credit

Done

Photos come from the ETH cookpit feed with a "Dish photos © ETH Zürich Gastronomie" credit and an icon placeholder when a dish has none.

iOSWebNeeds backend
  • ios/FindMyETH/Socials/FoodSwipeDeckView.swift
  • web/src/screens/socials/Swipe.tsx

Hard constraints and scoring

Done

Vegetarian, vegan, allergens, price cap and "still serving later today" filter dishes before the group score picks a match or compromise.

ServerNeeds backend
  • server/app/services/food_scoring.py
  • server/app/routers/food.py

Recommendation screen

Done

Top pick plus two runner-ups with photo, walk time, price, opening hours, member avatars with yes markers and Guide me there.

iOSWebServerNeeds backend
  • ios/FindMyETH/Socials/FoodRecommendationView.swift
  • web/src/screens/socials/Recommendation.tsx

Live session updates

Done

Joins, progress, new recommendations and closing are pushed over Centrifugo, so the result changes while friends are still swiping.

iOSWebServerNeeds backend
  • ios/FindMyETH/Socials/FoodSessionModel.swift
  • web/src/lib/food.ts
  • server/app/realtime.py

Decide now and restart

Done

The starter can close the vote early; anyone can swipe again or change group from the restart panel.

iOSWebServerNeeds backend
  • ios/FindMyETH/Socials/FoodRecommendationView.swift
  • web/src/screens/socials/Recommendation.tsx

Match celebration

Done

Confetti when the group agrees, and a wax seal on the top pick in Marauder mode.

iOSWeb
  • ios/FindMyETH/Design/Confetti.swift
  • web/src/screens/socials/Recommendation.tsx

Private food channels

Planned / stub

Restrict food session channels with Centrifugo channel tokens; today anyone who knows a session id can subscribe.

ServerNeeds backend
  • docs/TODO.md

Schedule5

Your week of lectures, with a way to walk to each one.

Week view and timeline

Done

Month and day header like iOS Calendar, Mon to Fri tiles, a timeline with the next event highlighted and a sheet on tap.

iOSWebNeeds backend
  • ios/FindMyETH/Schedule/ScheduleView.swift
  • ios/FindMyETH/Schedule/ScheduleCalendar.swift
  • web/src/screens/schedule/Schedule.tsx

Course catalogue search

Done

Search the VVZ catalogue by number, title or lecturer and add courses to your schedule.

iOSWebServerNeeds backend
  • ios/FindMyETH/Schedule/CourseSearchView.swift
  • server/app/routers/schedule.py
  • server/app/services/vvz.py

Calendar file import

Done

Import a .ics export (file picker on iOS, upload on web); the server parses it into your courses.

iOSWebServerNeeds backend
  • ios/FindMyETH/Schedule/ScheduleView.swift
  • server/app/routers/schedule.py

Screenshot OCR

Done

iOS reads course numbers from a timetable screenshot with Vision on the phone and lets you review them; the web uploads the image to server-side tesseract.

iOSWebServerNeeds backend
  • ios/FindMyETH/Schedule/ScheduleOCR.swift
  • web/src/screens/schedule/Schedule.tsx
  • server/app/routers/schedule.py

Lecture slots from room bookings

Done

VVZ has no timeslots for 2026W, so weekly lecture times and rooms are derived from ETH roominfo bookings.

ServerNeeds backend
  • server/app/services/roominfo.py
  • server/app/services/vvz.py

Profile, stats & settings8

Your own data, kept on your phone where possible.

Profile header and edit

Done

Avatar, display name, department and semester with an edit sheet.

iOSWebNeeds backend
  • ios/FindMyETH/Profile/ProfileView.swift
  • ios/FindMyETH/Profile/EditProfileView.swift
  • web/src/screens/profile/Profile.tsx

On-device presence log

Done

Your positions and friend sightings are logged on the device for 60 days and never uploaded; you can delete them from Profile.

iOSWeb
  • ios/FindMyETH/Profile/PresenceLog.swift
  • web/src/lib/history.ts

Campus stats

Done

Hours on campus this week with a bar chart, most visited building and room, longest day, weekday streak and a friends ranking.

iOSWeb
  • ios/FindMyETH/Profile/PresenceStats.swift
  • web/src/screens/profile/Profile.tsx

Food preferences

Done

Vegetarian, vegan, allergens and a price cap, used as hard constraints in Socials.

iOSWebServerNeeds backend
  • ios/FindMyETH/Profile/ProfileView.swift
  • web/src/screens/profile/Profile.tsx

Appearance

Done

Light, Dark or System, applied across the app.

iOSWeb
  • ios/FindMyETH/Design/Theme.swift
  • web/src/lib/theme.ts

Map style, routing mode and step-free

Done

iOS settings for Apple or HELPS map, on-device or server routing, and step-free routes by default.

iOS
  • ios/FindMyETH/Profile/ProfileView.swift
  • ios/FindMyETH/App/AppModel.swift

Language and notification settings

Partial

English or Deutsch and a notifications switch are stored, but the language does not change the UI yet.

iOSWeb
  • ios/FindMyETH/Profile/ProfileView.swift
  • web/src/screens/profile/Profile.tsx

About and licences

Done

App version, open-source licences and credits, and log out.

iOSWeb
  • ios/FindMyETH/Profile/ProfileView.swift
  • web/src/screens/profile/Profile.tsx

Avatars & identity4

How friends see you.

Avatar builder

Done

Flat 2D vector character with skin, hair, outfit and accessory, saved in your profile.

iOSWebNeeds backend
  • ios/FindMyETH/Avatar/AvatarBuilderView.swift
  • ios/FindMyETH/Avatar/AvatarSpec.swift
  • web/src/screens/onboarding/AvatarBuilder.tsx

Presets and photo avatar

Done

Pick a preset character or upload a photo, which is shown round and not animated.

iOSWebServerNeeds backend
  • ios/FindMyETH/Avatar/AvatarView.swift
  • web/src/components/Avatar.tsx
  • server/app/routers/social.py

Animated avatar with context pose

Partial

Avatars animate and switch pose by room type (eating, lecture, studying, walking); map markers do not show photos or animation yet.

iOS
  • ios/FindMyETH/Avatar/AvatarView.swift
  • ios/FindMyETH/Avatar/AvatarSpec.swift

Discoverable switch

Done

Choose whether other students can find you by name in user search.

iOSWebServerNeeds backend
  • web/src/screens/profile/Profile.tsx
  • server/app/routers/social.py

Find-my, privacy & realtime7

Location sharing where the server only ever sees ciphertext.

End-to-end encrypted sharing

Done

Positions are sealed with HPKE (X25519, ChaCha20-Poly1305) for each recipient device, keys are Ed25519-signed, and the server keeps only the last ciphertext for 15 minutes.

iOSWebServerNeeds backend
  • ios/FindMyETH/FindMy/FindMyCrypto.swift
  • ios/FindMyETH/FindMy/FindMyService.swift
  • web/src/lib/crypto.ts
  • server/app/routers/findmy.py

Send policy

Done

Send immediately after moving more than 3 m or changing floor, every 5 s while moving and every 30 s while still; same rules on iOS and web.

iOSWeb
  • ios/FindMyETH/FindMy/FindMySendPolicy.swift
  • web/src/lib/findmy.ts

Per-friend and per-group sharing

Done

Toggle sharing for whole groups or single friends; off by default.

iOSWebServerNeeds backend
  • ios/FindMyETH/Profile/ProfileView.swift
  • web/src/screens/profile/Profile.tsx

Vanish now

Done

One button stops sharing and deletes every blob you have on the server.

iOSWebServerNeeds backend
  • ios/FindMyETH/FindMy/FindMyService.swift
  • web/src/lib/findmy.ts
  • server/app/routers/findmy.py

Arrival notifications

Done

An encrypted "arrived" event shows "Sam arrived on campus" as a local notification on iOS or a toast and browser notification on web.

iOSWebNeeds backend
  • ios/FindMyETH/FindMy/FindMyService.swift
  • web/src/components/Shell.tsx

Realtime channels

Done

Centrifugo JWT from /api/realtime/token with food, user-limited find-my, occupancy and bundle channels; live share lands in about a second.

iOSWebServerNeeds backend
  • server/app/realtime.py
  • ios/FindMyETH/Networking/RealtimeClient.swift
  • web/src/lib/realtime.ts

Encrypted push payloads

Planned / stub

A Notification Service Extension to decrypt find-my pushes when the app is closed.

iOSNeeds backend
  • docs/DEVIATIONS.md

Positioning & sensors14

Indoor position from ETH Bluetooth beacons, plus walks that make it better.

ETHPositioning Bayes localizer

Done

Swift package that loads the HG beacon bundle (33 MB with the lookup table) and runs the same grid filter as the HGScan Python model.

iOS
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Core/PositioningEngine.swift
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Core/LocalizerBundle.swift

BeaconScanner and motion hints

Done

iBeacon ranging at about 1 Hz for the ETH UUID, with barometer and pedometer hints.

iOS
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Device/BeaconScanner.swift
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Device/MotionHints.swift

FusionEngine

Done

Step-based dead reckoning, floor hysteresis with barometer, Kalman smoothing and GPS gating; the Swift and TypeScript versions agree to 2e-14 m on a shared fixture.

iOSWeb
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Core/Fusion.swift
  • packages/positioning-ts/src/fusion.ts

Parity and fusion tests

Done

Swift and TypeScript tests replay a recorded HG walk against expected Python output.

iOSWeb
  • ios/Packages/ETHPositioning/Tests/ETHPositioningTests/ParityTests.swift
  • packages/positioning-ts/test/parity.test.ts

iOS location: BLE or GPS

Done

The app uses a BLE estimate younger than 10 s and falls back to GPS, switching bundles when you enter another building.

iOS
  • ios/FindMyETH/Location/LocationService.swift
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Device/PositionProvider.swift

FusionEngine wired into the iOS app

Planned / stub

Feed LocationService through FusionEngine and add a .fused source; the Swift engine is ready, the app does not use it yet.

iOS
  • ios/FindMyETH/Location/LocationService.swift
  • docs/POSITIONING-FUSION.md

Web Bluetooth positioning

Done

Android Chrome scans beacons with requestLEScan (behind a Chrome flag, feature-detected with an explanation) and runs the fused engine in the browser.

Web
  • packages/positioning-ts/src/webbluetooth.ts
  • web/src/lib/location.ts

Motion sensors on iPhone Safari

Planned / stub

Ask DeviceMotionEvent.requestPermission() from a tap; until then Safari gives the web app no steps or heading.

Web
  • web/src/lib/location.ts
  • docs/TODO.md

SensorRecorder

Done

Records BLE, motion and GPS streams in the v1 chunk format for contribution walks.

iOS
  • ios/Packages/ETHPositioning/Sources/ETHPositioning/Device/SensorRecorder.swift

Positioning beyond HG

Planned / stub

Survey CAB and other buildings, an accuracy circle and floor badge on the blue dot, and an "approximate" mode elsewhere.

iOSWeb
  • docs/TODO.md

Improve accuracy: guided walks

Done

The server plans a mission; you walk it with a heading-up strip map, rooms left and right, a lane diagram, a distance countdown and a haptic at each checkpoint.

iOSWebServerNeeds backend
  • ios/FindMyETH/Contribute/MissionScreen.swift
  • ios/FindMyETH/Contribute/LaneDiagramView.swift
  • web/src/screens/profile/ImproveAccuracy.tsx
  • server/app/hgscan/planner.py

Blocked reports and reroute

Done

Report a blocked corridor with a reason and get a new mission; reports reach the admin walkability queue.

iOSWebServerNeeds backend
  • ios/FindMyETH/Contribute/BlockedSheet.swift
  • server/app/routers/contribute.py

AR assist

Done

Optional headless ARKit session records camera poses (and LiDAR wall distances) during a walk, never images.

iOSNeeds backend
  • ios/FindMyETH/Sensors/ARAssistTracker.swift

Upload, summary and leaderboard

Done

Gzipped chunks upload during the walk; afterwards you see usable metres and a weekly and all-time contributor leaderboard.

iOSWebServerNeeds backend
  • ios/FindMyETH/Contribute/ChunkUploader.swift
  • ios/FindMyETH/Contribute/ContributeSummaryView.swift
  • server/app/routers/contribute.py

Onboarding1

First launch.

Onboarding flow

Done

Welcome, log in with your team account, two opt-ins (location sharing, arrival notifications) and the avatar step; shown once per account.

iOSWebServerNeeds backend
  • ios/FindMyETH/Onboarding/OnboardingView.swift
  • web/src/screens/onboarding/Onboarding.tsx
  • server/migrations/003_onboarded.sql

Design system & Marauder mode9

Lagoon Classic by default, and a hidden parchment-and-ink theme.

Lagoon Classic tokens

Done

Tint #337691, neutral surfaces, light and dark sets, round controls, 16 px cards and soft shadows on both platforms.

iOSWeb
  • ios/FindMyETH/Design/Tokens.swift
  • web/src/styles/tokens.css

Typography and logo

Done

Plus Jakarta Sans titles over system body text, and the FindMyETH map-pin logo.

iOSWeb
  • ios/FindMyETH/Design/Typography.swift
  • ios/FindMyETH/Design/Logo.swift
  • web/src/components/Logo.tsx

Voice trigger

Done

Saying "I solemnly swear that I am up to no good" into search turns the mode on and "Mischief managed" turns it off; the choice is remembered.

iOSWeb
  • ios/FindMyETH/Design/Theme.swift
  • web/src/lib/marauder.ts

Parchment theme

Done

A second token set in parchment and ink for light, and a candlelit dark variant.

iOSWeb
  • ios/FindMyETH/Design/Theme.swift
  • web/src/styles/marauder.css

Parchment map

Done

Parchment land, ink-outlined buildings and calligraphy building names (IM Fell English on web, Noto Sans Italic labels on iOS).

iOSWeb
  • web/src/map/parchment.ts
  • ios/FindMyETH/Navigate/MapLibreStyle.swift

Footsteps and footprints

Done

Routes are drawn as footsteps and friends as footprints with a name ribbon instead of avatars.

iOSWeb
  • ios/FindMyETH/Design/Marauder.swift
  • web/src/map/MapView.tsx

Ink reveal and fold-out sheets

Done

The map inks in from your position when opened and bottom sheets unfold like paper.

iOSWeb
  • ios/FindMyETH/Design/Marauder.swift
  • web/src/styles/marauder.css

Ink details

Done

Parchment grain, ink-blot loader, quill stroke under the active tab, ink flourish dividers, torn-paper tags, wax seal and ink-stamp buttons.

iOSWeb
  • ios/FindMyETH/Design/Marauder.swift
  • web/src/styles/marauder.css

Wake-up gesture and ink icons

Planned / stub

A non-voice gesture to wake the map and hand-drawn ink icons.

iOSWeb
  • docs/TODO.md

Web app & admin13

The same app in the browser, plus the operator console at /admin.

Installable PWA

Done

Web manifest, home-screen icons and a hand-written service worker with an offline shell; it never caches /api or /rt.

Web
  • web/public/manifest.webmanifest
  • web/public/sw.js
  • web/vite.config.ts

Admin: Overview

Partial

Headline numbers and suggested actions; applying an action is a server stub (404).

WebServerNeeds backend
  • web/src/admin/Overview.tsx

Admin: Walkability review

Partial

List graph edges by status, confidence and popularity and approve or block them in bulk; approvals made before the latest graph rebuild are orphaned.

WebServerNeeds backend
  • web/src/admin/Walkability.tsx

Admin: Path builder

Partial

Draw new edges and stair or lift connectors on a floor; splitting an edge returns 501.

WebServerNeeds backend
  • web/src/admin/PathBuilder.tsx

Admin: Mission templates

Done

Create, edit and delete the missions contributors walk.

WebServerNeeds backend
  • web/src/admin/Missions.tsx

Admin: Sessions and replay

Done

Filter contribution sessions, replay them on the map and accept, exclude, trim or reprocess.

WebServerNeeds backend
  • web/src/admin/Sessions.tsx

Admin: Coverage and steering

Done

See surveyed coverage, steer where missions go and message contributors.

WebServerNeeds backend
  • web/src/admin/Coverage.tsx

Admin: Model builds

Partial

List and compare localizer builds and publish one; the publish gate is not yet enforced by the manifest.

WebServerNeeds backend
  • web/src/admin/Builds.tsx

Admin: Beacons, people and devices

Done

Beacon inventory, users and their registered devices.

WebServerNeeds backend
  • web/src/admin/Beacons.tsx
  • web/src/admin/Misc.tsx

Admin: Audit log

Done

Searchable log of admin actions by actor and kind.

WebServerNeeds backend
  • web/src/admin/Misc.tsx

Admin: Menu overrides

Done

Hide or correct dishes from the cookpit feed.

WebServerNeeds backend
  • web/src/admin/Misc.tsx

Admin: Data sources

Partial

Health of each source with run and refresh buttons; the page does not yet show the new stale, failures and next-run fields.

WebServerNeeds backend
  • web/src/admin/Misc.tsx
  • server/app/services/sources.py

Admin: Flags and demo clock

Done

Feature flags and a demo date that makes menus and bookings behave as on that day.

WebServerNeeds backend
  • web/src/admin/Misc.tsx
  • server/app/clock.py

Backend & data sources15

FastAPI on Postgres/PostGIS with workers that pull ETH data.

Auth modes

Done

Password accounts (scrypt, login, logout, change password), username mode for demos and trusted proxy headers; team accounts become admins.

ServerNeeds backend
  • server/app/auth.py
  • server/app/routers/social.py

Account provisioning

Done

A CLI creates team and judge accounts from a file kept outside git and makes judges friends with the team.

ServerNeeds backend
  • server/app/accounts.py
  • server/migrations/002_accounts.sql

OIDC login

Planned / stub

AUTH_MODE=oidc exists but returns 501; ETH single sign-on is not implemented.

ServerNeeds backend
  • server/app/auth.py

Social, food and schedule APIs

Done

Friends, invites, groups, photos, canteens, dishes, food sessions, courses, .ics and OCR endpoints.

ServerNeeds backend
  • server/app/routers/social.py
  • server/app/routers/food.py
  • server/app/routers/schedule.py

Search index

Done

Meilisearch index of rooms, buildings, POIs, canteens, courses and lecturers, rebuilt and swapped atomically, with an in-process fallback scorer.

ServerNeeds backend
  • server/app/services/search.py

Occupancy

Done

Bands per room from today's bookings, recomputed every 60 s by the worker and published on change.

ServerNeeds backend
  • server/app/services/occupancy.py
  • server/app/routers/places.py

Netcenter Wi-Fi counts

Planned / stub

The ingest endpoint and aggregation are built and tested, but no Wi-Fi data is posted yet.

ServerNeeds backend
  • server/app/routers/places.py
  • docs/DATA-SOURCES.md

Data workers

Done

Scheduler with per-source backoff for cookpit menus, the VVZ dump mirror and roominfo bookings, falling back from live to cache to seed.

ServerNeeds backend
  • server/app/workers/__main__.py
  • server/app/services/sources_jobs.py
  • server/app/services/cookpit.py

Seeds for offline demos

Done

Bundled menus, rooms, bookings, courses and the HG survey venue so the stack runs without network.

Server
  • server/seed/
  • server/app/seed.py

Bundles manifest

Done

Content-hashed URLs for venue files, search.sqlite and localizer bundles, with a realtime notice when a new manifest is out.

ServerNeeds backend
  • server/app/routers/places.py
  • server/app/venue.py

Contribute v2 API

Done

Mission planning with the vendored HGScan planner, gzip chunk ingest, finish processing, blocked reports and leaderboard.

ServerNeeds backend
  • server/app/routers/contribute.py
  • server/app/services/survey.py

Admin API

Done

Endpoints behind every admin page, including graph edits, session review, builds and flags.

ServerNeeds backend
  • server/app/routers/admin.py

Venue build tool

Done

Turns ETH map data into floor GeoJSON, routing graphs with reconstructed floor links, search.sqlite and beacon bundles.

Server
  • tools/venue-build/venue_build/graph.py
  • tools/venue-build/venue_build/search.py
  • tools/venue-build/venue_build/localizer.py

RisingWave occupancy stream

Partial

Optional compose profile for streaming occupancy; the Python worker aggregator is what runs by default.

ServerNeeds backend
  • deploy/risingwave/001_occupancy.sql

Server test suite

Done

pytest coverage for auth, food flow, find-my, routing, contribute, admin, sources, scoring and places.

Server
  • server/tests/

Deploy & release tooling7

How the stack ships to staging and the app to TestFlight.

Compose stack

Done

Gateway, api, worker, PostGIS, NATS, Centrifugo and Meilisearch, with RisingWave as an optional profile.

Server
  • deploy/compose.yaml
  • deploy/Dockerfile.api

Caddy gateway

Done

One public port serving the web, /admin, /api, /rt and hashed /venue and /bundles files, with basic auth on staging and no-cache for sw.js.

Server
  • deploy/Caddyfile

Tag-driven staging deploy

Done

Pushing a vX.Y.Z tag runs a self-hosted job that syncs the code to staging and rolls the stack.

Server
  • .github/workflows/release.yml
  • deploy/scripts/deploy-on-host.sh

TestFlight pipeline

Partial

The same tag can archive, cloud-sign and upload the iOS app; it sits behind TESTFLIGHT_ENABLED and was still being debugged at this commit.

iOS
  • ios/scripts/testflight.sh
  • .github/workflows/release.yml

XcodeGen project

Done

project.yml is the source of truth and make-project.sh generates the Xcode project.

iOS
  • ios/project.yml
  • ios/make-project.sh

CI on pull requests

Planned / stub

Typecheck, lint, build and run server, TypeScript and Swift tests on every PR.

iOSWebServer
  • docs/TODO.md

Production promote

Planned / stub

Choose the access mode and promote a staged tag to the hackathon production VM.

Server
  • docs/TODO.md

No feature matches these filters.