{"id":47865133,"url":"https://github.com/zcharef/harmony","last_synced_at":"2026-04-04T00:05:37.198Z","repository":{"id":347668066,"uuid":"1188888623","full_name":"zcharef/harmony","owner":"zcharef","description":"Open-source, privacy-first group chat. Discord's UX, Signal's principles. E2EE, self-hostable, single binary.","archived":false,"fork":false,"pushed_at":"2026-03-28T23:42:34.000Z","size":3126,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T00:57:58.651Z","etag":null,"topics":["chat","discord-alternative","end-to-end-encryption","open-source","postgresql","privacy","react","real-time","rust","self-hosted","tauri"],"latest_commit_sha":null,"homepage":"https://joinharmony.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zcharef.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-22T18:06:57.000Z","updated_at":"2026-03-28T23:42:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zcharef/harmony","commit_stats":null,"previous_names":["zcharef/harmony"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/zcharef/harmony","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zcharef%2Fharmony","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zcharef%2Fharmony/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zcharef%2Fharmony/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zcharef%2Fharmony/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zcharef","download_url":"https://codeload.github.com/zcharef/harmony/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zcharef%2Fharmony/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31382355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T23:20:52.058Z","status":"ssl_error","status_checked_at":"2026-04-03T23:20:51.675Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chat","discord-alternative","end-to-end-encryption","open-source","postgresql","privacy","react","real-time","rust","self-hosted","tauri"],"created_at":"2026-04-04T00:05:37.118Z","updated_at":"2026-04-04T00:05:37.188Z","avatar_url":"https://github.com/zcharef.png","language":"TypeScript","funding_links":["https://ko-fi.com/Z8Z11JU7E7"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"mediakit/logo_horizontal_dark.png\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"mediakit/logo_horizontal.png\"\u003e\n    \u003cimg alt=\"Harmony\" src=\"mediakit/logo_horizontal_dark.png\" height=\"64\"\u003e\n  \u003c/picture\u003e\n  \u003cbr /\u003e\u003cbr /\u003e\n  \u003cstrong\u003eYour chat app shouldn't sell your data.\u003c/strong\u003e\n  \u003cbr /\u003e\n  Open-source, privacy-first group communication — Discord's UX with Signal's principles.\n  \u003cbr /\u003e\u003cbr /\u003e\n  \u003ca href=\"https://github.com/zcharef/harmony/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/zcharef/harmony/ci.yml?style=flat-square\u0026label=CI\u0026logo=github\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-AGPL--3.0-blue?style=flat-square\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://joinharmony.app\"\u003e\u003cimg src=\"https://img.shields.io/badge/try_it-joinharmony.app-8b5cf6?style=flat-square\" alt=\"Try Harmony\"\u003e\u003c/a\u003e\n  \u003cbr /\u003e\u003cbr /\u003e\n  \u003ca href=\"https://ko-fi.com/Z8Z11JU7E7\"\u003e\u003cimg src=\"https://ko-fi.com/img/githubbutton_sm.svg\" alt=\"ko-fi\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003e **Status:** Alpha — actively developed. Core chat works. [Try it](https://joinharmony.app) or self-host it.\n\n\u003c!-- TODO: Add screenshot here --\u003e\n\u003c!-- \u003cp align=\"center\"\u003e\u003cimg src=\"mediakit/screenshot.png\" alt=\"Harmony\" width=\"800\"\u003e\u003c/p\u003e --\u003e\n\n---\n\n## Why Harmony?\n\n| | Discord | Revolt | **Harmony** |\n|--|---------|--------|-------------|\n| Client | Electron (~500 MB RAM) | Solid.js PWA | **Web + Tauri desktop (~80 MB RAM)** |\n| Backend | Proprietary | 6 Rust microservices | **Single Rust binary** |\n| Database | Proprietary | MongoDB + Redis + RabbitMQ | **PostgreSQL only** |\n| Self-host | N/A | 6 services + 4 datastores | **Postgres + one binary** |\n| Privacy | Scans messages, sells data | Good | **No data collection, fully auditable** |\n| E2EE | No | No | **Yes (desktop DMs + opt-in channels)** |\n\n### What makes Harmony different\n\n- **Privacy you can verify** — Fully open source under AGPL-3.0. We don't scan your messages, sell your data, or train AI on your conversations. You can read every line of code that handles your data.\n\n- **End-to-end encrypted** — DMs from the desktop app are automatically encrypted using [vodozemac](https://github.com/matrix-org/vodozemac) (NCC Group audited). Keys live in your OS keychain, cryptography runs natively in Rust — private keys never touch JavaScript. Server owners can enable E2EE per channel too.\n\n- **Dead simple to self-host** — One Rust binary + PostgreSQL. That's it. No Redis, no message queues, no object storage. Full features, unlimited users, your rules.\n\n- **Discord migration tools** — Bring your entire server over: channels, roles, categories, permissions. Migration tooling is in active development.\n\n- **Web + Desktop, same codebase** — Use Harmony in the browser with zero friction, or install the Tauri desktop app for E2EE and native performance (~80 MB RAM vs Electron's ~500 MB).\n\n\u003e **Alpha disclaimer:** E2EE is functional but has not yet had a professional security audit. The underlying crypto library (vodozemac) has been [audited by NCC Group](https://matrix.org/media/Hodgson_vodozemac_audit.pdf). Full integration audit planned before beta.\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- [Rust](https://rustup.rs/) (latest stable)\n- [Node.js](https://nodejs.org/) 20+ and [pnpm](https://pnpm.io/)\n- [Docker](https://docs.docker.com/get-docker/) (for Supabase local dev)\n- [Supabase CLI](https://supabase.com/docs/guides/cli) (`brew install supabase/tap/supabase`)\n- [just](https://just.systems/) (`brew install just`)\n\n### Run locally\n\n```bash\n# 1. Clone\ngit clone https://github.com/zcharef/harmony.git\ncd harmony\n\n# 2. Start Supabase (Postgres + Auth + Realtime)\nsupabase start\n\n# 3. Start the Rust API\ncd harmony-api\ncp .env.example .env\njust dev                    # hot-reload on port 3000\n\n# 4a. Start the web app (new terminal)\ncd harmony-app\npnpm install\njust dev                    # opens http://localhost:1420\n\n# 4b. Or start the Tauri desktop app (for E2EE DMs)\njust tauri dev              # opens the native desktop app\n```\n\n### Quality wall\n\nBoth projects enforce a quality wall before merge:\n\n```bash\n# Rust API — fmt, clippy, security audit, all tests\ncd harmony-api \u0026\u0026 just wall\n\n# App — Biome, typecheck, module boundaries, dead code detection\ncd harmony-app \u0026\u0026 just wall\n```\n\n\u003e Run `just` in either project to see all available commands.\n\n---\n\n## Architecture\n\n```\n┌─────────────────────────┐  ┌───────────────────────────────────────┐\n│       WEB BROWSER       │  │         TAURI DESKTOP APP             │\n│  ┌───────────────────┐  │  │  ┌───────────────────────────────┐   │\n│  │  React 19 (Vite)  │  │  │  │  React 19 (Vite)             │   │\n│  │  (same codebase)  │  │  │  │  (same codebase)             │   │\n│  │                    │  │  │  │  + E2EE (Olm / vodozemac)   │   │\n│  └────────┬──────────┘  │  │  └────────────┬──────────────────┘   │\n│           │ HTTP         │  │               │ invoke()             │\n└───────────┼──────────────┘  │  ┌────────────┴──────────────────┐   │\n            │                 │  │  Tauri Rust Runtime            │   │\n            │                 │  │  ├─ vodozemac (Olm crypto)     │   │\n            │                 │  │  ├─ OS Keychain (key storage)  │   │\n            │                 │  │  └─ SQLCipher (message cache)  │   │\n            │                 │  └────────────┬──────────────────┘   │\n            │                 └───────────────┼─────────────────────┘\n            │                                 │\n            └──────────┬──────────────────────┘\n                       │ HTTPS\n            ┌──────────▼──────────┐\n            │   HARMONY RUST API  │\n            │   (single binary)   │\n            └───┬────────────┬────┘\n                │            │\n       ┌────────▼──┐   ┌─────────────┐\n       │ Supabase  │   │  LiveKit    │\n       │ ├ Postgres│   │  (planned)  │\n       │ ├ Auth    │   │  Voice      │\n       │ ├ Storage │   │  Video      │\n       │ └ Realtime│   │  Screen     │\n       └───────────┘   └─────────────┘\n```\n\n---\n\n## Project Structure\n\n```\nharmony/\n├── harmony-api/         Rust API (Axum)\n│   ├── src/\n│   │   ├── domain/      Business logic, models, service traits\n│   │   ├── infra/       PostgreSQL repos, auth adapters\n│   │   └── api/         HTTP handlers, middleware, DTOs\n│   └── tests/           Integration + architecture tests\n│\n├── harmony-app/         Web + desktop app (React 19 + Vite)\n│   ├── src/\n│   │   ├── features/    Feature-first modules (auth, chat, dms, crypto, ...)\n│   │   ├── components/  Shared UI + layout shell\n│   │   └── lib/         Generated API client, utilities\n│   ├── src-tauri/       Tauri Rust runtime (E2EE, keychain)\n│   └── e2e/             Playwright end-to-end tests\n│\n└── supabase/            Config + PostgreSQL migrations\n```\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Frontend | React 19, Vite, TypeScript, Tailwind CSS, HeroUI |\n| Desktop | Tauri 2 + vodozemac (E2EE) + SQLCipher |\n| State | TanStack Query (server), Zustand (client) |\n| Backend | Rust, Axum, SQLx |\n| Database | PostgreSQL (via Supabase) |\n| Real-time | Rust SSE (Server-Sent Events) |\n| API contract | Code-first OpenAPI (Rust types → TypeScript client) |\n| Testing | Playwright (E2E), Vitest (unit), cargo test |\n| CI | GitHub Actions |\n\n---\n\n## Roadmap\n\n| Phase | Goal | Status |\n|-------|------|--------|\n| **0** | Sign up, create server, send message | Done |\n| **1** | Live chat, invites, presence | Done |\n| **2** | Roles, permissions, direct messages | Done |\n| **3** | E2EE DMs (desktop), opt-in channel encryption | In Progress |\n| **4** | Voice/video (LiveKit), file uploads | Planned |\n| **5** | Server discovery, push notifications | Planned |\n| **6** | Mobile app, web E2EE (WASM), bot API | Planned |\n\n---\n\n## Self-Hosting\n\nRun the full Harmony stack on your own infrastructure — no Supabase Cloud account required.\n\n```bash\ngit clone https://github.com/zcharef/harmony.git \u0026\u0026 cd harmony\ncp .env.example .env   # fill in the 5 required values (see docs)\ndocker compose up -d --build\n# Web app: http://your-server:8080\n# Supabase Studio: http://your-server:3001\n```\n\nFor full instructions — env vars, key generation, TLS, upgrading, troubleshooting — see **[docs/self-hosting.md](docs/self-hosting.md)**.\n\n---\n\n## Contributing\n\nContributions welcome! See [`CONTRIBUTING.md`](CONTRIBUTING.md) for setup and guidelines.\n\nBefore submitting a PR:\n1. Run `just wall` in the project you changed\n2. Follow [conventional commits](https://www.conventionalcommits.org/)\n3. One concern per PR\n\n## Security\n\nFound a vulnerability? See [`SECURITY.md`](SECURITY.md).\n\n## License\n\n[AGPL-3.0](LICENSE) — use, modify, and self-host freely. If you run a modified version as a network service, you must release your source code.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzcharef%2Fharmony","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzcharef%2Fharmony","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzcharef%2Fharmony/lists"}