Get Rema answering from what your team wrote
One command to install, then say “hey rema” in Claude Code or Codex and ask as usual. Answers come with the source of every passage, from what your team already wrote. It runs on your machine, with no API key.
Quick start
Install once, then ask your coding agent the way you already do. There is no command to learn and no API key.
1Install
npx askrema@latest
It shows every file it will create or change, asks once, and builds a demo project from public astral-sh/uv history so there is something to ask right away. Details under Install.
2Say hey rema in your agent
Open Claude Code or Codex in the demo project:
cd ~/rema-demo/ml-service && claude
The first time, Claude Code asks whether you trust the folder: choose “Yes, I trust this folder” (the cursor starts on No). Then say:
hey rema, our pyproject sets index-strategy = unsafe-any-match so torch comes from the pytorch index. is that still right, and is it safe?
Under your prompt you see one line that starts Rema found, naming the threads and docs it pulled, then an answer that cites them. Open one of the links: a citation you cannot check is not worth much. With Codex, run codex instead and trust the Rema hook once (type /hooks).
3Your own project
Read in a folder of what your team wrote: docs, exported threads, design notes.
cd <your project> npx askrema ingest ./docs
Then open your agent there, start a prompt with “hey rema” and ask as usual. Rema adds the passages it found, each with where it lives, before the agent answers.
Install
One command, on macOS or Linux with Node 18 or newer. No sudo, no API key, no shell profile edit. It shows every file it will create or change, then asks once.
npx askrema@latest
It finds Python 3.11 or newer, or downloads a private copy if the machine has none, and installs the Rema CLI into ~/.rema. It registers one UserPromptSubmit hook in Claude Code (and in Codex when Codex is installed), and builds a demo project in ~/rema-demo from public astral-sh/uv history, so there is a question you can ask right away. The hook reads .rema/evidence.dbin the project you are in and does nothing in a project without one. Rema itself sends nothing anywhere; the passages it adds become part of your prompt, so they reach your agent's model provider like anything else you type.
In a script or an agent's shell there is no terminal to ask in, so pass --yes: npx -y askrema@latest --yes. To see the exact change without writing anything, add --dry-run. After the install the same tools run from disk, with no npm and no question:
~/.rema/bin/askrema doctor # why the "Rema found" line did not appear ~/.rema/bin/askrema status # what is installed and where ~/.rema/bin/askrema uninstall # remove what the install added, and nothing else
Set up with your agent
Paste this into Claude Code or Codex. It installs Rema, shows you the plan and what changed on your machine, hands you the first “hey rema” question for the demo, and asks you before it reads any folder of yours.
# Set up Rema and get a first cited answer Rema puts what a team already wrote (issues, review threads, docs) in front of the coding agent, with a link for every passage. You are setting it up here. Do the work yourself: run the commands and check what they print. Do not just explain the steps. ## 1. Install - Run exactly: npx -y askrema@latest --yes - The installer prints its plan (every file it will create or change) and normally asks once. The trailing --yes answers that question, because your shell has no terminal to ask in. Show me the plan it printed. - It needs Node 18 or newer on macOS or Linux. It does not need sudo, an API key or Python: if there is no Python 3.11+, it downloads a private copy into ~/.rema. - The package name is askrema. Do not substitute "npx rema", "npm install rema" or "pip install rema": those are other people's packages. - Expected: lines starting "ok" (python, cli, one hook line per agent, demo, check), then "Installed in ...s". The "check" line starts "Rema found 11 passages". ## 2. Tell me what changed on my machine - ~/.rema holds the CLI. ~/rema-demo holds a demo project built from public astral-sh/uv history. - One UserPromptSubmit hook was added to ~/.claude/settings.json (and to ~/.codex/hooks.json if I use Codex, which asks me to trust the hook: /hooks). A copy of any settings file it changed is saved next to it as <name>.before-rema. The hook reads .rema/evidence.db in the project I am in and does nothing in a project that has none. Rema itself sends nothing anywhere; the passages it adds become part of my prompt, so they reach my agent's model provider like anything I type. - "npx askrema uninstall" removes all of it. ## 3. Hand over the first question The hook loads when a session starts, so it is not active in this session. Tell me to open a new terminal and run: cd ~/rema-demo/ml-service && claude and then say: hey rema, our pyproject sets index-strategy = unsafe-any-match so torch comes from the pytorch index. is that still right, and is it safe? Under the question there should be a line starting "Rema found", then an answer that cites the uv threads it came from. That is the whole interface: in any project with a Rema store, start a prompt with "hey rema," and ask as usual. There is no command to learn. ## 4. My own project (ask me first) - Ask me which folder holds what my team wrote (docs, exported threads, design notes). - From the root of my project, run: npx askrema ingest <that folder> It prints one result per file. A file the injection gate refuses is listed with the reason: show me those, and do not pass --allow-unsafe yourself. - The store is .rema/evidence.db in the project. In a new session there, say "hey rema, ..." and ask as usual. ## 5. Report - What the installer printed, which files it changed, and anything that failed, with the exact command and error. Rules: no step needs an API key, so do not set, read or copy one. Do not send any file anywhere. Do not edit my shell profile. If a step fails, stop and report it. Do not swap in a different command to make it look like it worked.
The rema CLI (optional)
You never need these to use Rema in your agent: saying “hey rema” is enough. They are for scripts, other agents and anyone who wants to see what Rema returns. The install puts the CLI at ~/.rema/bin/rema (and links rema into ~/.local/bin when that folder is on your PATH); npx askrema <command>runs the same commands. Every command below was run as written, and the output under it is that run's, trimmed.
1Read something in
A public file pinned to one commit, so you get the same bytes and the same answers.
mkdir rema-try && cd rema-try curl -sL -o CHANGELOG.md https://raw.githubusercontent.com/astral-sh/uv/bea138450f0e620a4ce5765b0e38cff7b9f0799f/CHANGELOG.md rema ingest CHANGELOG.md
"path": "CHANGELOG.md", "accepted": true, "chunks_written": 133,
2Ask, and get the source
rema search --limit 1 "which preview feature runs build backend hooks with lazy imports"
"health": "ok",
"no_match": false,
"hits": [
{
"rank": 1,
"locator": "section:Preview features@19-23",
"text": "- Run build-backend hooks with lazy imports on CPython 3.15 and later using the `build-lazy-imports` preview feature ..."
}
]The locator is where the passage lives: the section heading and the lines. Open the file and check it.
3Ask something the file cannot answer
rema search "what is the wifi password"
"hits": [], "no_match": true, "detail": "no chunk matches the content words of this question (wifi, password), and the control query 'https' did return a hit, so the index is answering. This is a real absence, not a broken index."
4Keep what the team learned
A short agent session where someone corrects the agent. On your machine, rema capture with no argument reads your own Claude Code sessions instead.
mkdir -p sessions
cat > sessions/retry-backoff.jsonl <<'EOF'
{"role": "user", "content": "the nightly sync is slow. drop the retry backoff in billing/retry.py from 30s to 5s"}
{"role": "assistant", "content": "Changed BACKOFF_SECONDS from 30 to 5.", "tool_name": "Edit", "file_path": "billing/retry.py"}
{"role": "user", "content": "no, put it back to 30. we tried 5s in march and the payment provider rate limited us for an hour. the slow part is the page size, not the backoff."}
{"role": "assistant", "content": "Reverted BACKOFF_SECONDS to 30.", "tool_name": "Edit", "file_path": "billing/retry.py"}
EOF
rema capture sessionsrema why billing/retry.py --question "can we lower the backoff"
"answered": true,
"reason": "answered from 1 recorded session(s)",
"citations": [
{
"quote": "no, put it back to 30. we tried 5s in march and the payment provider rate limited us for an hour. the slow part is the page size, not the backoff.",
"locator": "session:retry-backoff!turn:3",
"rank": 1
},
...The next person, or their agent, who asks about that file gets the correction first, quoted, with the turn it came from.
Answers and no-match
rema search returns passages, not a summary. Each hit has the exact text, a locator (a section and its lines, or a session and its turn), a rank and a score. Your agent writes the answer and cites the locator; you can always open the source.
Every search also runs a control query the index should answer. That is what makes an empty result mean something: "no_match": true is printed only when the control came back, and on an empty or broken index the result is "health": "unknown" with what to do next, never a confident zero.
What the team learns, kept
Most of what a team learns about its code is said to an agent and lost when the session ends. rema capture keeps those sessions. Each turn becomes evidence with a locator such as session:retry-backoff!turn:3, along with the files it touched, and secrets are redacted before anything is stored.
Files touched are the join key. rema why answers a question about a file from the sessions that changed it, quoting them word for word, so a fix made once reaches whoever asks about that file next.
rema capture --dry-run # what it would read, nothing stored rema capture # read it rema why billing/retry.py --question "can we lower the backoff"
Sources
Start with files. Every team's stack is different, and nearly every tool can export to one of the formats below. The connectors pull straight from a few common tools once their token is set; rema doctor says which are ready and what each still needs.
rema ingest reads Markdown, plain text, CSV, JSON, Word and Excel files as they are: a CSV row comes back as row:2, a JSON field as $[0].note. An export from a tracker, analytics or a database works the same way.
rema capture reads Claude Code session logs, and any JSONL of role and content turns. The turns become evidence like any other file.
Issues and pull requests that match a search, with GITHUB_TOKEN set. Review comments are not read yet.
Messages that match a search, from channels the bot can read, with SLACK_BOT_TOKEN set.
Jira issues from a JQL query and Confluence pages from a CQL query, starting with ATLASSIAN_SITE.
Notion pages that match a search, and the components of a Figma file, with NOTION_TOKEN or FIGMA_TOKEN set.
CLI reference
rema ingest <path>Read a file or a folder into the index at .rema/evidence.db. Prints what was accepted, how many chunks were written, and anything it set aside and why.
rema search <query>Answer from the index. Each hit carries the exact text and a locator saying where it lives. With nothing relevant it prints "no_match": true, and only after a control query proved the index is answering.
rema capture [dirs]Read agent session logs into the index, redacting secrets by default. With no directory it looks in ~/.claude/projects. --dry-run lists what it would read. Running it twice stores nothing twice.
rema why <file> --question <text>Answer from the sessions that touched a file, quoting their turns exactly. Exits 3 when no recorded session touched it.
rema sessionsList the captured sessions with their turns, the files they touched and the tools they used.
rema pull <source> <query>Fetch from GitHub, Slack, Jira, Confluence, Notion or Figma into the index. With the source's token missing it says which variable to set, exits 2 and writes nothing.
rema doctorReport which sources and model providers are set up and what each still needs. It exits 1 when no model provider is set; add --allow-baseline, since search, capture and why need none.
FAQ
Is this for my team?
If the context is already written down somewhere (tickets, pull requests, docs, chat threads) but was never organized for an LLM, yes. Rema reads it as it is, from the tools above or any file export, and keeps where every piece came from. There is no reorganization project first.
Does it need a model or an API key?
No. The install, the prompt hook, ingest, search, capture and why run on your machine with no key. The agent you already use brings the model; Rema brings the sources.
Which agents does it work with?
Claude Code or Codex: the install adds Rema's prompt hook to both, so you say "hey rema, ..." and ask as usual. Codex asks you to trust a new hook once (type /hooks). Cursor is not supported yet. Any other agent that can run a shell command can call the rema CLI directly. rema capture reads Claude Code session logs, and any JSONL of role and content turns; it does not read Codex's own session files yet.
Does anything leave my machine?
Rema itself sends nothing: the index is a SQLite file in .rema/ in your project, and the hook reads it locally. The passages it adds become part of your prompt, so they reach your agent's model provider like anything else you type. rema pull talks to the source you name, with the token you gave it.
What happens when nothing matches?
When no passage shares the question's words, search prints "no_match": true, after a control query proved the index is answering. That holds on small corpora like the quick start's. On a large corpus most questions share some words with something, so search returns its best-ranked passages anyway: read them, or let the agent judge whether they answer the question. Retrieval is lexical today.
What is kept from an agent session?
The session itself. After rema capture, each turn is evidence with a locator like session:retry-backoff!turn:3, and search and why quote it word for word. The next person who asks about that file gets the correction first, with where it came from.
How do I start over?
Delete the .rema/ directory in the project. It holds that project's index. npx askrema uninstall removes the install itself.
How do I get it?
Run npx askrema@latest (see Install), then say "hey rema, ..." in Claude Code or Codex. The hosted console is in a closed pilot: join the waitlist on the pilot page.