Files
Folder-by-folder explorer with file states; Show ignored / Hide ignored; Ignore locally. New files are untracked until Mark for Add.
This hub mirrors what ships today in NeoPerforce (engine + Desktop + agent) and Kenavo-unreal (UE 5.7 Revision Control plugin).
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
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).
Folder-by-folder explorer with file states; Show ignored / Hide ignored; Ignore locally. New files are untracked until Mark for Add.
Real scan via kenavo-workspace: search, filter, select. Checkboxes / context menu place files into persistent changelists.
Check Out / Release checkout from Files or Changes: lock, writable, default changelist (including solo local). Checkouts view shows lease ownership.
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).
Share project, email invites, members; join via kenavo:// or LAN + invite. Top bar: Get Latest, Access, Unreal connected / degraded / offline.
Desktop embeds migration beyond CLI analyze: detect connection, analyze, clone snapshot, dry-run / full history migrate with progress, reauth, cancel.
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.
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.
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).
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:
POST /v1/revision/file streams the raw historical blob without mutating the workspace (Get Revision / Diff Against Depot in Unreal).
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/.
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:
unreal plugins resolve reads .uproject, versioned kenavo.unreal.json, then .kenavo/unreal.json: effective config without silently rewriting the Unreal descriptor.
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 .
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.
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.
Install the desktop client, then wire the Unreal plugin through kenavo-agent on your project root.