π Wyrm Cloud β
Encrypted multi-device sync for the Wyrm MCP server. Free for solo, $0/month forever.
Live at wyrm.ghosts.lk.
Two editions β don't confuse them (constitution Article IX):
- Wyrm Sync β this page. Zero-knowledge, end-to-end encrypted multi-device sync. Your master key never leaves your device; the server stores opaque ciphertext and cannot read your memory.
- Wyrm Cloud (managed memory) β a separate, opt-in, entitlement-gated tier at mcp.wyrm.ghosts.lk for Claude web/phone connectors (remote MCP). Those clients have no local machine or key, so this store is server-readable by design (not E2E) and disclosed as such. It is never created from your Sync/Local data automatically.
What it does β
You install wyrm-mcp on your phone, laptop, workstation. Each one has its own local Wyrm database. Without Wyrm Cloud, those databases drift β a quest you closed on your laptop doesn't appear on your phone.
With Wyrm Cloud:
- You sign in once per device with Google or GitHub
- Mark rows as cross-project visible (
cross_project_visibility = 'org'or'public') - Run
wyrm cloud syncβ those rows are encrypted client-side, pushed to the cloud, then pulled to your other devices - The cloud stores opaque ciphertext only β your encryption key never leaves your devices
What's encrypted β
| Row type | Synced |
|---|---|
| Ground truths | β |
| Memory artifacts | β |
| Quests | β |
| Design tokens | β |
| Design references | β |
| Sessions, hour entries, failure patterns | β (device-local time-series) |
Only rows where you explicitly set cross_project_visibility = 'org' or 'public' are pushed. Default is 'within' β local-only.
Quick start β
# install the latest stable
npm install -g wyrm-mcp@latest
# sign in (browser flow with Google or GitHub)
wyrm cloud login
# see what's there
wyrm cloud status
# push + pull
wyrm cloud syncThe login flow:
- CLI prints
https://wyrm.ghosts.lk/cliand a short code likeABCD-1234 - You open the URL on your phone, type the code, sign in
- CLI polls; completes in seconds
Encryption details β
- Algorithm: AES-256-GCM (Cloudflare server cannot decrypt)
- Key: 32 random bytes stored at
~/.wyrm/cloud.key(0600 perms) - Generated automatically on first
wyrm cloud login - Per-payload envelope:
[version:1][iv:12][ciphertext+tag:N+16] - Tamper detection: GCM auth tag rejects modified ciphertext
You're responsible for backing up ~/.wyrm/cloud.key. Losing it means losing access to your synced data β by design. This is the operator-owns-data guarantee in our constitution.
Architecture β
ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ
β Your machine β β Cloudflare edge β
β wyrm-mcp + wyrm CLI β β wyrm.ghosts.lk Worker β
β ~/.wyrm/wyrm.db (SQLite) β HTTPS+Bearer β β
β ~/.wyrm/cloud.key (0600) β βββββββββββΊ β Validates session β
β β β Stores ciphertext in R2 β
β Encrypts BEFORE sending β β Indexes deltas in D1 β
ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββThe cloud server has access to:
- Your email + the OAuth provider (Google or GitHub) you signed in with
- Counts of deltas, devices, storage usage
- Encrypted blob bytes (opaque to the server)
The cloud server does NOT have access to:
- Plaintext memory content
- Your encryption key (
~/.wyrm/cloud.key) - The actual
kind,row_id, orpayloaddata inside blobs (well βkindis cleartext for filtering, but the payload contents are encrypted)
Tiers β
| Tier | Price | Storage | Sync ops | Features |
|---|---|---|---|---|
| Free | $0 | 1 GiB | 100/day | Up to 50 devices, all features |
| Pro | $29/mo | 10 GiB | unlimited | Higher per-delta cap |
| Team | $199/mo | 100 GiB pooled | unlimited | Org tier β cross-account 'org' sync |
| Enterprise | $499/mo | unlimited | unlimited | SLA + SOC2 attestation |
Paid tiers wire when Stripe is configured server-side. Until then everyone is on Free which covers solo personal use forever.
Web dashboard β
wyrm.ghosts.lk/login β same Google/GitHub sign-in, then a web dashboard at /app showing:
- Account email + tier
- Storage usage
- Devices (revoke individual machines)
- Orgs you belong to
- Logout
CLI command reference β
wyrm cloud login # Google or GitHub OAuth
wyrm cloud logout # revoke session both ends
wyrm cloud status # account / tier / storage / devices
wyrm cloud devices # list registered devices
wyrm cloud devices revoke <id> # revoke a specific device
wyrm cloud sync [--dry-run] # push + pull encrypted deltasConfig locations:
~/.wyrm/cloud.jsonβ session token (HttpOnly-equivalent, 0600)~/.wyrm/cloud.keyβ AES-256-GCM master key (0600, NEVER shared)~/.wyrm/cloud-cursor.jsonβ last-pulled timestamp per device
Security guarantees β
- All HTTP traffic over TLS 1.3 (Cloudflare-enforced)
- 60-second timeout on every CLI request (no hung sessions)
- OAuth login defeats: code-substitution phishing (typed-code), login-CSRF (state-cookie binding), redirect-URI tampering (registered-URI verification)
- Sessions are 256-bit random tokens, 30-day expiry, revocable instantly
- Devices revoked from the dashboard refuse future syncs at the next attempt
- Server-side: every D1 query is tenancy-filtered by
account_idfrom the validated Bearer - Pentest pass: 50+ adversarial probes across SQL injection, IDOR, oversize payloads, cleartext-payload rejection β all clean
Constitution alignment β
Wyrm Cloud is rule I (local-first) compliant: Wyrm runs unchanged without ever logging in. The cloud is purely additive opt-in.
Wyrm Cloud is rule IV (operator owns the data) compliant: AES-256-GCM with operator-held keys, server stores opaque blobs only, full data export via ~/.wyrm/wyrm.db, can be deleted on demand.
Open source β
- Server code: github.com/Ghosts-Protocol-Pvt-Ltd/wyrm-cloud
- Spec: dragon-platform/specs/019-wyrm-cloud-sync
- Docs and community: github.com/Ghosts-Protocol-Pvt-Ltd/wyrm-mcp
Cost transparency β
Wyrm Cloud runs on Cloudflare's free tier:
- Workers: 100K requests/day free
- D1: 5GB Β· 5M reads/day Β· 100K writes/day free
- R2: 10GB storage Β· $0 egress free
At current scale (single founder + a few testers), monthly cost is $0.00. We'll publish a hosting-cost transparency report once paid tiers exist + traffic warrants it.