Skip to content

Pontis

App Store

PUC-Rio campus map that reads your timetable and points at the building of your next class.

OpenPrivate repository

Overview

Pontis maps 102 places across the PUC-Rio campus — buildings, canteens, services, entrances — on a custom Mapbox style. Point it at a screenshot of your timetable and it reads the schedule on device, then makes the building of your next class pulse on the map.

Problem

A campus of a few hundred metres holding 102 named places is a legibility problem before it is a navigation one. At the zoom a person actually uses, every pin overlaps every other one and the map becomes a smear — showing everything is as useless as showing nothing.

Trade-off

Mapbox ships clustering and it was turned down: clustering collapses a group of places into a numbered bubble, and here the name of each place is the whole point — a freshman looking for one specific canteen gains nothing from being told there are six things here. Three layers of custom display policy replaced it, so every pin that survives keeps its identity and its label.

What it does

102 places in eight categories, over a custom Mapbox campus style
Zoom gating per category: buildings fade out up close, canteens fade in
Density limiter that keeps one pin per grid cell, resolved deterministically
Spiderfy: tapping a crowded pin opens its neighbours in a ring
Next class highlighted from an on-device Vision read of a timetable screenshot
Offline-first — the campus is cached locally and drawn before the network answers

Stack

SwiftSwiftUIMapboxMapsCoreLocationVisionFirebase FirestoreFirebase StorageSwiftCSVCombineSwiftLintXcode Cloud

What I took from it

Deciding what deserves to be on screen at each zoom is product work wearing the clothes of a rendering problem. And anything driven by camera movement fires every frame, so the fix for pins flickering in and out was not the policy itself but quantising the input the policy reads.

More iOS work

Work

Set in Uncut Sans and Commit Mono. Built to the iOS metrics: 8pt grid, 17px body, 44px targets, spring physics.

© 2026 Lucas Santhiago. All rights reserved.