Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
Self-hosted team chat — channels, threads, huddles, search inside files, SSO and a Slack importer. Rust + React, one docker compose command.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗
A self-hosted team chat platform — channels, threads, DMs, reactions, files, and real-time presence — built with Rust and React. Run it on your own box, behind your own domain, with no per-seat pricing and no third party holding your messages. petar-basic.github.io/chat-systems shows what it looks like.
Think of it as a small, self-hostable Slack alternative for a team that wants to
own its data. One instance serves multiple workspaces; users are invite-only; and
the whole thing runs from a single docker compose command behind automatic HTTPS.
It's also a deliberately well-engineered reference codebase: a stateless Rust API, a horizontally-scalable WebSocket gateway, and a strictly-typed React SPA, with an integration-test suite and a real CI pipeline.
Messaging
@person, @group, @channel / @here / @everyone, and custom emojiNotifications
Finding things
Structured work
Calls
Integrations
Admin and compliance
Running it
docker compose command, automatic HTTPS, several workspaces per instanceMost of the daily surface is here, from threads, huddles and Later to notification levels, keywords, search inside files, polls, lists and workflows (see Features). The Slack importer brings people, channels and messages, threads included.
What a team moving from Slack should expect to be missing or different:
| Missing / different | Where it stands |
|---|---|
| No native mobile app. The web app is responsive and installs as a PWA with push, but there is nothing in an app store. | Deliberate — see ROADMAP.md; React Native only if push reliability or call ringing proves to be the blocker |
| Large huddles need LiveKit. Without it a huddle is a peer-to-peer mesh capped at eight people. No recording. | LiveKit is an optional compose file (see the RUNBOOK); recording deliberately out of scope |
| Search reads text, not pictures. Messages, file names and the text inside PDF, Word, Excel, PowerPoint and text files are searched; a scanned page or a screenshot is not (no OCR). | Deliberate — OCR needs a model beside the stack |
| No shared channels across organisations. | Not planned |
The trade for all of that: every message, file and audit row stays on hardware you control,
and the whole thing is one docker compose command. See
docs/RUNBOOK.md for what running it
actually costs in machine and in time.
Three Rust binaries plus a React SPA. The API is stateless and the realtime gateway
fans messages out across nodes via Redis, so both scale horizontally. Background consumers
live in their own process rather than inside each API replica — otherwise a second API
replica would send every webhook and every notification twice. Durable events reach that
process through Redis Streams consumer groups, each event to exactly one replica, so
chat-worker scales too.
| Component | Technology |
|---|---|
| chat-api | Rust (Axum) — stateless REST API |
| chat-worker | Rust — background consumers (webhooks, reminders, notifications, scheduled messages, email, event outbox relay) |
| chat-realtime | Rust (Axum) — WebSocket gateway |
| Frontend | React 19, Vite, React Router, TailwindCSS, Zustand, TanStack Query |
| Edge (prod) | Caddy — automatic HTTPS + reverse proxy |
| Database | PostgreSQL 16 |
| Bus | Redis 7 — streams with consumer groups, live pub/sub, presence, rate limits |
| Storage | Local disk, or S3 (RustFS bundled) |
HTTP request → chat-api → PostgreSQL write + outbox row → Redis stream + publish
→ chat-realtime → WebSocket push (clients replay the stream on reconnect)
→ chat-worker consumer groups → notifications, webhooks, history
cp .env.example .env # then set JWT_SIGNING_KEYS, JWT_PUBLIC_KEYS, SECRETS_KEYS, POSTGRES_PASSWORD
docker compose --profile frontend up -d --build
docker compose logs api | grep "setup token"
Open http://localhost:8080, paste the setup token, and create the first admin and
workspace. For demo users and channels, set ADMIN_PASSWORD in .env before the first start
instead and run ADMIN_PASSWORD=... ./seed.sh.
To run a published release instead of compiling, add to .env, with VERSION set to the
number of the latest release:
BACKEND_IMAGE=ghcr.io/petar-basic/chat-systems-backend
FRONTEND_IMAGE=ghcr.io/petar-basic/chat-systems-frontend
VERSION=X.Y.Z
then docker compose --profile frontend pull and up -d without --build. What each
release changed is in CHANGELOG.md.
Full setup — local development, production deployment with HTTPS and backups, and the contribution workflow — lives in docs/CONTRIBUTING.md.
The web app is an installable PWA — no separate desktop build, no installers, no unsigned-binary warnings, and it updates the moment you deploy:
Honest about the edges, since this is a reference codebase:
The full prioritized list lives in docs/ROADMAP.md.
MIT © 2026 Petar Basic
If you find this project useful and are feeling generous, consider donating to Svratište — a day center in Belgrade providing support, meals, and shelter for people experiencing homelessness.