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
| Pipeline | A pnpm workspace CLI you run on any box with git and Node 20+. State lives in a local SQLite file. |
| LLM provider | A 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. |
| Dataset | Versioned static JSON. Serve it from an internal S3 bucket, nginx, or your intranet's static host — anything that can serve files over HTTPS. |
| Consumers | The 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.