Chaft is early-stage, open-source team chat for small teams. It keeps workspace history on participating devices, encrypts message and attachment content before replication, and syncs signed history directly between trusted peers.
Participating devices provide most storage, compute, and replication, reducing recurring infrastructure costs while making the model's tradeoffs explicit.
Warning
Chaft is canary-stage software. Published canary packages are deliberately unsigned and must not be used for sensitive or production communication. See the download page and Security Policy.
Chaft is in canary development:
- The Rust runtime, CLI, replica node, Qt/QML desktop application, and static website are implemented in this repository.
- CI builds and exercises desktop packages on Windows x86-64, macOS Intel, macOS Apple Silicon, and Linux x86-64.
- Those CI packages are development artifacts, not public releases.
- A dedicated publisher can create one immutable, versioned GitHub prerelease with packages for all four targets. The website advertises it only after a separate reviewed manifest change.
- Canary receipts explicitly record that signing and notarization were not performed. Stable releases retain their stronger signing and notarization gates.
- The public website is deployed with Cloudflare Workers Static Assets.
https://chaft.aiis the canonical hostname; deployment automation and provenance remain subject to the reviewed infrastructure gates. - Peer connectivity uses explicit endpoints today. Production public relay, global discovery, guaranteed delivery, and an availability SLA are not provided.
- Security-sensitive behavior is tested, but production key custody, signing, notarization, updates, and operational review are not complete.
Useful starting points:
- Chaft website
- Public guides
- Security Policy
- Contributing
- Website development and deployment foundation
- GitHub Releases
Chaft's goal is to keep essential collaboration free for small teams without making a required central application service the authority for their workspace. That goal is bounded by the current design:
- each device supplies its own local compute and storage;
- peers supply most synchronization bandwidth and must be reachable to exchange new history;
- optional encrypted replicas can improve availability but are not an uptime guarantee or a plaintext authority;
- public relay, automatic internet-wide discovery, managed retention, and production support are not included today; and
- canary builds are for evaluation with non-sensitive data, not production operations.
“Free” here describes the product goal and the AGPL-licensed software, not a claim that hosting, signing, relay capacity, or every future optional service has zero cost. Any hosted service added later must publish its limits without making the local-first core dependent on it.
Use a package only when the download page marks the exact canary version and platform as available. Otherwise, build the desktop application from source on a supported Windows, macOS, or Linux host.
- Follow Build the desktop app.
- Use a fresh profile and non-sensitive test data.
- Exercise workspace creation, invitations, and synchronization between at least two isolated devices.
- Open an issue with the operating system, source revision, reproduction steps, and sanitized logs. Never include keys, passphrases, recovery material, or private messages.
Contributors can start with CONTRIBUTING.md and the testing guide.
Chaft treats each device as an independent participant:
- Events are signed by persistent device identities.
- Writes are stored locally before replication.
- Materialized views are rebuilt from verified append-only history.
- Missing parents or authorization context remain visible as history gaps.
- Public-channel content uses a workspace key; private-channel content uses a channel-scoped key.
- OpenMLS group state can provide epoch-derived content keys, with manual key rings retained as a compatibility and recovery bridge.
- Peers and optional replica nodes are untrusted. Replicas receive encrypted, bounded event and blob data rather than plaintext authority.
- SQLite, FTS5, and content-addressed blob storage keep the local app usable without a continuously reachable service.
Direct TCP and native Iroh transports support local and explicit peer connections today. Public relay and discovery remain default-deny. No central application server is authoritative for workspace history; optional replicas may improve availability.
Read the architecture, security model, and networking guide for the current boundaries.
application/view-model/ Rust view-model projection for desktop surfaces
apps/chaft-cli/ Developer and recovery CLI
apps/chaft-node/ Headless encrypted replica node
apps/desktop-qt/ Qt 6 and QML desktop application
apps/website/ Fully static Astro website
bindings/ffi/ Rust-to-desktop FFI boundary
domain/ Event and domain contracts
network/ Transport, wire, sync, direct TCP, and Iroh crates
runtime/ Local application runtime and materialization
security/ Cryptography, identity, and OpenMLS integration
storage/ Event store, search, and media/blob storage
guides/public/ Canonical public documentation
tools/ CI, desktop, smoke, release, and validation tooling
The Rust workspace uses edition 2024 and requires Rust 1.97.1 or newer.
Install Rust 1.97.1 or newer, then run:
cargo check --workspace --all-targets --locked
cargo test --workspace --all-targets --lockedThe repository gate adds formatting and Clippy:
tools/ci/rust-gates.sh --lockedWhen dependencies are already cached, --offline is supported:
tools/ci/rust-gates.sh --offlineThe CLI is useful for inspecting the runtime without the desktop shell:
cargo run -p chaft-cli -- --data-dir ./scratch/cli device-id
cargo run -p chaft-cli -- --data-dir ./scratch/cli \
init-workspace --name "Chaft Local" --channel general
cargo run -p chaft-cli -- --data-dir ./scratch/cli list-workspacesRecovery export and import use a hidden terminal prompt by default. Encrypted
identity files support --identity-passphrase-prompt. Controlled automation
can use the documented standard-input or owner-only file modes; never place
passphrases directly in command arguments or environment variables. See the
CLI reference.
Official package and release-input development requires Chaft's verified, patched Qt 6.8.4 SDK for the exact native target, CMake 3.28+, Ninja, and Rust 1.97.1+.
Confirm the local toolchain:
tools/desktop/preflight.shTechnical macOS testers can instead run tools/macos/build-local.sh from a fixed
checkout on Intel or Apple Silicon. It uses supported Homebrew Qt, verifies the
native app, applies only a local ad-hoc signature, and installs ~/Applications/Chaft.app.
It is not Developer ID signed or notarized. Read
Build Chaft Desktop first.
Build and launch a fresh development profile:
tools/desktop/build.sh debug
tools/desktop/launch.sh debug --freshRerun without --fresh to preserve the local identity and workspace data:
tools/desktop/launch.sh debugRun multiple isolated local devices:
make dev-users N=3 FRESH=1Each named instance receives separate identity, key, event, search, blob,
settings, and log paths. Do not copy device.json when simulating independent
devices.
More detail is available in Build the desktop app and Workspace lifecycle.
Run the local encrypted replication smoke test after changing runtime, sync, network, replica, or CLI behavior:
tools/smoke/local-p2p.sh --lockedDesktop changes should run:
tools/desktop/preflight.sh
tools/desktop/qml-lint.sh
tools/desktop/build.sh debug
tools/desktop/smoke.sh debugThe full expectations and focused test commands are in the testing guide.
The website requires Node.js 22.13+ and the pnpm version pinned in apps/website/package.json.
corepack enable
make website-install
make website-devRun its complete validation gate with:
make website-validateA production build requires a complete HTTPS SITE_URL. Root-domain and
path-prefixed deployments are both supported:
SITE_URL=https://example.com make website-build
SITE_URL=https://example.com/chaft make website-buildThe production Worker is asset-only; workers.dev and generated preview URLs remain disabled.
Chaft Previews maps four exact preview/landing-hero-N branches to
hero-N.chaft.ai slots through credential-free builds and trusted deployment gates.
Production stays unchanged until selection; see the Preview cycle guide.
The desktop CI matrix builds:
- Windows x86-64 packages
- macOS Intel (x86-64) packages
- macOS Apple Silicon (arm64) packages
- Linux x86-64 AppImage packages
CI artifacts expire under GitHub Actions retention and are not a supported distribution channel.
Public downloads are versioned, immutable assets attached to GitHub Releases. A canary is a GitHub prerelease and never the repository's stable or latest release. It is not advertised by the website until its packages, checksums, SBOMs, provenance, native smoke receipts, release inventory, and corresponding-source evidence pass the canary promotion workflow and the resulting manifest change is reviewed.
See the release process for the canary and stable publication boundaries.
guides/public/ is the canonical source for user-facing and contributor-facing
guides. Those Markdown files remain readable on GitHub and are compiled into
the static website's /docs/ routes.
Public guide changes must:
- include the required front matter;
- contain exactly one level-one heading;
- use repository-relative Markdown links;
- distinguish implemented behavior from plans;
- avoid private operational references and secret-bearing examples.
Engineering notes outside guides/public/ may describe lower-level design, but
they are not part of the public navigation contract.
Treat every peer, replica, imported artifact, and signed event as untrusted until validation succeeds. Keep runtime identity files, recovery bundles, private keys, databases, and passphrase files out of Git.
Report vulnerabilities privately as described in SECURITY.md. Do not open a public issue for key exposure, plaintext leakage, signature or authorization bypass, unsafe parsing, or denial-of-service findings.
Read CONTRIBUTING.md before opening a pull request. Keep changes focused, add tests at the affected boundary, and report the exact validation commands run.
Pull requests should call out security, storage, wire-format, migration, release, and UI-thread implications where relevant.
Chaft is licensed under the GNU Affero General Public License v3.0 or later.