Skip to content

Repository files navigation

Postum

Your encrypted digital legacy: fully on-chain, released to your heirs only when you're gone.

English · Deutsch · Français

Built on Internet Computer Encryption: vetKeys License: MIT Status: showcase · unaudited

Postum

What is Postum?

Postum is an open-source vault for your most important text secrets: passwords, wallet seed phrases, access notes, a farewell message. It runs entirely on the Internet Computer, encrypted with vetKeys so that nobody, not even the operator, can read it. After a long period of owner inactivity it is released to named heirs, who unlock it with a claim code. Once everyone has it, the vault seals forever.

The name is literal: postum means posthumous. It acts after you're gone.

⚠️ Status: showcase / reference project. Built on young tech (vetKeys, 2025) and not audited. Treat it as a complementary safeguard and a demonstration of what's possible on ICP. It is not the only place you should keep irreplaceable secrets, and not yet meant for real life savings.

How it works

  1. Set up. Sign in with Internet Identity. Write your secret text. It's encrypted in your browser (vetKeys IBE) to your own principal, so the canister never sees plaintext.
  2. Stay alive. A periodic "I'm alive" click resets your inactivity timer.
  3. Heirs. You generate one claim code per heir. Only the SHA-256 hash of each code is stored on-chain; you hand the codes to your people in the real world (will, notary).
  4. Release. If you go inactive past your chosen threshold, a veto window starts (you can still cancel by clicking "I'm alive"). After it passes, the vault becomes released.
  5. Claim. Each heir enters their code; the canister checks the hash and the released status, then derives the decryption key via vetKD. Each heir retrieves the text, then marks themselves done.
  6. Seal. When all heirs are done (or an owner-set deadline passes), the vault seals forever and the ciphertext is purged.

What makes it different

Compared to… Postum's difference
Centralized vaults (Vault12, DGLegacy, Cipherwill) No company that can go bankrupt or get hacked, and no subscription that lapses after you're gone. The vault outlives everyone, fully on-chain.
Other-chain solutions (Shamir, TEE, stakers) No third-party stakers to bribe or lose, no trusted hardware, no cross-chain fragmentation. The ICP subnet derives the key via vetKD, only at release.
Publish-on-death dead-man's switches Secrets are delivered privately to named heirs via a claim code, never published.

Run it locally

Prerequisites: icp-cli and mops.

npm install                            # root dependencies (scripts)
icp network start local --background   # local replica, gateway on port 8100
icp deploy                             # build + deploy backend + frontend
npm run env:setup                      # write the backend canister ID to frontend/.env.local
icp deploy                             # rebuild the frontend against that ID

The first deploy creates the canister IDs; env:setup reads them from .icp/canisters.json, and the second deploy rebuilds the frontend with the right backend ID baked in.

Open the app at the stable URL: http://frontend.local.localhost:8100/

Use this named URL, not the numeric canister-ID URL. Local canister IDs are reassigned whenever the network state is reset (e.g. a reboot), but frontend.local.localhost always resolves to the current frontend canister.

Stop cleanly with icp network stop.

Deploy it to ICP mainnet

"Launching" Postum means deploying both canisters to the Internet Computer mainnet (the ic environment). You need a named identity funded with cycles (converted from ICP).

# 1. Create and select a named identity (NEVER deploy from the anonymous identity)
icp identity new my-id
icp identity default my-id

# 2. Fund it: send ICP to your account, then convert ICP to cycles
icp identity account-id          # the address to send ICP to
icp token balance -n ic          # check your ICP balance on mainnet
icp cycles mint                  # convert ICP to cycles (see `icp cycles mint --help`)
icp cycles balance -n ic         # check your cycles

# 3. Deploy to mainnet (the 'ic' environment)
icp deploy -e ic

Your canisters now have permanent mainnet IDs and the frontend is served at https://<frontend-canister-id>.icp0.io.

After the first mainnet deploy, run npm run env:setup -- ic (writes the mainnet backend canister ID to frontend/.env.local) and then icp deploy -e ic again, so the frontend is built against the mainnet backend. Also keep the backend canister topped up with cycles so the vault never freezes (the "outlives you" economics, see docs/COSTS.md).

FAQ

Is it really private? Who can read my data? Nobody but you and, after release, your heirs. The text is encrypted in your browser to your own identity; the canister stores only ciphertext and never sees the plaintext. Decryption keys are derived by the ICP subnet (vetKeys/vetKD) and only handed out once the release condition is met.

What does it cost? Is there a subscription? No subscription. You only pay the canister's cycles (the network's "gas"). A text vault is tiny, so the lifetime cost is roughly a few dollars, one-time, versus hundreds to thousands over decades for subscription services. Full breakdown: docs/COSTS.md.

What happens when I die? You stop clicking "I'm alive". After your chosen inactivity period plus a veto window, the vault is released and your heirs can open it with their claim codes.

What if I lose my claim code or my Internet Identity? Then it's gone. By design nobody can help (no "forgot password"). The flip side of unstoppable is unrecoverable. That's why Postum is a complementary safeguard, not your only copy.

Can the operator, or DFINITY, read it or shut it down? No. It's a smart contract replicated across many independent nodes; there is no operator with access and no server to switch off. It keeps running as long as it has cycles.

Is it audited? Can I trust it with real secrets now? No. It's a learning/reference project on young tech. Do not store real, irreplaceable secrets in it without an independent professional audit.

Can I store crypto or money in it? Not directly. Postum holds text only and never custodies funds. If you want to pass on crypto, write the wallet seed phrase or instructions into the vault as text.

How is this different from 1Password / Bitwarden emergency access? Those are centralized companies with subscriptions. Postum has no company, no subscription, and runs fully on-chain, so it can outlive any business.

What is vetKeys? ICP's verifiable encrypted threshold key derivation: the network can hand out a decryption key on-demand without any single node ever seeing it. It's what lets the canister gate decryption behind a release condition while never seeing your plaintext.

Which languages does the app support? English, German and French. Switch in the top-right.

Cost

Cycles, not subscriptions. A ≤64 KB text vault costs roughly a few dollars, one-time, for decades. See docs/COSTS.md.

Security & honest limitations

The backend has passed an internal adversarial security pass (scripts/adversarial.mjs: ciphertext and heir caps, cycle-drain bounds, anonymous-principal checks, TOCTOU safety). Still, the deliberate weak spots are human and operational:

  • Permanent loss if cycles run out, the owner loses their Internet Identity, or all heirs lose their codes.
  • Wrongful release if the owner goes dark too long (mitigated by a long threshold plus a veto window).
  • The claim code is a bearer secret. After release, code plus vault reference equals access.
  • Vault existence is not private. Anyone who knows an owner's principal can query whether a vault exists and its status (never its contents). The reference should be shared as discreetly as the codes.
  • Young, unaudited tech.

Frontend & control. The app loads no external resources, uses asset certification, and ships a strict Content Security Policy plus security headers (frontend/public/.ic-assets.json5). Because encryption happens client-side, the canister controller is the real trust anchor: today the canisters are developer-controlled (a showcase with no real funds). Hardening toward decentralized control (SNS governance over both canisters and reproducible, verifiable builds) is on the roadmap.

Tech stack

  • Backend: Motoko canister (src/main.mo): vault lifecycle, claim-code gate, vetKD plumbing.
  • Frontend: Svelte 5 + Vite, on-chain asset canister; DM Sans + DM Mono.
  • Crypto: @dfinity/vetkeys.
  • Auth: Internet Identity. Tooling: icp-cli, mops.

Roadmap

  • Self-funding endowment: a small staked-ICP balance whose rewards pay the canister's cycles, so the vault never has to close.
  • A shared family pot (later, non-custodial, audited): families fund their own permanent vault by staking their own ICP.
  • A public mainnet deployment; an owner-identity recovery path; an external audit.

License

MIT.


a Gedankenlust project · built on the Internet Computer · powered by vetKeys

About

Encrypted on-chain digital legacy on the Internet Computer — vetKeys, Motoko, Svelte. A personal showcase project (beta, unaudited).

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages