Skip to content
Glossary

What Is a Real-Time App?

A real-time app delivers updates to users instantly as data changes — without requiring them to refresh the page. Chat, live dashboards, collaborative editing, and multiplayer games are real-time apps.

A real-time app pushes updates to users the moment data changes, instead of waiting for them to reload the page. Chat, live dashboards, collaborative editors, multiplayer games, and live booking calendars are real-time apps.

Request-response vs. real-time

Most web apps follow a request-response cycle: the user asks (clicks, navigates, refreshes), the server answers, and the data sits frozen until the next request. A real-time app inverts the direction of control. The server pushes new state to connected clients as soon as it changes, so the screen updates on its own.

Request-responseReal-time
Who initiates updatesThe client (refresh/poll)The server (push)
FreshnessAs of last loadLive
ConnectionOpened per requestPersistent / subscription
Good forArticles, settings, reportsChat, presence, live data

How real-time apps work

Real-time delivery is built on a small set of transport technologies, each with a clear sweet spot:

  • WebSockets — a persistent, bidirectional connection between client and server. Best for high-frequency, two-way traffic like chat and multiplayer.
  • Server-Sent Events (SSE) — one-way server-to-client push over plain HTTP. Lighter than WebSockets and a good fit for live feeds, tickers, and notifications where the client only listens.
  • Supabase Realtime — you subscribe to Postgres table changes, and inserts/updates/deletes are broadcast to every connected client over WebSockets.
  • Firebase Firestore — document and query listeners that fire automatically whenever the underlying data changes.

Most teams reach for a managed layer (Supabase or Firebase) rather than hand-rolling raw WebSockets, because the hard parts — scaling connections, auth, reconnection — come built in.

Example: subscribing to live booking changes with Supabase

const channel = supabase
  .channel('bookings')
  .on('postgres_changes',
    { event: 'INSERT', schema: 'public', table: 'bookings' },
    (payload) => setBookings((prev) => [...prev, payload.new])
  )
  .subscribe();

Any new row in the bookings table appears in every open client instantly — no polling, no manual refresh. This is the pattern behind a live calendar that shows a slot as taken the second someone else books it.

When you actually need real-time

Real-time is worth the added complexity when stale data causes real problems:

  • Users refresh to see new data. If people habitually hit reload, that is a direct signal the data should be pushed instead.
  • Stale data leads to wrong decisions — double-bookings, overselling inventory, two agents replying to the same ticket.
  • Collaboration or presence matters — shared editing, "who's online", typing indicators, live cursors.

When you probably don't

  • Data changes once an hour (or less). A periodic fetch or a manual refresh button is simpler and cheaper.
  • Content is mostly static — blogs, docs, marketing pages, dashboards reviewed once a day.
  • The cost of being a few minutes out of date is effectively zero.

Reaching for real-time "because it feels modern" adds infrastructure, edge cases, and battery/data usage with no payoff if nobody needs second-by-second freshness.

Real-time adds genuine complexity

These are the problems that turn a real-time feature from a demo into a production system:

  • Conflict resolution — two users editing the same record at once; who wins, and how is the loser told?
  • Presence — accurately tracking and showing who is currently connected.
  • Reconnection handling — what the client does when the connection drops and later recovers (catch-up, dedupe, resync).
  • Message ordering — events can arrive out of order, so the UI must not assume strict sequence.

Budgeting for these up front is the difference between a feature that works on launch day and one that quietly corrupts state under load.

A real-world example

BookBed, a booking SaaS built with Flutter, Firebase, and Stripe, keeps availability live across devices and syncs bidirectionally with external calendars over iCal. The point of real-time there is concrete: prevent two guests from grabbing the same date, and keep every connected screen agreeing on what is actually free.

Key takeaways

  • A real-time app pushes changes to clients instantly instead of waiting for a refresh.
  • Common transports: WebSockets (two-way, high frequency), SSE (one-way push), and managed layers like Supabase Realtime and Firebase Firestore.
  • Use it when stale data causes wrong decisions or when users keep refreshing; skip it when data rarely changes.
  • The hard part isn't pushing data — it's conflict resolution, presence, reconnection, and ordering.

Want a live dashboard, booking calendar, or collaborative feature built right? Contact for a quote.

Continue reading

Want this built?