Documentation

Built from the Kenavo client.

This hub mirrors what ships today in NeoPerforce (engine + Desktop + agent) and Kenavo-unreal (UE 5.7 Revision Control plugin).

Getting started

Kenavo Desktop requires a Supabase Auth session before opening local workspaces. Official backend URL and publishable key are baked into the client. A clean clone builds on Windows, macOS, and Linux without local secrets. Never embed a service_role key.

# Dev

cd apps/kenavo-desktop
npm install
npm run tauri dev

# Windows release installer

cd apps/kenavo-desktop
npm run desktop:build
# → target/release/bundle/nsis  or  target/release/kenavo-desktop.exe
  1. Sign in (Supabase Auth). Display names live in profiles; per-repo nicknames in repository_aliases.
  2. Onboard Local / Remote, then initialize a workspace with the shared Unreal binary policy and a machine-local sync profile.
  3. Repository, stream, and workspace IDs are stable from local create, ready for later Connect publish without rewriting history.

Desktop app

Tauri 2 keeps filesystem access and scanning in Rust; React + a virtualized list keeps large workspaces responsive. Primary nav that ships today: Changes, Files, History, Checkouts, plus Team / Activity when shared. Streams is labeled Planned in the UI (IDs exist at init; full Streams UX is not shipped).

Files

Folder-by-folder explorer with file states; Show ignored / Hide ignored; Ignore locally. New files are untracked until Mark for Add.

Changes

Real scan via kenavo-workspace: search, filter, select. Checkboxes / context menu place files into persistent changelists.

Check Out / Checkouts

Check Out / Release checkout from Files or Changes: lock, writable, default changelist (including solo local). Checkouts view shows lease ownership.

Submit / History

Local submit: BLAKE3 blobs → .kenavo/objects, immutable revisions → .kenavo/revisions. History can restore a file or workspace without rewriting history. Shared: atomic remote push (segmented / deduped).

Access / Connect

Share project, email invites, members; join via kenavo:// or LAN + invite. Top bar: Get Latest, Access, Unreal connected / degraded / offline.

Import from Perforce

Desktop embeds migration beyond CLI analyze: detect connection, analyze, clone snapshot, dry-run / full history migrate with progress, reauth, cancel.

Activity & Unreal status

Merges editor ops, HTTP errors, project/instance, average latency. Heartbeats do not spam the log, only connect and state changes. Verify repository checks revisions, manifests, and blobs.

Unreal Editor plugin

Separate repo: Kenavo-unreal → plugin KenavoSourceControl for Unreal Engine 5.7 (Editor module, beta 0.1.0). It is a thin C++ adapter around native Revision Control. It never runs the Kenavo CLI, never scans/hashes the workspace, and never talks to Postgres or blob storage directly.

Install: copy the repo to Plugins/KenavoSourceControl, regenerate project files, build the Editor target. In the editor: Revision Control → Kenavo → Connect.

Agent discovery: reads .kenavo/agent.json (url + ephemeral token). Do not version that file. Override with bAutoDiscoverAgent=False + AgentUrl in Config/DefaultKenavoSourceControl.ini. Only http://127.0.0.1 URLs are accepted.

  • Operations via agent (off game thread): CheckOut, Mark For Add, Revert, Check In, Sync, Get Revision, Diff Against Depot, per-file history, native changelists (create / describe / delete / move).
  • Mark For Add assigns the new file to the selected changelist (or default) before refreshing editor state.
  • Batch UpdateStatus via POST /v1/status; stale status replies rejected by generation; state cache behind FRWLock.
  • Content Browser overlays from Kenavo states: controlled, modified, ignored, lock owned by you → CheckedOut, lock by other → CheckedOutByOtherUser, stale → NotAtHeadRevision.
  • Moving a .umap also moves open OFPA paths under __ExternalActors__/<map>/ and __ExternalObjects__/<map>/.
  • Connect heartbeat GET /v1/session every 10s; Desktop marks Unreal offline after 30s without a request. Headers include protocol version, request id, UnrealEditor client, instance, project, plugin semver, operation. Default HTTP timeout: 2s.
  • Revision blobs stream to .kenavo-part-* then atomic rename into Saved/Diff. Workspace files stay untouched.

Validate with RunUAT BuildPlugin on UE 5.7; Automation Tests filter Kenavo.SourceControl. Asset path examples on this site use Allar names (e.g. Content/Maps/Harbor_P.umap).

kenavo-agent

Local authenticated API used by editor integrations. Default listen: 127.0.0.1:4877. Writes private discovery file .kenavo/agent.json (URL + session token).

cargo run -p kenavo-agent -- --workspace-root "E:\Projects\MyGame"
cargo run -p kenavo-agent -- --workspace-root "E:\Projects\MyGame" --port 0

First protocol surface:

  • GET /v1/health
  • GET /v1/session
  • POST /v1/status
  • POST /v1/locks/acquire
  • POST /v1/locks/release
  • POST /v1/revert
  • POST /v1/submit
  • POST /v1/sync
  • POST /v1/history
  • POST /v1/revision/file
  • POST /v1/changelists/list|create|edit|delete|move|unmark

POST /v1/revision/file streams the raw historical blob without mutating the workspace (Get Revision / Diff Against Depot in Unreal).

Checkout & changelists

Locks are granted by the authority (local repo or shared host), never inferred from disk alone. Binary submit still requires a valid lock at commit time.

Changelists are atomic: add / modify / move / delete + description. A submitted revision is immutable; the stream head always points at a complete valid revision.

Identical contents share one BLAKE3 blob. Logical assets keep a stable identity across renames. Locks attach to that identity, not only the path string.

Shared Connect workspaces use atomic remote push with segmented, deduplicated transfer. Unshared repos keep creating local revisions under .kenavo/.

Storage model

  • Blob: immutable content addressed by BLAKE3 (.kenavo/objects).
  • Revision: immutable snapshot; monotone id in the repo + stable content id.
  • Stream: model IDs at workspace init (mainline / development / release policies). Full Streams UI is Planned, not shipped.
  • Workspace: user + machine + folder + stream + base revision; local manifest + optional .kenavo/remote.json.
  • Metadata: PostgreSQL via kenavo-db for shared deployments; local mode keeps revisions on disk under .kenavo/.

Ignore & Unreal binaries

Ignore load order: internal rules → optional Unreal preset → .kenavoignore.kenavo/info/exclude. Tracked files are never hidden by ignore. ignore explain shows every matching rule and the stable hash used by future reconcile plans.

Unreal Binaries/ ≠ lockable .uasset/.umap assets. Two separate settings:

Repo policy (Binaries produced by Unreal)

  • Ignore: local builds only
  • Plugins: keep Plugins/**/Binaries/
  • Track all: including Installed Builds

This machine’s sync profile

  • No binaries
  • Plugins
  • Full

unreal plugins resolve reads .uproject, versioned kenavo.unreal.json, then .kenavo/unreal.json: effective config without silently rewriting the Unreal descriptor.

CLI

cargo test --workspace
cargo run -p kenavo-cli -- path normalize Content\Maps\Harbor_P.umap
cargo run -p kenavo-cli -- hash .\README.md
cargo run -p kenavo-cli -- ignore check Saved\Autosaves\Harbor_P.umap --unreal
cargo run -p kenavo-cli -- ignore explain Content\Maps\Harbor_P.umap --unreal
cargo run -p kenavo-cli -- ignore explain Plugins\Vendor\Binaries\Win64\Plugin.dll --unreal --unreal-binaries plugins
cargo run -p kenavo-cli -- unreal plugins resolve --project .\Game.uproject
cargo run -p kenavo-cli -- workspace init --root . --unreal --unreal-binaries plugins --binary-sync plugins
cargo run -p kenavo-cli -- status --root .

Backup & restore

A backup is only trusted after verifying its descriptor, immutable history, and every referenced blob.

cargo run -p kenavo-cli -- workspace backup --root E:\Projects\MyGame --destination F:\KenavoBackups
cargo run -p kenavo-cli -- workspace verify-backup F:\KenavoBackups\MyGame-kenavo-backup-<timestamp>
cargo run -p kenavo-cli -- workspace restore-backup … E:\Projects\MyGame-Restored
cargo run -p kenavo-cli -- workspace exercise-backup … --scratch E:\KenavoRestoreDrills

Restore refuses an existing destination; it materializes into a neighbor temp folder then publishes via atomic rename. exercise-backup restores for real, re-verifies, then deletes only the drill workspace. When Desktop is hosting a shared repo, backup briefly pauses uploads / revision publish / lock mutations while reads stay available.

Kenavo Connect

When a repository is shared via Connect, the host publishes a private ticket + heartbeat in account_repositories. The owner manages email invites and members from Access. Ports, tickets, and network codes stay internal.

  • Accepted members see the repo and live/offline state on their machines.
  • Removing a member rotates Connect capability: their old ticket dies immediately; remaining members get the new one automatically.
  • Workspaces joined via kenavo:// invitation use atomic remote push with segmented deduped transfer.

Next steps

Install the desktop client, then wire the Unreal plugin through kenavo-agent on your project root.