The mental model in 30 seconds
- Profiles hold your secrets and live per machine in
~/.ryvem/config.json. One profile is one board plus the repository-host and knowledge accounts that belong with it. - A repo's
ryvem.jsonholds no secrets — only the name of the profile it uses. It is safe to commit and share with your team. - Resolution walks a fixed path: the repo's
ryvem.jsonprofile → the store'sdefaultprofile → a zero-configlocalboard when nothing is set.
Two files, two jobs: a machine-local store of credentials, and a committable pointer into it. Everything below is detail on those two — start with a recipe, reach for the reference tables when you need a field.
Common recipes
The setup wizard writes profiles for you; ryvem-mcp use binds a repo to one. You rarely touch the files by hand.
One account
The installer runs the setup wizard once for you. To do it by hand — or to reconfigure later — run it yourself:
ryvem-mcp setup # interactive wizard; writes a named profile to config.json
- Name the profile (press Enter to accept
default). - Pick the board — Jira, Trello, or Local — and paste its credentials when asked.
- Add the repository host your code lives on (GitHub, Bitbucket, or GitLab), then choose Done.
- The first profile you create becomes the default automatically.
A repository with no ryvem.json already falls back to that default, so a single-account setup needs nothing more. To pin the repo explicitly — and to confirm what resolves — run:
ryvem-mcp use default # write {"profile":"default"} into this repo's ryvem.json
ryvem-mcp use # no argument: print what this repo resolves to
Two accounts of the same provider
A work Jira site for one project and a personal one for another — same provider, two contexts. Run the wizard twice with two names, then point each repo at the profile it needs:
ryvem-mcp setup # name it "work", Jira site A + its GitHub token
ryvem-mcp setup # name it "personal", Jira site B + its token
cd ~/code/work-project
ryvem-mcp use work # this repo now resolves the "work" profile
cd ~/code/side-project
ryvem-mcp use personal # this repo now resolves the "personal" profile
- Running
setupagain adds another named profile; it never overwrites the first. When it asks which to make default, choose the one you use most. ryvem-mcp use <name>merges{"profile":"<name>"}into that repo'sryvem.json, preservingrepoIdand every other field.- Commit each
ryvem.json— it names a profile, it never contains one — so teammates inherit the binding and supply their own tokens.
After ryvem-mcp update
Self-update replaces the binary only. The installer wizard does not run again, and your profiles and repo bindings are left untouched. To add or change an account afterwards, run the wizard directly:
ryvem-mcp update # replaces the binary; profiles and bindings survive
ryvem-mcp setup # re-run any time to add or update a profile
ryvem-mcp doctor # read-only: confirm what is configured and what resolves
Re-running setup updates an existing profile when you give its name, or adds a new one — always through the same atomic write. When something looks off, ryvem-mcp doctor is the first stop: it prints, with no network calls, exactly which profiles exist, which one this repo resolves, and any mismatch it finds.
Reference: the two layers
Ryvem never mixes credentials with project settings. Where a secret can live and where a project binding can live are two different places, by design.
| Layer | Location | Holds | Commit it? |
|---|---|---|---|
| Global profiles | ~/.ryvem/config.json or a .env next to the binary | Board and account credentials, grouped into named profiles | No — machine-local |
| Per-repo binding | ryvem.json at the repo root | Which profile and board a repo uses, plus harness settings — never a secret | Yes — safe to commit |
One machine can hold many profiles — a company account and a personal one, each with its own board, repositories, and knowledge base — and each repo picks the one it needs. That multi-context setup is the intended, first-class case.
Global profiles: config.json
The global store lives at ~/.ryvem/config.json. A profile is one board plus the version-control and knowledge accounts that belong to the same context. The top-level default names the profile used whenever nothing more specific is chosen.
{
"default": "company",
"profiles": {
"company": {
"board": { "provider": "jira", "url": "https://yourco.atlassian.net", "email": "you@company.com", "token": "..." },
"github": { "token": "..." }
},
"personal": {
"board": { "provider": "local" }
}
}
}
You rarely edit this file by hand — the config commands read and write it for you, always through an atomic write so a crash can never leave it half-written. The setup wizard on first install writes it too.
Profile fields
Every profile has exactly one board; the account sections are optional and only added when you use that host. The board's fields depend on its provider.
| Section | Fields | Notes |
|---|---|---|
board (Jira) | provider: "jira", url, email, token | Atlassian site URL, account email, and an API token. |
board (Trello) | provider: "trello", key, token | No URL or email — the REST base is fixed. |
board (local) | provider: "local", userName | Carries no secret. A board backed by the memory graph; userName is optional. |
github | token | A fine-grained token for pull requests and contents. |
bitbucket | email, token | A separate Atlassian token — a Jira token does not authenticate Bitbucket. |
gitlab | token, host | host is set only for a self-hosted instance; it defaults to gitlab.com. |
confluence | url, email, token | The knowledge base. For a Jira board it can reuse the Jira site and token. |
vcsHosts | map of host → github · bitbucket · gitlab | Tells Ryvem which client speaks a self-hosted git host's API. github.com, gitlab.com, and bitbucket.org are built in. |
The exact credential shapes, scopes, and where to create each token are covered in Providers.
config.json is validated on read
The file must be a JSON object with a profiles map, and default — when present — must name a defined profile. A syntax or structure error is reported with an actionable message rather than silently ignored, because the file is yours to author. Setting the default from the CLI (ryvem-mcp config default <name>) keeps it valid for you.
The data directory
config.json lives inside Ryvem's data directory, which also holds the memory-graph database (dev.db) and a cache. It defaults to ~/.ryvem and moves wholesale when you override it.
| Path | What it is |
|---|---|
~/.ryvem/config.json | The global profile store. |
~/.ryvem/dev.db | The embedded memory graph — see Memory graph. |
~/.ryvem/cache/ | Working cache. |
Set RYVEM_DATA_DIR to relocate all of the above (config, database, and cache move together). On first run against the default location, an existing legacy ~/.dev-mcp directory is migrated into place automatically.
The .env alternative
Instead of — or alongside — config.json, a single profile can come from a .env file placed next to the binary (or at the package root when running from source). This is the original single-board layout, kept for full backward compatibility. Variables already set in your environment always win over the same key in .env.
ATLASSIAN_EMAIL=you@company.com
JIRA_URL=https://yourco.atlassian.net
JIRA_TOKEN=...
GITHUB_TOKEN=...
The board provider comes from RYVEM_PROVIDER (jira, trello, or local). If it is unset, Ryvem infers it from the variables that are present: any Jira variable means Jira, any Trello variable means Trello. A completely empty .env boots the zero-config local board so the server always starts.
How the two sources combine
When config.json exists it is the source of truth. The .env profile is still added as default if it is buildable and no config.json profile already uses that name. With no config.json at all, the .env becomes a single default profile — the historical behavior, unchanged.
Per-repo binding: ryvem.json
A repository declares which profile and board it works against in a ryvem.json at its root. This file holds only references — never a token — so it is safe to commit and share with your team. Credentials always come from the resolved profile; any credential-looking field written here is stripped on read.
{
"profile": "company",
"board": "PROJ",
"agents": {
"enabled": ["architect", "engineer", "security"],
"orchestrator": "chief",
"maxIterations": 3,
"checks": [{ "id": "test", "run": "npm test" }, { "id": "types", "run": "npx tsc --noEmit" }],
"gateChecks": { "architecture": ["test", "types"] }
}
}
| Field | Meaning |
|---|---|
profile | The name of the global profile this repo uses — the key into config.json that supplies the actual credentials. |
board | The board or project identifier to work by default (for example a Jira project key). |
agents | The agent-harness configuration: enabled roles, orchestrator, iteration cap, and verification checks. Committable and secret-free — see Agent harness. |
repoId | A stable repo:<uuid> identity for the memory graph, minted on first touch and committed so it survives a fresh clone or a database reset. Written for you. |
The file is found by walking up from the working directory to the repository's git root (or the filesystem root). A pre-rebrand dev-mcp.json is still read as a fallback, so existing repositories keep working.
Why this file is safe to commit
It names a profile; it does not contain one. A teammate who clones the repo gets the binding — "this project uses the company profile and board PROJ" — while their tokens stay in their own machine-local config.json or .env. Onboarding is a clone plus their own credentials, nothing more.
How a repo resolves its profile
When a tool runs against a repository, Ryvem picks the profile — and the board — in a fixed order, taking the first value it finds:
| Resolves | Order of precedence |
|---|---|
| Profile | ryvem.json profile → the global per-repo binding → the store's default |
| Board | ryvem.json board → the binding's board → the currently active board |
Because the committed ryvem.json comes first, a repository's declared profile is authoritative for everyone who works in it, while a machine without that file still falls back cleanly to its own default.
A missing profile name falls back, it never fails
If ryvem.json names a profile that is not in the loaded config — a typo, or a profile that exists on a teammate's machine but not yours — Ryvem does not error out. It writes one warning to stderr (profile 'x' not found — falling back to 'default') and continues on the default profile, so the server always starts. Run ryvem-mcp doctor to see the mismatch named in plain words, then ryvem-mcp setup to recreate the profile or ryvem-mcp use <name> to point the repo at one that exists.
Environment variables
Environment variables configure runtime paths and the .env profile. Anything set in the real environment overrides the matching line in a .env file.
Runtime and paths
| Variable | Purpose |
|---|---|
RYVEM_DATA_DIR | Override the data directory (config, database, and cache). Defaults to ~/.ryvem. |
RYVEM_BASE_URL | Download host for the update check (--version) and self-update (update). Defaults to the official host; set it only to use a mirror. |
NO_COLOR | Disable ANSI color in CLI output. Color is off automatically when output is piped. |
.env board selection
| Variable | Purpose |
|---|---|
RYVEM_PROVIDER | Board provider for the .env profile: jira, trello, or local. Inferred from the variables present when unset. |
RYVEM_USER | Optional display name (whoAmI) for the local board. |
Credential variables
The board, version-control, and knowledge credentials for the .env profile. Scopes and where to create each token live in Providers.
| Group | Variables |
|---|---|
| Jira board | JIRA_URL, JIRA_EMAIL (falls back to ATLASSIAN_EMAIL), JIRA_TOKEN |
| Trello board | TRELLO_KEY, TRELLO_TOKEN |
| GitHub | GITHUB_TOKEN |
| GitLab | GITLAB_TOKEN, GITLAB_HOST (self-hosted only; defaults to gitlab.com) |
| Bitbucket | BITBUCKET_TOKEN, BITBUCKET_EMAIL (falls back to ATLASSIAN_EMAIL, then the Jira email) |
| Confluence | CONFLUENCE_URL, CONFLUENCE_EMAIL, CONFLUENCE_TOKEN (a Jira board defaults these to the Jira site, email, and token) |
| Shared | ATLASSIAN_EMAIL — one email reused across the Atlassian products above |
Bitbucket and Jira use separate tokens
Even though both are Atlassian and share ATLASSIAN_EMAIL, a Jira token does not authenticate Bitbucket — set BITBUCKET_TOKEN in addition to JIRA_TOKEN. GitLab authenticates by token alone, so GITLAB_EMAIL is not used.