Echo is an open, privacy-minded platform for communities: real-time chat, voice and video (LiveKit), servers and channels, DMs, roles, and the workflows people expect from a modern team or social space—without treating your community as ad inventory.
You can run it yourself (self-host), fork and extend it (AGPL), or use it as the basis for a product you control end-to-end.
From the repository root (Node.js 22.13+, Docker for Postgres):
npm ci
cp .env.example .env
npm run db:up
npm run dev- API: http://localhost:3000
- Vite dev server: http://localhost:8080
Full setup, PR checks, and maintainer notes: docs/DEVELOPMENT.md.
- What Echo is
- Why Echo
- Open source
- Project structure
- Stack (summary)
- Getting started
- Native apps (Tauri)
- Contributing
- Third-party assets
- License
Echo is a full-stack communication app: a Vue 3 SPA, a Node.js (Fastify) API, Socket.IO for realtime, PostgreSQL for durable data, optional NATS for multi-process scaling, and native clients (Tauri) where you want an installed app. A separate marketing site (Astro) and optional Discord bridge / import tooling exist for migration and interoperability—not as the core identity of the product.
The codebase is organized for operators and contributors: typed shared contracts between client and server, documented API behavior under docs/contracts/, and runbooks under docs/operations/.
- Privacy and consent by design — built around clear boundaries for data, sessions, and what the server is allowed to assume about users.
- You own your deployment — no mandatory third-party control plane; configure auth, storage, voice, and edge the way your threat model requires.
- Realtime-first — chat and presence are first-class; voice/video follow a documented LiveKit path with production checklists in-repo.
- Serious engineering guardrails — contract tests, RBAC and snowflake guards in CI, observability hooks, and a single production readiness rollup so progress is inspectable, not hand-wavy.
- Installable where your users are — PWA for the web and Tauri for desktop, Android, and iOS (see
releases/).
Echo is open source under the GNU Affero General Public License v3.0 only (AGPL). Contributions, issues, and pull requests: CONTRIBUTING.md, CODE_OF_CONDUCT.md, .github/SECURITY.md. Documentation index: docs/README.md.
CI (GitHub Actions) — badges target this fork’s default GitHub branch (release/1.0.0). Change ad3lre/echo and branch=… in the URLs if your owner/repo or branch name differs:
Release and signing workflows may need repository secrets on the canonical fork; forks still get format, backend, frontend, and E2E checks when relevant paths change.
frontend/— Vue 3 + Vite SPA (Pinia, TypeScript). Client navigation uses the History API (frontend/src/features/layout/urlNavigation.ts), not vue-router.backend/— Fastify REST API, Socket.IO, Postgres integration, auth and Echo domain logic.shared/— Shared TypeScript types and constants across client and server.scripts/— Migrations, seeds, deploy helpers, asset pipelines.marketing/— Astro site for public pages.bot/,voice-sidecar/,src-tauri/— Optional Discord tooling, voice sidecar, and native shells.
| Layer | Choices |
|---|---|
| Frontend | Vue 3, Vite, Pinia, TypeScript (History API client navigation) |
| Backend | Node.js, Fastify, Socket.IO, TypeScript |
| Data | PostgreSQL |
| Realtime | Optional NATS Socket.IO adapter when NATS_URL is set — see realtime scaling and STACK |
| Voice | LiveKit (session + webhooks + client); ops in docs/operations/livekit-production.md |
| Storage | S3-compatible object storage when ECHO_S3_* is configured (optional) |
- Install from the repo root (
npm ciornpm install). Root install is required (workspaces + devDependencies such assharpfor Twemoji assets). Installing only underfrontend/is not enough fornpm run dev/npm run build. - Node.js 22.13+ (see
package.jsonengines). Forsharp, see sharp install. - Local stack:
npm run db:upthennpm run dev(see.env.example). Postgres-like behavior:ECHO_BACKEND_STORAGE=postgresandDATABASE_URL. - Production-like local bundle:
npm run prod(full build + API on :3000 + Vite preview on :4173). Skip rebuild:npm run prod:serve. - Backend only:
npm run build -w backend(or rootnpm run build) beforenpm start(node dist/backend/src/index.js). - Production:
DATABASE_URLrequired;/api/v1/mockis not registered in production. - VPS / bare metal:
docs/operations/linux-vps-deployment.md. - Seed dev data (API running):
npm run seed:dev.
The SPA ships a manifest, themed icons under frontend/public/icons/ (regenerated on npm run build -w frontend via scripts/generate-pwa-icons.mjs), and a minimal service worker (frontend/public/sw.js). The worker registers in dev and production so Chrome can offer Install Echo on npm run dev (e.g. http://localhost:8080).
- HTTPS: production installability needs a secure context; terminate TLS at your proxy and forward
X-Forwarded-Protowhen HTTPS enforcement is on (seeregisterHttpsEnforcementIfConfiguredand realtime-scaling). - Verify: Vite dev or
npm run build -w frontend && npm run preview -w frontend→ Chrome → Install Echo. Hard-reload once if the prompt is missing. - Icons only:
npm run pwa:iconsfrom repo root.
Windows, macOS, Linux, Android, and iOS — paths, commands, CI pointers in releases/README.md. Signing, stores, and CORS depth live under docs/operations/.
We welcome contributions on GitHub. Start with docs/DEVELOPMENT.md, then CONTRIBUTING.md.
Icons and emoji: terms/en-US/ATTRIBUTIONS.md.
GNU Affero General Public License v3.0 only — see LICENSE.
If you modify this program and offer it as a network service, the AGPL requires offering Corresponding Source to users of that service under the same license. Distributed binaries must also satisfy source-offer rules. See the GNU AGPL howto and FSF FAQ (AGPL).
Downstream: app stores and notarized bundles may add their own terms; packagers remain responsible for AGPL compliance.