contact.exe
UNISPACE

</unispace>

UNISPACE

Live campus occupancy for 18 buildings. GPS never leaves your device.

18

campus buildings live

0

GPS coordinates leave the device

30 min

session ID rotation

SPECIFICATIONS

ROLESOLO BUILD
YEAR2026
TYPEPWA
STATUSIN DEVELOPMENT
STACKreact 19 · typescript · tailwind v4 · vite · mapbox · supabase · pwa · turf.js +5 more
LINKS[github ↗]
AVAILABILITYin development

University of Melbourne students waste hours searching for study spaces.

Real-time campus occupancy platform for university students.Live building heatmaps across 18 Parkville campus buildings, floor-by-floor breakdowns, crowd reporting with noise levels, smart spot recommendations filtered by amenities and walking distance, 24-hour predictive forecasting, and push alerts when spaces free up.

README.TXT: UNISPACE (5 KB)[full readme →]

== WHAT IS THIS ==

────────────────────────────────────────

Real-time campus occupancy platform for university students. Live building heatmaps across 18 Parkville campus buildings, floor-by-floor breakdowns, crowd reporting with noise levels, smart spot recommendations filtered by amenities and walking distance, 24-hour predictive forecasting, and push alerts when spaces free up. Privacy-first: GPS never leaves your device.

== </the problem> ==

────────────────────────────────────────

University of Melbourne students waste hours searching for study spaces. Libraries fill up silently, building occupancy is invisible, and there's no way to know which spaces have the amenities you need or how busy they'll be in an hour.

== </my approach> ==

────────────────────────────────────────

Built a privacy-first PWA with real-time occupancy heatmaps across 18 campus buildings. Client-side geofencing ensures GPS never leaves the device, while a crowd reporting system and multi-source data fallback chain keep the map useful even with zero active users.

== </the story> ==

────────────────────────────────────────

UniSpace is a progressive web app that shows students where to find a seat on campus. The pilot campus is the University of Melbourne, Parkville, covering 18 buildings across the full campus.

Open the app and you see a full-viewport Mapbox map with building polygons color-coded by occupancy: green (empty), yellow (moderate), red (packed). Tap a building and a bottom sheet shows floor-by-floor breakdown, amenities, noise levels, and a 24-hour prediction chart. The "Find me a spot" feature recommends the best available space filtered by what you need (power outlets, quiet zones, group tables, accessibility) and how far you want to walk.

No account required. GPS coordinates never leave your device. Zone detection runs client-side via Turf.js point-in-polygon, and only a zone_id is broadcast. Session IDs rotate every 30 minutes. Zero telemetry. Users can report occupancy on a 1-5 scale with noise levels, save favorite spaces, and receive push notifications when spaces free up.

Data sources use a fallback chain: live crowdsourced occupancy, Google current popularity, EWMA predicted occupancy, Google typical popularity, or no data. The system gets smarter as more students use it.

== </architecture> ==

────────────────────────────────────────

Frontend is React 19 with TypeScript, Vite 8, and Tailwind CSS v4, built as a PWA. Mapbox GL JS renders the dark-v11 base map with custom building polygon layers and category-colored pins with clustering. State management uses Zustand with localStorage persistence.

The privacy layer is the core architectural constraint. All geofencing runs client-side using Turf.js point-in-polygon. The device determines which zone the student is in locally, then broadcasts only the zone_id to Supabase Realtime. No coordinates are ever sent to the server.

Backend runs on Supabase: PostgreSQL with Row Level Security (anonymous read-only, service-role writes), Realtime channels for live occupancy updates, and Deno Edge Functions for zone aggregation and Google Places API integration. Database schema: campuses > buildings > building_zones > zone_occupancy, plus prediction tables, Google caches, and user alerts.

Charts use Recharts for 24-hour occupancy predictions with historical pattern analysis. Animations use Framer Motion for bottom sheet transitions and map interactions. Google Places API provides baseline popularity data and floor-level views.

== </key features> ==

────────────────────────────────────────

Live occupancy heatmap

Full-viewport Mapbox map with building polygons color-coded by occupancy. Tap for floor-by-floor breakdowns.

Smart spot finder

Recommendations filtered by amenities (WiFi, power, quiet, accessibility, group tables) and walking distance.

24-hour predictions

Forecasting charts based on historical patterns and live crowd data so you can plan ahead.

Crowd reporting

1-5 scale occupancy ratings with noise level tracking. The system gets smarter with every report.

Push notifications

Get alerted when your favorite spaces free up. No manual checking needed.

Zero-knowledge privacy

GPS stays on device. Client-side geofencing via Turf.js. Session IDs rotate every 30 minutes.

== </key decisions> ==

────────────────────────────────────────

DECISION 01

Privacy-first was the foundational design constraint, not a feature. Students won't use an app that tracks them across campus. Running all geofencing client-side via Turf.js means the server never sees where you are, only which zone you're in. Session IDs rotate every 30 minutes so even zone-level data can't be traced back to individuals.

DECISION 02

The data fallback chain (live > Google current > predicted > Google typical) ensures the map always shows something useful, even with zero active users. This solves the cold start problem that kills most crowdsourced apps.

DECISION 03

Building as a PWA instead of a native app means zero friction to install. Students can add it to their home screen in one tap without going through an app store. The crowd reporting system (1-5 scale with noise levels) gamifies contributions while the favorites system keeps users coming back to check their preferred spaces.

DECISION 04

Scaling from 5 to 18 buildings required a normalized database schema (campuses → buildings → building_zones → zone_occupancy) with proper RLS policies to handle concurrent anonymous users without data leaks.

== </what i learned> ==

────────────────────────────────────────
>

Privacy constraints force better architecture. Client-side geofencing is more complex to build but creates genuine user trust.

>

The cold start problem is the biggest risk for crowdsourced apps. Multi-source fallback chains are essential on day one.

>

Scaling from 5 to 18 buildings exposed every shortcut in the original schema. Normalize early.

react 19 · typescript · tailwind v4 · vite · mapbox · supabase · pwa · turf.js · zustand · recharts · framer-motion · deno edge functions · google places api

IN DEVELOPMENT