Nook
A memory and secrets store for my AI agents, shared across machines and hosted in my own Cloudflare account.
I built Nook so my agents can keep context across machines and use credentials without asking me to paste them into a chat. It runs in my own Cloudflare account. Each installation belongs to one owner. Someone else can install their own copy.
An agent reaches Nook through MCP or the CLI. I use the web app to read memories and manage what each machine can access. Memory and Vault share the same permissions, so connecting a machine does not mean giving it access to everything.
The memory model is small. A memory is Markdown in a bucket, with tags and a history of changes. My earlier memory project had typed records and a graph of entities and relations. That fit software projects, but I also wanted to remember personal things. I left that structure out of Nook until a real need justified it.
Writes are explicit. Nook does not read conversations and decide what to save. The agent or I choose the fact to remember. That means useful context can go missing if nobody writes it down. It also means I can see who stored something and when, instead of trying to understand what an automatic extraction decided was important.
Let a command use a secret
The rule for Vault is that secret values must stay out of the model's context. An agent can discover a secret's name and description. To use it, the agent starts a command through nook run. Nook puts the value in that command's environment and records the stated purpose and the command that received it. Nook's own output never prints the value.
This protects against accidental exposure. It does not stop an agent with a shell from deliberately printing a value its command can read. I kept that limit explicit. The audit history helps me review uses; it cannot make a careless command safe.
Buckets limit what a connected machine can reach. A machine can have access to one project without seeing a sibling project. Reads can include context from parent buckets, within the machine's grant. Every operation checks that grant. The bucket is part of authorization, rather than a label used to filter a search.
When search is behind
Meaning search introduced another limit. The vector service can take time to expose a new memory. I keep D1 authoritative and treat search indexes as data that can be rebuilt. Nook checks vector results against current content and permissions in D1 before returning them. Saving a memory can succeed while meaning search is unavailable.
Nook already has versioned memories, keyword and meaning search, and file attachments. Vault supports audited command use from Linux and macOS. Forgetting removes a memory from Nook's reads immediately, but I cannot promise physical erasure from Cloudflare's storage or backups.