RizTech Academy logo
RizTech Academy
Web & Mobile AppOpen source

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.

Backend & APIs, Mobile App Development, Web App Development, Testing & CI
Pulse — Realtime Incident Console — Web & Mobile App case study
Screens

See it running

Web, Android and iOS

The same live board on three clients. The Android and iOS apps share their protocol code and UI through Kotlin Multiplatform.

  • Pulse Android app showing a live incident list with critical, warning and info incidents, acknowledge buttons and the number of operators watching
    Android
  • Pulse iOS app showing the same live incident list with an incident acknowledged from the iPhone
    iOS
  • Pulse web console with a live status, operators watching, a form to raise an incident and a list of incidents to acknowledge
    Web console (Next.js)

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.