OpenTusk Cloud

Sync your vault through a server that can't read it.

OpenTusk Cloud keeps one vault in sync across all your machines. Everything is encrypted on your device before it leaves; the server only ever stores ciphertext under scrambled names. Your memories stay yours — now on every computer you own.

In beta — free to use, no waitlist. Requires tuskd v0.8.0 or later.

What it is

tuskd is local by construction: your vault is plain Markdown on your disk, and the daemon makes no outbound network calls until you say otherwise. OpenTusk Cloud is the opt-in "say otherwise": connect a vault to a cloud repo and the daemon keeps it synced — encrypting every change on-device, uploading only ciphertext, and pulling other machines' changes down to decrypt locally.

  • Local stays local. Your working vault remains plaintext Markdown on your own disk — grep it, diff it, back it up, exactly as before.
  • The server is ciphertext-blind. Encryption happens in tuskd before upload. The server never holds a key, a memory, or even a file name.
  • Key custody is yours. A repo's master key is born on your first device and travels only inside encrypted wraps between your devices — or via a 24-word recovery phrase that's shown exactly once.
Your machine plaintext vault encrypts on-device OpenTusk Cloud ciphertext only no keys, ever Your other machine decrypts on-device plaintext vault push pull
ciphertext in the middle — plaintext only at the edges

How it works

Connecting a vault creates (or joins) a cloud repo. From then on the daemon syncs automatically in the background (every 30 seconds by default); tuskd sync push and tuskd sync pull do the same by hand.

Keys

  • Repo master key — 32 random bytes, generated on the first connecting device. It never leaves a device unencrypted.
  • Recovery phrase — the master key encoded as 24 words, printed exactly once when the repo is created (and again only after a key rotation). It is both your disaster-recovery key and one of the two ways to join a new device.
  • Device keys — each machine has its own ed25519 keypair. Every sync request is signed by a device key, and the server verifies signatures against the repo's device registry.
  • Per-object keys — each synced object is encrypted (XChaCha20-Poly1305) under its own random key, kept in an encrypted key table wrapped by the master key. That makes key rotation cheap: revoking a device re-seals the small key table, not your whole vault.

Names

Objects are stored under keyed hashes of their paths, so the server can't learn your vault's structure from blob names. The mapping lives in the repo manifest — encrypted, like everything else.

What the server sees

"Private by construction" means the privacy doesn't depend on our promises — the server can't read what it never receives. Here is the complete inventory:

The server storesThe server never has
Your account email and planVault content — memories, skills, notes
Opaque blob names and sizesFile names, paths, scopes, agent structure
Operation sequence numbers and timestampsThe repo master key or recovery phrase
Device public keys and fingerprintsAny device's private key
Encrypted key wraps it relays but cannot openThe ability to mint access — approvals require an existing device's signature

Even sign-in codes and session tokens are stored only as SHA-256 digests — there is nothing secret at rest on the server. The dashboard shows you this inventory live: everything the server knows about you, on one screen. Notice there are no notes in it.

Quickstart: first machine

From a vault that's already set up locally (see the tuskd quickstart), three commands connect it to the cloud. Sign-in is passwordless — a one-time code is emailed to you.

shell
# 1. Sign in (a code is emailed to you; sessions last 30 days)
$ tuskd sync login --email [email protected]
sign-in code sent to [email protected] — enter it below
logged in as [email protected] (free plan)

# 2. Create a cloud repo for this vault
$ tuskd sync init
repo created: 01K1CJ… (team-vault)
RECOVERY PHRASE — write this down; it is shown exactly once:
  abandon ability able … (24 words)

# 3. Sync — or just run the daemon; it syncs automatically
$ tuskd sync push
Write the phrase down now. The recovery phrase is displayed exactly once and never stored anywhere we can retrieve it. With it, you can recover your vault onto any machine; without it — and without any approved device — your synced data is unrecoverable by design. A password manager or a piece of paper in a drawer both work.

Second machine

Install tuskd on the new machine, then enroll it into your repo. There are two ways in — a device approval ceremony (no secrets typed), or the recovery phrase (works even if no other machine is online).

Path A — device approval (recommended)

new machine
$ tuskd sync connect --repo <repo-id>
enrolled as device 01K1D0… (pending)
fingerprint: 3f9a1c62e8b04d75
any approved machine
$ tuskd sync devices          # see the pending device + its fingerprint
$ tuskd sync approve 01K1D0… --fingerprint 3f9a1c62e8b04d75

The fingerprint is derived from the new device's public key and rendered identically on both screens — compare the 16 characters before approving. That human check is what gates access: the server relays public keys and encrypted wraps, but it cannot approve anything by itself, and a device can never approve itself.

Once approved, the new machine pulls, decrypts locally, and materializes the vault — then keeps syncing automatically.

Path B — recovery phrase

new machine
$ tuskd sync connect --repo <repo-id> --phrase "abandon ability able …"
repo key recovered from phrase and stored

Full access immediately, no approval needed — the phrase is the master key. This is also the disaster-recovery path: it works with zero other devices online.

Devices & revocation

tuskd sync status shows this machine's connection, fingerprint, and approval state; tuskd sync devices lists every device in the repo with statuses and fingerprints.

Lost a laptop, or retiring one? Revoke it from any other approved machine:

shell
$ tuskd sync revoke 01K1D0…
revoked 01K1D0…; rotated to generation 2
re-wrapped the repo key for 2 remaining device(s)
NEW RECOVERY PHRASE — the old one is now useless; write this down:
  … (24 words)

One command does the whole rotation: the revoked device is cut off from every future sync, a fresh master key is generated, the key table is re-sealed, and the remaining devices get new wraps. The old recovery phrase stops working; a new one is printed once.

The honest limit of end-to-end encryption: data a device already pulled, it already has — no protocol can reach into a stolen laptop and delete files. Revocation protects everything written after it. (This is true of every E2E system; we'd rather say it plainly.)

The dashboard

cloud.opentusk.ai is the web view of your account — sign in with the same emailed code as the CLI. It shows your repos (storage used, device counts, activity), your devices (status, fingerprints, enrollment dates), your active sessions (with one-click revoke), and your plan usage.

The dashboard is exactly as blind as the server. It displays metadata the server legitimately holds — names you chose, sizes, timestamps, public-key fingerprints — and not one word of vault content, because the server has none to show. Treat it as the live audit of the inventory above.

Operations that touch key material stay in the CLI, where your keys actually live. For device approval, the dashboard acts as the second screen: it shows a pending device's fingerprint on a browser you already trust, alongside the exact tuskd sync approve command, pre-filled.

Account & plans

Accounts are passwordless: tuskd sync login emails you an 8-digit one-time code (valid 10 minutes), and a successful sign-in starts a 30-day session. The same code flow signs you into the dashboard. An account is only ever created on a successful verification — sending codes to an address creates nothing.

OpenTusk Cloud is in beta and free to use — no waitlist. The free plan includes one repo and 100 MB of encrypted storage; Pro is coming with more repos and more storage, and team repos follow general availability. Delete a repo you no longer need with tuskd sync delete-repo <repo-id> — the cloud copy is removed and the plan slot freed, while your local vault is untouched.

CLI reference

Everything lives under tuskd sync. The full tuskd CLI is documented in the tuskd reference.

CommandWhat it does
sync login --email <addr>Sign in to your OpenTusk account; a one-time code is emailed to you.
sync initCreate a cloud repo for this vault; prints the recovery phrase once.
sync reposList your account's cloud repos.
sync rename <name>Rename a cloud repo — display name only; the repo id, devices, and keys never change.
sync connect --repo <id>Enroll this vault as a new device (add --phrase to skip approval).
sync statusShow connection, fingerprint, and approval status.
sync devicesList the repo's devices with fingerprints.
sync approve <device> --fingerprint <fp>Approve a pending device after comparing fingerprints.
sync revoke <device>Revoke a device and rotate the repo key; new phrase printed once.
sync push / sync pullEncrypt-and-upload / download-and-materialize by hand (the daemon does this automatically).
sync delete-repo <id> --yesPermanently delete a cloud repo; the local vault is untouched.

Security model

What syncs — and what never does

Sync covers your vault's knowledge: memory records, skills, the review queue, and shared policy configuration. It deliberately excludes the machine-local secrets: agent private keys, the operator token, and the derived index (which every machine rebuilds locally). The boundary is the same one tuskd export draws.

Trust anchors

  • Confidentiality rests on client-side encryption — not on server policy, promises, or jurisdiction. A complete compromise of the server yields ciphertext and the metadata listed above, nothing more.
  • Access control rests on device signatures. Every sync call is signed by an approved device's key; approvals themselves must be signed by a different approved device. The server relays and verifies — it cannot grant.
  • Joining rests on a human check: the 16-character fingerprint compared across two screens, or possession of the recovery phrase.
  • Recovery rests on the phrase. We cannot reset it, resend it, or recover your data without it — that's not a support limitation, it's the design.

The server side is source-available (tusk-cloud); the client-side crypto ships in the open-source tuskd — the code that does the encrypting is the code you can read.

FAQ

Does tuskd still work fully offline?

Yes. Sync is opt-in: until you run tuskd sync login, tuskd makes no outbound network calls, exactly as documented. Disconnected vaults behave exactly as they always have, and a connected vault keeps working offline — changes queue locally and sync when you're back.

Can OpenTusk (the company) read my memories?

No. Encryption happens on your device before upload; blob names are keyed hashes; the master key never reaches us. The server can't read what it never receives — and the dashboard shows you everything it does hold.

I lost my recovery phrase. Am I locked out?

Not while you still have an approved device — devices hold the key material, so sync continues and new machines can join via the approval ceremony. A fresh phrase is printed the next time the key rotates (tuskd sync revoke). If you lose the phrase and every approved device, the synced data is unrecoverable — by design, there is no server-side reset.

What happens to a device I revoke?

It's cut off immediately: every signed call it makes is refused from the moment of revocation, and the repo key rotates so everything written afterward is sealed away from it. Data it had already pulled remains on that machine — the inherent limit of any end-to-end encrypted system.

Can I share a repo with another person?

Not yet — repos are single-account today, syncing your machines. Multi-user team repos are designed and on the roadmap for after general availability.

Does the export/import workflow still exist?

Yes. tuskd export / tuskd import remain the fully offline way to move a vault — no account, no network. Cloud sync is for the continuous case: same vault, several machines, always current.