Your Secrets Live in the OS Keychain,
Not in a Prompt and Not in Your Repo
AgentsRoom stores API keys, tokens and database passwords in a machine-local vault encrypted through your operating system keychain. You reference them by name, and the app resolves them when a command or an agent starts.
Stop pasting a token into a prompt because it was the quickest way to unblock an agent. Name the secret once, use {{secret:NAME}} everywhere else, and let the value stay where it belongs.
How AgentsRoom keeps a secret usable by your commands and unreadable by the agent that asks for it.
Every project ends up with a handful of values that must not be shared : a payment key, a database password, a deploy token, an API key for the staging environment. The moment AI coding agents enter the picture, those values start moving in the worst possible way. They get pasted into a prompt to unblock an agent, hardcoded into a script the agent wrote, or dropped into a file that gets committed three commits later.
The AgentsRoom secret manager gives them one place to live. A secret is a name and a value : you add it once, and AgentsRoom encrypts it through your operating system keychain before it ever touches the disk. The whole vault is a single file in your home folder, written with owner-only permissions, and it never leaves the machine it was created on.
From then on you never handle the value again. You write {{secret:NAME}} in a dev command or in an agent environment, and AgentsRoom substitutes the real value when that command or that agent starts. Your agents can list the names and ask for one to be injected, which is enough to do their job, and they never get the value itself.
A Vault Built for a Machine Full of AI Agents
Encrypted by the operating system, referenced by name, resolved at the last possible moment.
Encrypted by Your OS Keychain
Every value is encrypted through Electron safeStorage, which means the encryption key is held by your operating system keychain and not by AgentsRoom. The app stores ciphertext and asks the system to decrypt it, exactly like the other applications you already trust with credentials.
One Vault File, Owner Only
All your secrets live in a single vault at ~/.agentsroom/secrets.json, written with owner-only permissions (0600) and replaced atomically on every change. No half-written file after a crash, and no other user account on the machine can open it.
Reference by Name, Never by Value
A saved secret is used as {{secret:NAME}} : in the command line of a dev terminal, in the environment given to an agent, anywhere you would otherwise have typed the credential. What you read on screen, and what you could show a teammate, is the name.
Resolved at Launch, in the Main Process
The substitution happens when the process starts, inside the Electron main process. The resolved value goes into the environment of the command being launched and nowhere else : not into a log, not into the interface, not into a file on disk.
Agents See Names, Not Values
An AI agent can list the names of your secrets and ask for one to be injected into something it is about to run. There is no code path that hands a value back to an agent, to the interface layer or over MCP. The agent works with the reference, the app works with the secret.
No Keychain, No Storage
If the machine cannot offer a working OS keychain, AgentsRoom refuses to save the secret instead of falling back to clear text. A vault that silently degrades into a plain file is worse than no vault, so that fallback simply does not exist.
Machine-Local by Design, Not by Default Setting
Your secrets are never sent to AgentsRoom servers. There is no sync toggle to check, no cloud vault to opt out of, and no backup of your keys anywhere but your own disk. The vault is created on the machine, encrypted with a key that the operating system keychain holds for that machine, and it stays there. A copy of the file on its own is not something another machine can open.
The separation between using a secret and reading a secret is enforced in code, not by an instruction written in a prompt. The interface layer, the MCP tools and every agent talk about secrets by name. Only the Electron main process turns a reference into a value: while it is building the environment of a process you asked it to start, or, if you turned on live data for HTML views in a project, when it adds a header to a request to an endpoint you allowed, which the page never sees. Telling an agent to be careful with credentials is a hope. Not having a function that returns the credential is a guarantee.
That is what makes it reasonable to let an agent work against a paid API or a real database. The agent knows a secret named STRIPE_SECRET_KEY exists and can ask for it to be injected into the command it wants to run. It cannot print it, cannot copy it into a file it is writing, and cannot leak it into a conversation stored somewhere else.
From a Pasted Token to a Named Secret
Three steps, and the value never appears again.
Add the secret once
Give it a name and paste the value one last time. AgentsRoom encrypts it through the OS keychain and writes it into the vault at ~/.agentsroom/secrets.json, owner-only and atomically. If the machine has no usable keychain, the app says so and refuses rather than writing clear text.
Reference it as {{secret:NAME}}
Use the reference wherever the value used to go : the command that starts your dev server, or the environment of an agent that needs an API token. What is stored in your settings is the reference, and it is safe to look at.
Let AgentsRoom resolve it at launch
When the command or the agent starts, the main process swaps the reference for the real value in the environment of that process. Your tooling gets what it needs, and the agent driving it still only ever knew the name.
When a Secret Manager Stops Being Optional
The situations where a pasted credential turns into a real incident.
Dev servers that need real keys
Your dev server will not boot without a payment key and a database password. Put {{secret:NAME}} in the launch command instead of the credential, and the command becomes something you can leave on screen during a call without a moment of panic.
Agents that call a paid API
An agent needs a token to reach a third-party API while it works. Add the secret to its environment by name : the agent gets a working environment, and the token is not in the prompt, not in the conversation and not in whatever the agent writes next.
Keys that stop landing in the repo
The usual accident is a credential written into a config file that a later commit sweeps up. Referencing secrets by name means the file tracked in the repository holds a name, so there is nothing to leak when the branch is pushed.
One machine, many projects
A single vault, protected by your OS keychain and readable only by your user account, serves every project you open. Each project references the names it needs, and none of them keeps its own scattered copy of a credential.
How can an agent use a secret it cannot read?
Because using a credential and reading a credential are two different operations, and AgentsRoom only implements the first one for agents. The vault is exposed over MCP by exactly one tool, secrets_list, and it returns names. From there the agent writes {{secret:NAME}} in the command or the environment it needs, and the substitution is carried out by the app, not by the agent.
What is deliberately missing is the other direction. No MCP tool returns a secret value, the interface layer never receives one, and nothing renders it back into a conversation. Turning a reference into an actual value happens inside the Electron main process, at the moment a process is launched, and the result goes into that process environment and nowhere else. The one exception is opt-in and per project: a request header for an endpoint you allowed for your HTML views, added by the main process and never shown to the page.
The practical effect is that an agent can run your test suite against a real database, call a paid API or deploy to staging without a single credential entering its context. Nothing to redact afterwards, because nothing was ever exposed.
Discover AgentsRoom MCPWhere are my secrets stored?
Can my AI agent read my secrets?
Are my secrets synced to AgentsRoom servers?
How do I use a secret in a command?
What happens if my machine has no OS keychain?
Does this replace the environment files in my project?
If someone copies the vault file, can they read it?
Which MCP tool do my agents use for secrets?
You may also like
Database Connections
Save your MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and Google BigQuery connections, reach a database in a private subnet through an SSH tunnel or an AWS SSM session, and let your AI agents query it over MCP. Read-only by default, one statement per call, capped result sets, and the password never reaches the agent. Export, import and database-to-database copy for MySQL, PostgreSQL and MongoDB.
SSH Connections
Save your SSH connections, open a built-in terminal over SSH, and run Claude Code, Codex or Antigravity CLI directly on your remote server or VPS. SSH key or password auth, per-project connection profiles, no separate SSH client needed.
Dev Terminals
Per-project terminal manager and process launcher. Start backend, frontend and workers in one click, with your secrets injected at launch instead of typed in.
AgentsRoom MCP
The MCP server that lets your agents drive AgentsRoom itself : projects, terminals, backlog and connections, with the guardrails that come with it.
Give Your Agents Access, Not Your Keys
Download AgentsRoom, move your API keys and passwords into a vault encrypted by your OS keychain, and reference them by name everywhere else.
Companion app: monitor your agents on the go
Bring your own: Claude, Codex, Antigravity CLI, or other AI provider.
Push bugs and requests straight to your public backlog.
Agents you read like a conversation
Each agent has a role, a face, and a thread you read like a messaging app.
