VISCon Hackathon 2026 · Campus & Student Life

Find your way around ETH.

10:14:41

Analysis I · Exercise session

HG E 41 · starts 10:15

ScheduleYour day, one tap away.

NavigateA route that knows the floor.

10:15 · On timeRight room, first try.

11:02:08

Done early · lunch at 11:50

Somewhere quiet · close by

Study placesFree rooms first, then the closest.

Live occupancyWi-Fi counts, every minute.

11:04 · Seat foundA free seat, one minute away.

11:50 · Lunch Crew

Five hungry people.
One group chat.

0messages
0decisions

Socials · Food picker

Where are we
eating today?

  1. 1
    Pick your groupLunch Crew · 5 friends
  2. 2
    Swipe today's dishesDiet, allergens, price and "open now" filter first
  3. 3
    The group agreesEveryone's likes become one canteen, one tap to go

...where's
Helena?

The app

Built on ETH's own data. Located on your phone.

10:14 Indoor navigationA blue dot that knows the floor. Routes over stairs and lifts, right to the door.
11:02 Study placesFree rooms near you, live from Wi-Fi and room bookings.
11:50 Lunch togetherToday's Mensa menus. Everyone swipes, the group gets one canteen.
Live Friends on the mapLive, end-to-end encrypted, only with the people you choose.
Your scheduleCourses from the VVZ. One tap from the lecture to the room.
Search everythingRooms, buildings, courses, lecturers, canteens, friends.
Step-free & across campusLift-only routes, and Zentrum ↔ Hönggerberg with the eLink bus.
iPhone + webA native SwiftUI app and a web app with a 3D building explorer.
12,427ETH beacons we can use
2.5 mmedian position error in HG, right floor 96 %
544rooms with occupancy info (Wi-Fi, bookings or estimate)

The whole system

Two apps, one backend, one compose file.

docker compose · findmyeth internal network · no published ports HTTPS + WS /api bundles /rt WebSocket SQL publish Wi-Fi counts reindex poll daily · 15 min push · every 5 min build · refit plans · OSM · walks iOS appSwiftUI · CoreLocation Web appReact · MapLibre · three Caddy gatewayETH SSO · one port FastAPI API/api/* · routing Postgres+PostGISrooms as polygons Venue bundleshashed · on device Centrifugorealtime channels Meilisearchrooms · courses · people NATS JetStreamoccupancy.wifi.* RisingWave15-min windows Workeringest · occupancy ETH sourcescookpit·roominfo·VVZ NetcenterWi-Fi clients per AP venue-buildgraph · localizer PolyMaps · OSM+ labelled walks
  • Clients
  • Edge
  • Services
  • Data
  • Messaging
  • Static
  • External

How our map works

How we got a blue dot into HG.

HG · floor E · real venue data, simulated position

T 27,422 × 27,422
0.26 % non-zero

2.5 mmedian error

96 %right floor

13.4 mPolyMaps reconstruction

  1. 1
    We wanted Google Maps for ETH GPS dies indoors, but ETH has iBeacons hanging all over campus. 12,427 beacons · goal: floor + position on any iPhone
  2. 2
    We reverse-engineered PolyMaps ETH's app loads everything from public ArcGIS endpoints: beacon UUID, 32,084 rooms, 360 floors. But the beacon coordinates are stripped. our reconstruction: 13.4 m median error
  3. 3
    So we built our own scanner HG Scan: a server plans walking missions; tap checkpoints at door signs, steps and ARKit fill the gaps, every corridor both ways. 61 labelled walks · 9,301 scans
  4. 4
    Model the radio, filter on the phone Fit each beacon's position, power and floor plus wall loss per slab. On the phone: prior = T·belief × scan likelihood, every second. 27,422 points · T in CSR: 16 MB, not 3 GB
  5. 5
    You are here. Fused with steps, compass and barometer; same code in Swift and TypeScript. 4,702 labelled scans in HG

In motion

Same beacons as the ETH App, a different experience.

Video slot media/eth-app-vs-findmyeth.mp4
  • The right floorbarometer and BLE together, lifts included
  • Routes across floors and buildingsstairs, lifts, step-free, even the eLink bus
  • A steadier dotstep detection between scans, no jumping through walls
  • Live context on the maphow full rooms are, today's menus, your friends

The map learns

Every walk makes the next blue dot better.

75 s one full refit
61 walks · 9,301 scans
1Walkopt-in walks upload labelled scans, no identity
2Queuea runner claims the refit job; heartbeat or it's requeued
3Fitradio model per beacon: path loss n, wall loss W per floor slab
4Gate7-fold held-out by session vs. the live model
5Shiphashed bundle, realtime "bundles" event, phones swap on Wi-Fi

Enrichment

The map knows what's happening right now.

ETH Netcenter

Wi-Fi devices

clients per access point · every 5 min

ETH room bookings

Who has the room

08:00now 11:02 · free until 13:1518:00

ETH Mensa (cookpit)

Today's menus

22 canteens · 736 dishes · 05:30 + 10:30

AP → room · only ≥ 5 devices

people ≈ devices ÷ 1.5–1.8

occupancy · every 60 s

Wi-Fi›bookings›typical load

pushed live via Centrifugo

Postgres + search index

freebusyfullHG floor E · 544 public rooms on campus
HG E 27

Free spots~12 people (9–16)free until 13:15

Food near youopen canteens, today's dishes, the group swipe

Sharing your location

Our server forwards your location. It can't read it.

Your phone

{ lon, lat, floor, room }

sealed once per friend's device

HPKE · X25519 · ChaCha20-Poly1305

Our server

x9Fq…Lw0= (ciphertext)

stores only the latest blob, 15 min

Centrifugo · per-user channel

Your friend

{ lon, lat, floor, room }

opened with their device key

key never leaves the phone

  • Opt-in, per friend or group
  • Every 5 s while you walk, 30 s when still
  • Markers glide between fixes

Test it yourself

Walk into HG and look at your phone.