Pulse
A realtime chat and social platform. WebSockets for delivery, Redis Pub/Sub for fan-out across processes, and an async FastAPI backend behind it.
Why Pub/Sub, and not just WebSockets
A single server can hold every open socket in memory and deliver a message by looking up the recipient. That works until there are two servers. The sender is connected to one, the recipient to the other, and the message goes nowhere.
Redis Pub/Sub solves it: a server publishes to a channel, every server subscribed to that channel receives it, and each one delivers to whichever sockets it holds. The application stops caring which process a user landed on, which is the property you need before you can run more than one.
The rest of the stack
The backend is FastAPI with async SQLAlchemy 2 and Alembic migrations, so the database calls do not block the event loop that the sockets are living on. Uploads go to MinIO over the S3 API, which means the same code works against S3 in production without a rewrite. Longer jobs run in an ARQ worker rather than inside the request.
The frontend is React 19 with Vite and TypeScript, using TanStack Query for server state and Zustand for the local kind.
The whole stack comes up with Docker Compose, including Postgres, Redis, MinIO and a local mail catcher, so a fresh clone runs with one command.