Multi-tenant by design
Every org gets isolated resources, API keys, custom rules, and billing — one deployment serves many teams. Register an org, get a session or an API key, and everything downstream is automatically scoped to it.
Pick the path that matches what you’re trying to do — everything else in these docs is organized around these four.
Multi-tenant by design
Every org gets isolated resources, API keys, custom rules, and billing — one deployment serves many teams. Register an org, get a session or an API key, and everything downstream is automatically scoped to it.
Server-side or client-led analysis
Let the server call the LLM itself (POST /{analyzer}/{namespace}/analyze, one call in — a report out) or drive the ingest → analyse → submit loop yourself from any MCP client. Same data model either way.
Analyzer-agnostic core
The core model — AnalysisUnit, Finding — is analyzer-agnostic and ships with no built-in analyzers. Anything that can be split into independently-analysable units (Terraform, Ansible, Packer, Kubernetes manifests, …) is a self-contained plugin package, discovered at startup via a Python entry point.
Findings triage & cost control
Suppress, acknowledge, or mark a finding a false positive — it stays that way across re-scans and reports reflect it automatically. Cap an org’s monthly LLM spend and every analysis path (including webhook-triggered runs) is enforced against it, hard, before any LLM call.
GitHub App built in
Install the GitHub App on a repo and every PR gets analysed automatically — no CI workflow to write. The diff is analysed server-side and the result posted back as a PR comment plus a commit status.
No duplicate LLM calls
Units are keyed by SHA-256 of their normalised body, per org. The same module referenced across dozens of namespaces is analysed once and reused — cuts token spend and run time proportionally.
b7e4a1f9| Analyzer(s) | terraform-plan |
| Generated | 2026-07-31T09:12:00Z |
| Resources analysed | 3 |
2 finding(s) across 3 resource(s) — 1 critical, 1 high, 0 medium, 0 low, 0 info.
| Title | Severity | Resource | Status |
|---|---|---|---|
| Trust policy allows any AWS principal to assume this role | CRITICAL | aws_iam_role.ci_deploy | OPEN |
| Storage encryption disabled on a new database instance | HIGH | aws_db_instance.orders | OPEN |
aws_iam_role.ci_deploy: Trust policy is far too permissive — fix before this ships.aws_db_instance.orders: New instance created without encryption at rest.aws_lambda_function.webhook_handler: No issues found.aws_iam_role.ci_deployupdateCRITICAL — Trust policy allows any AWS principal to assume this role
Principal down to the specific OIDC provider/account ARN your CI actually uses."Principal": {"AWS": "*"}aws_db_instance.orderscreateHIGH — Storage encryption disabled on a new database instance
storage_encrypted = true (requires recreation if applied to an existing instance).storage_encrypted = falseaws_lambda_function.webhook_handlercreateNo findings.
Generated by OpenTremor — analyzer: terraform-plan, namespace: b7e4a1f9
Every finding carries a persistent triage status — suppress one via PATCH /findings/{resource_hash}/{rule_id} and it disappears from future reports automatically. See Findings.
One call, server-side
POST /{analyzer}/{namespace}/analyze with the raw input, an LLM backend/model, and either an inline API key or a stored org credential. Small inputs return the report directly; larger ones return a job to poll. The GitHub App uses this path internally.
Client-led loop
Ingest, then loop GET /{namespace}/resource/next → analyse → PUT /resource/{hash}/analysis yourself — from a curl script, the bundled example agent script, or any MCP-compatible client (Claude, Continue, Cursor). Full control over the LLM call.
In-Memory
Zero config. Start the server and go — state lives in-process. Perfect for local dev and short-lived CI jobs.
MongoDB
Persistent, multi-tenant storage: orgs, users, API keys, custom rules, LLM credentials, findings, billing usage — all org-scoped, with TTL-indexed telemetry.
Docker
Single-VM Compose stack or a Kubernetes Helm chart — see Deployment.
GitHub App
Install once per org, then every PR is analysed automatically — no CI workflow, no agent to configure. See GitHub App integration.