Pulse — Realtime Incident Console
A live incident board shared by every operator: a Ktor WebSocket server, a Next.js web console, and Android and iOS apps from one Kotlin Multiplatform codebase. A dropped connection resumes exactly where it left off.

See it running
The problem
Realtime is easy to demo and hard to get right. The problems that bite only appear once connections are unreliable and there is more than one client: what a client missed while its connection was down for thirty seconds, what happens to everyone when one client stops reading, and how a client knows it has fallen behind instead of quietly showing a stale screen.
How it’s built
Every change carries an increasing sequence number. A client reconnects with the last one it applied and the server replays exactly the gap; a client gone too long is told it lagged and gets a fresh snapshot, and a client holding a cursor ahead of a restarted server gets a snapshot too, rather than waiting for events that will never come. The broadcast drops the oldest messages for a slow reader instead of blocking everyone, which is safe because the reader can detect the gap. The mobile clients share the whole protocol (cursor, back-off, the reducer over every message type, restart detection) in one Kotlin Multiplatform module, with a shared Compose Multiplatform UI and a host of about twenty lines on each platform.
What it does
- Reconnecting clients receive exactly the events they missed
- One slow client cannot stall the broadcast for everyone else
- A restarted server is detected and the stale board replaced
- Acknowledging is idempotent: two operators clicking at once is not an error
- Android app run on an emulator and iOS app on a simulator, both against the live server
Learn to build software like this
The free courses teach the same craft — from the basics to a real, running project.





