npm v0.3.0 MIT open source Claude · Ollama · GitHub Actions

Can you explain your AI's own code?

repo-interview reads your repository or pull request and asks what an interviewer or reviewer would. Every question cites real code, and a verifier throws out any question about code that doesn't exist.

  • Self-hosted: your laptop, your server or your CI
  • Open source, MIT licensed
  • No account, no telemetry, no API key needed
  • Claude, Ollama or any OpenAI-compatible model
claude mcp add repo-interview -- npx -y repo-interview mcp

Then ask Claude: “interview me about this repo”.

real run · qwen2.5-coder:3b · Nov 2026

        
Replayed from real runs on ky and express
90.7%
of questions cite real code (strict, 3-run average)
10
public repos in 10 languages, measured
3
ways to use it: Claude, terminal, GitHub Action
$0
free and local by default, no API key
Three ways in

Use it where you already work

Same engine everywhere: scan the code, ask about it, check every citation before you see the question.

Terminal · free and local

Your code stays on your machine

Runs on a small model with Ollama, or any OpenAI-compatible server you host (vLLM, LM Studio) with --provider openai --base-url. 8 questions, a follow-up after a weak answer, then a report of what to study. New in 0.3.0: predict questions (“what will this return?”) built from your own tests, so the right answer comes from a real assertion.

ollama pull qwen2.5-coder:3b
npx repo-interview interview . \
  --provider ollama \
  --model qwen2.5-coder:3b
GitHub Action · for teams

Three questions on every PR

Free Ollama on the runner, no API key. Advisory only: it never blocks a merge. Authors can reply with numbered answers to get a score.

- uses: actions/checkout@v7
  with:
    fetch-depth: 2
- uses: Blhasn-Sehli/repo-interview@main
The verifier

Questions about code that exists. Only.

Can you explain the main components of the Express.js application and how they interact?
keptlib/application.js › init
How does Express.js handle errors, and what is the role of middleware in this process?
keptlib/application.js › error
What is the purpose of the Router class in Express, and how can it be used to handle different routes?
droppedlib/router.js › handler
file not found: lib/router.js

These three came from one real run on express. The third sounds right: older Express had a lib/router folder. Today's Express moved its router into a separate package, so the file the model cited doesn't exist.

A model that invents a citation would quiz you on code you don't have. repo-interview checks every cited file and symbol against the repository and drops the question before you see it. For pull requests, the cited file must also be one the PR changed.

Two checks, both reported: strict (exactly as written) and fair (also accepts a path without its folders when only one file matches, and Class::method).

On pull requests

What the Action posted on a real PR

From repo-interview #1, which made the CLI reject bad --count values. 86 seconds on the GitHub runner, including installing Ollama and the model.

github-actionsbotcommented

🧠 repo-interview: questions about this change

  1. [big picture] What is the purpose of the wholeNumber function and how is it used in this change?
    packages/cli/src/index.ts › wholeNumber
  2. [code] How does the genOpts function now handle validation and type checking of the count and overview options?
    packages/cli/src/index.ts › genOpts
  3. [code] What error is thrown if the --count option is less than the --overview option, and why is this validation necessary?
    packages/cli/src/index.ts › generateDiffQuestions
Advisory only: this never blocks the PR. Every question cites a file this PR changed, checked to exist.
Measured, not claimed

How often questions cite real code

10 public repositories in 10 languages, 8 questions each, the small local model qwen2.5-coder:3b, averaged over 3 runs. The verifier drops the rest before you see them.

Every model reply is recorded, so anyone can recheck these numbers offline. Not measured yet: how well grading agrees with a human, and how useful testers find the questions. Method and per-repo results.

Strict check (exact path and symbol)90.7%
Fair check (folder-less paths, Class::method)92.8%
Invented citations shown to you0

Single runs ranged 86.3–95.8% strict and 90.0–95.8% fair.

Untrusted code, handled as data

Built for code you didn't write

Never runs repo code

Files and diffs are read as text. The prompts tell the model they are data, not instructions.

Stays inside the project

The MCP tools refuse absolute paths and anything outside the project folder, symlinks included.

Safe PR comments

HTML is escaped and @mentions broken, so a hostile diff can't make the bot ping or inject anything.

Never blocks a merge

Failures become warnings. Scoring reads the PR's code in a separate folder and never executes it.

Open source

MIT licensed, built in the open

Issues, ideas and pull requests are welcome. Every number on this page can be rechecked from the repository, and so can every change.

AI-assisted contributions are welcome on one condition: you understand every line you submit. Fittingly, that's what this project is for.

Try it on your own code

One line to add it to Claude. Then ask it to interview you.

claude mcp add repo-interview -- npx -y repo-interview mcp