Blog · 2026-08-01

Run ErrLookup on your own internal repositories

The public dataset covers open-source libraries, but the architecture was built for a stricter environment: yours. The pipeline is a local CLI, the dataset is a directory of static JSON, and nothing in between needs a backend — which means your private code never has to leave your infrastructure.

The shape of a self-hosted deployment

PipelineA pnpm workspace CLI you run on any box with git and Node 20+. State lives in a local SQLite file.
LLM providerA pluggable subprocess. Use a vendor CLI you already pay for, or an ACP-speaking agent in front of a local model — the pipeline never calls a metered API SDK directly.
DatasetVersioned static JSON. Serve it from an internal S3 bucket, nginx, or your intranet's static host — anything that can serve files over HTTPS.
ConsumersThe MCP server reads ERRLOOKUP_BASE_URL; point it at your internal host and every engineer's coding agent answers from your private knowledge base.

Setup in five steps

1. Clone and install.

git clone https://github.com/standardbeagle/err-lookup
cd err-lookup && pnpm install

2. Configure a provider in errlookup.config.kdl. Any agent CLI works; here is an ACP provider pinned to a model:

provider "agent" {
    command "opencode"
    args "acp" "--pure"
    type "acp"
    model "your-provider/your-model"
    timeout-ms 600000
}
defaults { primary "agent" }

3. Analyze repositories. One at a time, or a batch file with one owner/repo per line (clones use your ambient git credentials, so private remotes just work):

pnpm --filter @errlookup/pipeline dev analyze your-org/payments-service
pnpm --filter @errlookup/pipeline dev batch internal-repos.txt

4. Export. Atomic, validated, versioned:

pnpm --filter @errlookup/pipeline dev export

The output directory (packages/site/public/data) is the entire contract — copy it to your internal static host as-is. Build the browsable site around it with pnpm --filter @errlookup/site build if you want pages, or skip it: the JSON alone serves agents.

5. Point the MCP server at it.

{
  "mcpServers": {
    "errlookup-internal": {
      "command": "npx",
      "args": ["-y", "@standardbeagle/errlookup-mcp"],
      "env": { "ERRLOOKUP_BASE_URL": "https://errors.intranet.example.com" }
    }
  }
}

Operating it unattended

Everything is built for cron: runs are idempotent and resume at the first incomplete phase, exports never publish partially, a circuit breaker halts a batch when the provider quota trips, oversized clones are skipped before any model spend (ERRLOOKUP_MAX_CLONE_MB), and scheduled runs refuse to start below a free-disk floor (ERRLOOKUP_MIN_FREE_GB). Our own scanner is a nightly cron job on a spare machine.

Why teams do this

Internal platform libraries throw internal errors, and the engineer who understands ERR_LEDGER_STALE_SNAPSHOT left two years ago. Analyzing your own repos turns that tribal knowledge into something a new hire's coding agent can answer at 2 a.m. — with a link to the exact line that raised it, at the exact commit that shipped.

Read how the scanner works