Real-time messaging, meetings and calls for Kubuno - the self-hosted, libre (AGPLv3) cloud platform, a sovereign alternative to Google Workspace and Microsoft 365.
Direct messages and group spaces, a rich composer, audio/video calls and full-featured meeting rooms - kept running as a floating overlay while you browse the rest of the platform.
A group conversation, with the space and direct-message list
- Direct messages & spaces - a sidebar organized into Shortcuts, Direct messages and Spaces, a central Home view, dedicated Mentions and Starred views, and a browse page to discover and join public spaces. Every view and conversation has a real, shareable URL.
- Rich composer - an expression panel with the full Unicode emoji catalogue (localized keyword search, recently-used row), GIF search through a server-side proxy (the API key is an admin-only instance setting, never exposed to the browser), and a personal sticker pack. Messages support replies, reactions, polls, attachments and link previews.
- Sticker Studio - turn any picture into a transparent square sticker; the pack lives on the device (IndexedDB).
- Camera capture - take a photo or record a clip straight from the composer.
- Presence & status - Active / Away / Do not disturb plus a free-text status, picked from the platform top bar and broadcast live over WebSocket; a manually chosen status survives reconnects.
- Conversation management - pin, archive, mute, favorite, mark as unread, clear or delete from a single action menu, plus a per-conversation shared-files panel and multi-device live sync (a message you send appears at once on your other tabs and devices).
- Pop-up conversations - small floating chat windows docked to a corner of the screen that keep running while you browse other Kubuno modules.
- Audio & video calls - a global call overlay that follows you across modules, with a lobby to preview and pick devices, screen sharing alongside your camera, and an upgrade from audio to video without hanging up. STUN/TURN servers are an instance setting, so a self-hosted deployment chooses its own; with nothing configured, calls connect between hosts that can reach each other directly.
- Meeting rooms - a full-width Meetings page with a navigable week strip, upcoming/past grouping, multi-select to act on several meetings at once (including deletion), and a details panel (members, plain transcript) you can read without joining. Meetings offer a lobby, a dark meeting stage with animated tile layout, an active-speaker highlight, presentation controls, host moderation (mute/remove, and ending the meeting for everyone as distinct from leaving it), a meeting chat that is the conversation itself, an admit-based access mode (open, or open to trusted people with a join queue), configurable host rules (who may share, react or write in chat), in-meeting activities other modules can register, and optional recording filed to the recorder's Drive.
- Calendar meetings - a calendar event can carry a Kubuno video call created in place; the event and its meeting keep one shared title, and a room attached to an event you never save is cleaned up automatically.
- Push notifications - new messages and incoming calls ring registered devices via the core (UnifiedPush); notifications carry who, never what, and respect mute / Do-not-disturb and per-module preferences.
- Cross-module data cards - content copied from another Kubuno module (a map location, a drawing…) pastes as a rich card rendered by the producer module, with a graceful generic fallback. Chat also contributes "Chat" and "Start a meeting" actions to a person's card wherever the platform shows one.
Chat is a Kubuno module: a standalone Rust process (port 3109) that registers with the core at startup. The core proxies its routes (/api/v1/chat/*) and serves its runtime-loaded frontend bundle.
core (kubuno/core) ──proxy──► kubuno-chat (this repo, :3109)
│ ├─ Rust backend (Axum + kubuno-db, schema `chat`)
└─ serves /modules/chat/entry.js (React frontend, loaded at runtime)
- Server -
server/: Axum on the sharedkubuno-dblayer, running on PostgreSQL, MySQL/MariaDB or SQLite (the engine is an administrator choice read at run time - one binary, no rebuild), in a dedicatedchatschema; migrations inserver/migrations/. Calls exchange media directly between browsers (WebRTC). - Web -
web/: a React bundle built toentry.js, consuming@kubuno/sdk,@kubuno/uiand@kubuno/drivefrom npm (provided by the host at runtime via the import map). - Mobile -
mobile/: the mobile apps (seemobile/README.md).
Modules install as a Kubuno package (.kbpkg) - a single, self-contained archive the Kubuno server unpacks itself (in pure Rust, identically on Linux, Windows and macOS). There are no native system packages for a module; only the core ships those.
The easiest way to self-host a full Kubuno instance (core + every module) is the all-in-one Docker image (ghcr.io/kubuno/kubuno), which already bundles Chat.
To build and install this module on its own:
bash build_kbpkg.sh --install # build → install into the store → restart the coreOr install a prebuilt .kbpkg (offline, no catalogue required):
sudo kubuno modules:install dist/chat-<version>-<os>-<arch>.kbpkg
sudo systemctl restart kubuno # the core loads the module on (re)startA .kbpkg is attached to every tagged GitHub Release (Linux via build.yml, Windows/macOS via dist.yml).
Requirements: Rust ≥ 1.82, Node.js ≥ 24, and a database: PostgreSQL 16, MySQL/MariaDB or SQLite.
cd server && cargo build --release # → server/target/release/kubuno-chat
cd web && npm ci && npm run build # → web/dist/{entry.js, entry.css}
bash build_kbpkg.sh # → dist/chat-<version>-<os>-<arch>.kbpkgShared dependencies come from Kubuno - no
kubuno/corecheckout required:
- Rust - shared crates via tagged git dependencies on
kubuno/core.- Frontend -
@kubuno/sdk,@kubuno/ui,@kubuno/drivefrom the@kubunonpm scope. They areexternalat runtime (the host provides the singletons via its import map); the npm packages supply the build-time type surface.
The native Windows client, Kubuno Chat for Windows (kubuno-chat.exe), lives in
desktop/windows/ - a Cargo workspace of its own, built on the Kubuno desktop framework
(kubuno/desktop, by git tag, linked statically). desktop/linux and desktop/macos are reserved for the other
desktop platforms. In Visual Studio, Kubuno.Chat.slnx lists it under Desktop.
cd desktop\windows; cargo build --release # → target\release\kubuno-chat.exe (run with --sample for offline data)Rust 2021 · Axum 0.7 · Tokio · kubuno-db over SQLx (PostgreSQL, MySQL/MariaDB or SQLite, schema chat) · WebSocket · WebRTC - React 19 · TypeScript · Vite · Tailwind CSS v4 · Zustand · React Query.
Issues and pull requests are welcome. For any significant change, please open an issue first.
AGPL-3.0-or-later © Kubuno contributors.
