A real-time ephemeral chat application. No accounts, no message history — just instant WebSocket-powered conversation.
- Ephemeral rooms — create or join any room by name, messages exist only while the server is running
- Real-time messaging — WebSocket-based with automatic reconnection
- Slash commands —
/nick,/color,/pm,/giphy,/clear,/help, and more - Code blocks — share code with syntax highlighting via
```languagefenced blocks or!code - Multiline messages — Shift+Enter for newlines, Enter to send
- Theme system — 10 color themes (zinc, slate, rose, orange, green, blue, violet, yellow, red, cyan) with light/dark/system mode
- Color persistence — your chosen
/colorsurvives page refreshes - User sidebar — see who's in the room with colored indicators
- Private messages —
/pm @user messagefor direct messages - GIF support —
/giphy queryto send animated GIFs - Nickname dialog — optional nickname on join, saved to localStorage
- React 19 + TypeScript
- TanStack Start (full-stack framework)
- TanStack Router (file-based routing)
- Vite (build tool)
- Tailwind CSS v4 + shadcn/ui (styling & components)
- Radix UI (accessible primitives)
- highlight.js (syntax highlighting)
- Nitro + crossws (server & WebSockets)
- Biome (linting & formatting)
- Vitest (testing)
bun install
bun run devThe app runs at http://localhost:3000.
bun run build
node .output/server/index.mjsOr manually:
- Connect your GitHub repo in the Railway dashboard
- Railway auto-detects the
railway.jsonconfig - Set any environment variables (e.g.
GIPHY_API_KEYif using/giphy) - Deploy — the app binds to Railway's
PORTautomatically
| Command | Description |
|---|---|
/nick <name> |
Change your nickname |
/color <color> |
Change your message color (any CSS color) |
/pm @user msg |
Send a private message |
/giphy <query> |
Send an animated GIF |
/list |
Refresh the user list |
/clear |
Clear your message history |
/help |
Show all commands |
```lang |
Fenced code block with syntax highlighting |
!code <text> |
Inline code block |