EVRION.
Ripple — main project image

Web App · Real-time Chat

A full-stack real-time chat app: 1:1 and group conversations, persistent history, live presence, typing indicators, unread counts, optimistic send, and recovery after a dropped connection.

Project
Ripple
Year
2025
Discipline
Real-time Web
Stack
React · Socket.IO · Postgres

Context

Ripple is a real-time chat app with the features people actually expect from one: direct and group conversations, persistent history, presence, typing indicators, and unread counts that stay correct as you move between rooms.

Chat is one of those deceptively simple-looking products — easy to demo, hard to make feel solid once the network gets involved.

Challenge

Real-time UIs have to feel instant while staying truthful. A message should appear the moment you hit send, but it also has to reconcile with what the server actually persisted — and the whole thing has to survive a dropped connection without losing or duplicating messages.

Presence and typing indicators add live, ephemeral state that needs to scale across many sockets without hammering the database for every keystroke.

Approach

Sends are optimistic — the message shows immediately and reconciles against the server's confirmation — and the client recovers gracefully after a reconnect, catching up on anything it missed while offline. History is persisted in Postgres so conversations survive restarts.

Live, ephemeral signals like presence and typing run over Socket.IO with Redis coordinating state across connections, keeping the volatile data off the primary database.

Outcome

Ripple delivers the complete real-time loop: instant optimistic sends, live updates across rooms, presence, typing indicators, accurate unread counts, and clean reconnect recovery — the details that decide whether a chat app feels trustworthy or flaky.

It's split into a clear client/server architecture, so the real-time layer and the React app each stay focused on one job.

Technical Detail

React + Vite on the client; Node/Express with Socket.IO on the server, backed by PostgreSQL for persistent history and Redis for presence and cross-socket coordination. JWT auth secures the API and socket connections.

The server exposes a REST API alongside the socket layer, with a SQL schema and migration step, so message history and live events share one coherent backend.

// Gallery

A direct conversation with persisted history
A direct conversation with persisted history
A group conversation room
A group conversation room
Conversations with last-message previews
Conversations with last-message previews

// Next step

The next case study could be yours. Tell us what you're building and we'll tell you honestly how we'd ship it.