Docs / Desktop client
Developer docs
ForkMesh Qt Client
The ForkMesh desktop client is a Qt 6 workspace application for preserving repositories and communicating with peers. Repository serving and catalog publication belong to the managed mirror service.
Features
- Generates a local Ed25519 ForkMesh identity
- Stores a profile name and, when enabled, only a public Solana payout address
- Keeps wallet signing keys and repository decryption identities on the owner’s device
- Seals private mirrors into opaque, recipient-encrypted replicas with local key rotation and revocation
- Configures selected repositories for the managed direct-HTTPS mirror service
- Creates per-repository chat channels
- Uses encrypted WebSocket rooms for chat, presence, and small update signals—not repository bytes
- Supports messages, files, reactions, avatars, typing state, and history sync
- Opens the multiplayer ForkMesh world in the default browser from the main navigation
Non-custodial: ForkMesh does not hold or control user funds and never stores a community member’s payout-wallet private key or recovery phrase. The first instance operator may separately keep the existing community-pool key in an encrypted local Qt signer. User-owned funds, the public community-funded reward pool, pending allocations, and completed on-chain transfers are separate states. Community rewards are optional incentives and are never guaranteed.
Build
On Debian/Ubuntu:
sudo apt install build-essential cmake git qt6-base-dev libssl-dev \
libxkbcommon-dev libxkbcommon-x11-dev openssl
cd desktop
./run.sh
On macOS with Homebrew:
brew install cmake qt openssl@3
cd desktop
./run.sh
Tests
cd desktop
./run.sh test
The smoke test covers Ed25519 identity generation/signing and room crypto.
Cloudflare setup stays local
Open Control Node in the installed ForkMesh Qt client,
then use its Cloudflare deployment form. Enter a narrowly scoped
Cloudflare API token in that local desktop form. The optional World
instance booth can hold a masked token only in the current browser
tab long enough to copy it into the desktop field; it never submits,
proxies, persists, screenshots, or includes that value in the
forkmesh://control/cloudflare setup link. The link carries
bounded public topology only and rejects token-, password-, key-, and
credential-shaped parameters.
Review the dry-run output before deployment and clear or rotate the token after use according to your Cloudflare policy. Repository decryption keys, wallet private keys, and recovery phrases do not belong in the Cloudflare form.
Relay Mode
Start the worker locally:
cd ../app
uvx --from workers-py pywrangler dev
The client starts without setup input and connects to the ForkMesh mainnode:
wss://app.forkmesh.com/api/repo/mainnode/forkmesh/rooms/general/ws
For local relay testing, use this server URL instead:
ws://127.0.0.1:8787/api/repo/mainnode/forkmesh/rooms/general/ws
Default rooms fetch a relay-derived shared passphrase after account or signed-node authentication. The client applies PBKDF2-HMAC-SHA256 for 210,000 rounds with the first 16 bytes of SHA-256("ForkMesh room:" + room name) as salt, producing an AES-256-GCM key. The relay controls the default passphrase and can decrypt these rooms; an explicit out-of-band participant passphrase is required for confidentiality from the relay. Persisted history is capped at 500 frames per room for 7 days.
Repository Mirroring
Click + Add, choose a local Git repository or enter a
remote clone URL, and ForkMesh will run:
git clone --mirror <local-path-or-url> <app-data>/mirrors/<owner>-<repo>.git
Later syncs run:
git -C <mirror> fetch --prune
Each mirror also gets a repository chat channel so nodes can discuss project health, releases, and mirror status.
If network mirroring is enabled, the desktop commits local mirror intent and refreshes the local Git copy. The managed Go mirror daemon, not the desktop process, signs and publishes bounded catalog metadata and owns the authenticated direct-HTTPS endpoint. Local source paths, repository plaintext, and recipient private keys are never catalog fields.
Network Details
- Relay WebSocket path:
/api/repo/{owner}/{repo}/rooms/{room}/ws - Repository catalog path:
/api/repositories - Compatibility WebSocket path:
/api/room/{room}/ws - The client encrypts room traffic before sending it to the mainnode.
- File browsing/clone are served on demand from a managed mirror host, with nothing stored on the relay. The website caches browsed data in localStorage; the desktop client can keep temporary preview mirrors in the Settings-configured preview cache before you mirror or fork. Keeps relay lean / free-plan-hostable.