Problem
Most chat products begin with account systems, social graphs, and broad collaboration features. For a few people sharing a quiet space over time, that machinery can become the distraction.
VA-11 Chat starts with a smaller question: how can a self-hosted, understandable system provide channel-isolated real-time conversation while retaining the privacy and administration that matter?
Role
Creator / Maintainer.
System
- Single-process architecture: one long-running Node.js process serves the Express API, static frontend, and native WebSocket connections.
- Channel isolation: an administrator creates channels and users; visitors sign in with channel credentials, and messages remain within their channel.
- Local persistence: channel configuration and the latest 100 messages live in JSON and JSONL files, without a database or ORM.
- Encrypted history: AES-256-GCM protects messages at rest, with separate secrets for signed cookies and message encryption.
- Lightweight safeguards: login and message rate limits, secure production cookies, and explicit single-instance deployment boundaries.
- Deliberately simple frontend: Vite and React power responsive login, chat, and administration views without a component library.
Impact
The project compresses real-time communication, authentication, persistence, and deployment into a small, reviewable codebase. Vitest integration tests, Docker Compose, and a GitHub Actions workflow make it practical for small self-hosted, single-instance communities while keeping the system's security boundaries visible.
Why It Matters
Simplicity does not mean ignoring the hard parts. VA-11 Chat gives each layer a reason to exist: WebSockets for live conversation, encrypted files for retained history, and a single process because horizontal scale is outside the product's purpose. It is an exercise in product restraint and understandable software.