Cheri is a CLI-first collaborative workspace sync tool. It focuses on shared workspaces, file transfer, team invites, activity history, and task-based local sync automation. The backend uses Cloudflare Workers for the API layer, KV for lightweight registry/state, and R2 for blob storage.
Cheri gives a small team a command-line workflow for:
- creating an account and workspace
- joining additional workspaces by invite code
- uploading, listing, and downloading workspace files
- reviewing recent activity
- creating local sync tasks that can watch files or folders and upload changes automatically
It is designed around a CLI client talking to a Worker API backend. The old dashboard/browser-first product path is not part of this repository.
Cheri is usable as a CLI-first project, but it is not fully feature-complete.
Ready now:
- register / login / logout
- workspace create / list / use / join
- file upload / download / list
- team invite / list / invite-reset
- activity feed
- task create / list / start / stop / run / logs / watch
- System provider support
- Worker + KV + R2 backend architecture
Still limited:
System (recommended)is the only public provider that is production-ready in this build- S3-compatible, Google Drive, and Backblaze B2 are scaffolded but not public-ready
- task automation is upload-only today
- conflict handling and bidirectional sync are not implemented
- if
cheriis not found after install, your Python scripts directory may need to be onPATH
cheri register,cheri login,cheri logoutcheri workspace create,list,use,joincheri file upload,download,listcheri teams invite,list,invite-resetcheri activitycheri task create,find,list,start,stop,remove,run,logs,watch- workspace-scoped file metadata and short-lived transfer grants
- short invite codes such as
CHR-TEAM-8X2K91QZ - background task auto-start on creation
- friendly task target lookup for current directory, Desktop, Documents, and Downloads
Cheri has three main pieces:
-
CLI client
- Python package in
cheri_cloud_cli/ - handles command parsing, auth prompts, local state, task automation, and file transfer orchestration
- Python package in
-
Worker API backend
- source in
worker/ - handles auth, workspace membership, invites, activity, file metadata, provider validation, and transfer grants
- source in
-
Cloudflare storage foundation
- KV stores lightweight metadata such as users, sessions, memberships, invites, activity, task registry state, and provider config references
- R2 stores file/blob content
The current main provider is System (recommended), which uses Worker-managed R2-backed storage and resets files daily.
The supported install path today is Python-based.
- Python 3.9+
pip- Node.js 18+ if you want to run the Worker test suite
- Wrangler if you want to deploy the backend yourself
git clone <your-github-url> cheri-app
cd cheri-app
python -m pip install .
cheri --helpWindows alternative:
py -3 -m pip install .
cheri --helpIf cheri is still not found after install:
- open a new shell
- or ensure your Python scripts directory is on
PATH - on Windows, that is typically under
%APPDATA%\Python\PythonXY\Scriptsor the active interpreter's scripts path
After install, cheri should work from any directory:
cheri --help
cheri config get
cheri workspace listYour current working directory only matters when you pass local file or folder paths. Task target resolution is more forgiving than raw file commands: a simple name such as cheri_test_files is checked against the current directory, Desktop, Documents, and Downloads.
Cheri resolves its backend URL in this order:
CHERI_API_URLCHERI_WORKER_URL- saved local CLI config
- embedded public defaults and optional repo deployment metadata
This published repo defaults to:
https://cheri.parapanteri.com
Useful commands:
cheri config get
cheri config set api-url https://cheri.parapanteri.com
cheri config reset
cheri config checkEnvironment example:
export CHERI_API_URL=https://cheri.parapanteri.comWindows:
$env:CHERI_API_URL = "https://cheri.parapanteri.com"If you want to self-host the backend:
- create your own Cloudflare KV namespace
- create your own R2 bucket
- update
wrangler.toml- set the KV namespace id
- set the bucket name
- update the route pattern if you use your own domain
- deploy with Wrangler
wrangler deployThe Worker expects these bindings:
HERMES_KVHERMES_BUCKET
If you deploy your own backend, point the CLI to it with either:
CHERI_API_URL- or
cheri config set api-url <url>
cheri config get
cheri config check
cheri register
cheri workspace list
cheri file upload ./notes.md
cheri file list
cheri file download notes.md --dest ./downloadsRecommended first run:
- run
cheri register - choose
System (recommended) - acknowledge the daily reset warning
- choose whether to save local session state
- keep the bootstrap secret safe
- upload a file to verify the workspace
This is the simplest two-user collaboration check.
- Install Cheri.
- Verify backend config with
cheri config get. - Register:
cheri register- Create or switch to the workspace you want to share:
cheri workspace create --name docs
cheri workspace use docs- Create an invite code:
cheri teams invite- Install Cheri.
- Verify backend config with
cheri config get. - Register or log in.
- Join with the invite code:
cheri workspace join CHR-TEAM-8X2K91QZ- Confirm access:
cheri workspace list
cheri teams listUser A:
cheri file upload ./shared.txtUser B:
cheri file list
cheri file download shared.txt --dest ./downloads
cheri activityCheri tasks are local automation definitions tied to a workspace.
Examples:
cheri task create --directory cheri_test_files --mode on-change
cheri task create --directory "C:\Users\Name\Desktop\cheri_test_files" --mode on-change
cheri task create --file notes.md --mode interval --every 10m
cheri task find cheri_test_files
cheri task list
cheri task stop <task-id>
cheri task start <task-id>
cheri task run <task-id>
cheri task logs <task-id>Current task behavior:
cheri task createauto-starts background watching by default- use
--no-startif you only want to save the task definition - simple names are resolved from:
- current directory
- Desktop
- Documents
- Downloads
cheri task stopstops background watching without deleting the taskcheri task startstarts it again- foreground
cheri task watchis still available for explicit watch-loop runs
Current limitations:
- upload-only only
- no pull-only mode
- no bidirectional sync
- no remote delete reconciliation
- no conflict resolution yet
cheri register
cheri login
cheri logout
cheri config get
cheri config set api-url <url>
cheri config reset
cheri config check
cheri workspace create --name <name>
cheri workspace list
cheri workspace use <id-or-name>
cheri workspace join <invite-code>
cheri file upload <path>
cheri file download <file-or-id>
cheri file list
cheri teams invite
cheri teams list
cheri teams invite-reset
cheri activity
cheri task create
cheri task find <name>
cheri task list
cheri task start <task-id>
cheri task stop <task-id>
cheri task remove <task-id>
cheri task run <task-id>
cheri task logs <task-id>
cheri task watch --all
cheri help- only
System (recommended)is public-ready - current default backend is public, but live deployment must stay in sync with the CLI contract
- task automation is local-first and upload-only
- local secret storage is separated but not encrypted at rest
- the npm launcher is present for future packaging, but Python remains the supported install path today
Repo structure:
cheri_cloud_cli/— Python CLI implementationworker/— Cloudflare Worker APIdocs/— product and setup documentationguide/— static guide UItests/— Python and Worker testsscripts/— helper scripts
Test commands:
node tests/node/worker.test.mjs
python -m unittest discover -s tests/python -p "test_*.py"Combined npm entry:
npm testDeploy command:
wrangler deployCheri stores local state in a user-level config directory, not in the repo by default.
Sensitive files:
credentials.json- any local override
.env - any task watcher logs if they contain operational details
Do not commit:
- bootstrap secrets
- session tokens
- provider credentials
- local config overrides
.wrangler/local state- generated task/runtime files
Bootstrap secret basics:
- it is only for the user's own register/login flow
- it is not an invite code
- keep it outside screenshots, logs, and commits
This export does not include a license file. Choose and add an explicit license before wider publication.