Skip to content
Role
Product · UX · Frontend (solo)
Team
Solo
Period
2026.05 – 2026.06
Tools
Next.js, TypeScript, Supabase, Leaflet, Tailwind, Figma

The web console that watches the sickness metric

Glide Console

Glide Console running live – district scores, map layers and the event feed

Summary

The console puts Glide's sickness metric on a map: a Glide Score for each of Seoul's 25 districts, the rides running right now, and the events as they land. In studies it doubled as the operator's screen for replaying scenarios.

25
Districts scored live

TOPIS traffic · Tmap roads

6
Map layers

Heatmap · districts · live roads · incidents · signals · crosswalks

27,763
OSM points on the map

6,793 signals · 20,970 crosswalks

Live: glide-saas.vercel.app · Main project: Glide

What it shows

  • District scores – a weighted average for the whole city, 0–100, higher is safer, with all 25 districts sorted into safe, watch, rough and severe.
  • Risk top five – the roughest districts right now, in order. This is the screen you route around.
  • Active rides – current rides split across live, simulation, game and idle.
  • Live events – hard braking, sharp turns, recovery actions and route comparisons, timestamped and tied to a participant code so a session can be replayed later.

The map

Six layers stack on the map: a sickness heatmap, district polygons, live road speeds, incidents, traffic signals and crosswalks.

  1. undefinedCanvas instead of SVG, so everything can be on at once

  2. undefinedDark map, light panels

Data

One Supabase project holds seven tables: participants, sessions, events, the sickness time series, haptic firings, vehicle positions and district scores.

Every session carries a mode — live, simulation, game or idle — so real drives and simulated ones replay through the same screen. Without the sensor board, faked readings drive the same view.

Bringing it back

Four months after launch the screen was empty. Three things had gone wrong at once.

  • The database was gone. A free-tier project that had sat idle was deleted — not unreachable, the hostname itself no longer resolved. The schema was still in the repo, so it went straight back up on a new project.
  • The map provider changed its terms. The keyless tiles started arriving stamped "API KEY REQUIRED". Swapped for a provider that needs no key.
  • One condition was inverted. The district panel had always read zero, not because of the data but because of if (!cancelled || !data) return; — it bailed out even on a good response.