opencode discovers AGENTS.md and nothing else; claude code discovers CLAUDE.md. this repo had neither, so an agent sent to change something here arrived with no guidance at all under either. it deliberately does NOT repeat README.md. that file says what the plugin is, for someone deciding whether to install it. this one answers the other question: i have to change something in here, what will i break. the facts in it are read from the repository rather than recalled — the panel keys from web/panels.ts, the tables from db/schema.ts, the permission keys, the host binaries and the route claims from manifest.ts. presence is the declaration everywhere in this system, so the file says what the platform will actually conclude from these files existing. CLAUDE.md beside it is a pointer, not a copy: two copies drift and the stale one is the one somebody reads.
Wallet
A self-custodial bitcoin wallet inside Officer, with the keys held on your server rather than on a phone or in a browser.
What you get
- On-chain balance, receive addresses and transaction history
- Send, with fee control, coin selection and UTXO freezing
- Labels for addresses and transactions
- Multiple wallets, one active
- Chain data from Esplora or your own NBXplorer
How the keys are held
Read docs/wallet-key-custody.md in the platform for the full design. The short version:
- Your seed is encrypted under a key derived from your own passphrase (scrypt, N=2¹⁷), then encrypted again at rest. The server never stores the passphrase.
- The wallet is usable while locked — balances, history and fresh receive addresses all work without it. Unlocking is required only to sign.
- An unlock lasts 15 minutes by default and does not extend on use. A restart relocks everything.
- There is no "forgot passphrase". There is no recovery. Your seed backup is the recovery.
Multi-user
Each account gets its own wallet, sealed under its own passphrase. Granting the bitcoin-wallet permission
to a role gives those people a wallet of their own — it does not give them yours, and it does not give
you theirs. Not through the app, and not with root either: their seed is sealed under a passphrase you
do not have.
One caveat, stated plainly: balances and history are stored unencrypted so a locked wallet still shows them. Anyone with the database — or a backup of it — can see any user's balances. They can never move anything.
Permissions
One permission, bitcoin-wallet. Grantable per role like any other app permission.
Requirements
None to start. Esplora is used by default; point it at your own NBXplorer if you run one.