Documentation

Configuration

Two layers, cleanly separated. Secrets live globally in named profiles; each repository binds itself to a profile through a small file that carries no secrets and is safe to commit.

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.json holds 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.json profile → the store's default profile → a zero-config local board 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
  1. Name the profile (press Enter to accept default).
  2. Pick the board — Jira, Trello, or Local — and paste its credentials when asked.
  3. Add the repository host your code lives on (GitHub, Bitbucket, or GitLab), then choose Done.
  4. 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
  1. Running setup again adds another named profile; it never overwrites the first. When it asks which to make default, choose the one you use most.
  2. ryvem-mcp use <name> merges {"profile":"<name>"} into that repo's ryvem.json, preserving repoId and every other field.
  3. 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.

LayerLocationHoldsCommit it?
Global profiles~/.ryvem/config.json or a .env next to the binaryBoard and account credentials, grouped into named profilesNo — machine-local
Per-repo bindingryvem.json at the repo rootWhich profile and board a repo uses, plus harness settings — never a secretYes — 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.

SectionFieldsNotes
board (Jira)provider: "jira", url, email, tokenAtlassian site URL, account email, and an API token.
board (Trello)provider: "trello", key, tokenNo URL or email — the REST base is fixed.
board (local)provider: "local", userNameCarries no secret. A board backed by the memory graph; userName is optional.
githubtokenA fine-grained token for pull requests and contents.
bitbucketemail, tokenA separate Atlassian token — a Jira token does not authenticate Bitbucket.
gitlabtoken, hosthost is set only for a self-hosted instance; it defaults to gitlab.com.
confluenceurl, email, tokenThe knowledge base. For a Jira board it can reuse the Jira site and token.
vcsHostsmap of host → github · bitbucket · gitlabTells 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.

PathWhat it is
~/.ryvem/config.jsonThe global profile store.
~/.ryvem/dev.dbThe 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"] }
  }
}
FieldMeaning
profileThe name of the global profile this repo uses — the key into config.json that supplies the actual credentials.
boardThe board or project identifier to work by default (for example a Jira project key).
agentsThe agent-harness configuration: enabled roles, orchestrator, iteration cap, and verification checks. Committable and secret-free — see Agent harness.
repoIdA 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:

ResolvesOrder of precedence
Profileryvem.json profile → the global per-repo binding → the store's default
Boardryvem.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

VariablePurpose
RYVEM_DATA_DIROverride the data directory (config, database, and cache). Defaults to ~/.ryvem.
RYVEM_BASE_URLDownload host for the update check (--version) and self-update (update). Defaults to the official host; set it only to use a mirror.
NO_COLORDisable ANSI color in CLI output. Color is off automatically when output is piped.

.env board selection

VariablePurpose
RYVEM_PROVIDERBoard provider for the .env profile: jira, trello, or local. Inferred from the variables present when unset.
RYVEM_USEROptional 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.

GroupVariables
Jira boardJIRA_URL, JIRA_EMAIL (falls back to ATLASSIAN_EMAIL), JIRA_TOKEN
Trello boardTRELLO_KEY, TRELLO_TOKEN
GitHubGITHUB_TOKEN
GitLabGITLAB_TOKEN, GITLAB_HOST (self-hosted only; defaults to gitlab.com)
BitbucketBITBUCKET_TOKEN, BITBUCKET_EMAIL (falls back to ATLASSIAN_EMAIL, then the Jira email)
ConfluenceCONFLUENCE_URL, CONFLUENCE_EMAIL, CONFLUENCE_TOKEN (a Jira board defaults these to the Jira site, email, and token)
SharedATLASSIAN_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.