Features
Seven Scanners. One Dashboard. Zero Third-Party Tenants.
Snyk and Mend charge $25–50 per developer per month and ship your findings to a third-party cloud. Aegis runs entirely inside the Renkara perimeter — wrapping Semgrep, Bandit, pip-audit, Safety, detect-secrets, Checkov, and Trivy under one fleet-native FastAPI backend and a WebSocket-driven React dashboard. Every scanner normalizes to a single Finding schema with severity, CWE identifier, source location, fix guidance, and a content-addressable dedup hash so re-scanning the same code never creates duplicate rows. New HIGH and CRITICAL findings auto-open Docket cards on the responsible team’s board. A nightly advisory sync mirrors GitHub Advisory and OSV into Postgres so SCA lookups never call home at scan time. From push to triaged defect: under two minutes.
Scanner Stack
Best-in-Class Open Source, Unified Under One API
Semgrep — Multi-Language SAST
Semgrep runs pinned rule snapshots from
backend/rules/semgrep/against every language in the fleet. Rules never pull from the network at scan time — supply-chain hygiene is enforced at the scanner level, not as an afterthought.Bandit — Python-Specific SAST
Bandit catches Python-specific vulnerabilities — SQL injection via string formatting, insecure
subprocesscalls, hardcoded passwords, weak cryptography — with AST-level precision that generic SAST misses.pip-audit & Safety — Python SCA
Two complementary dependency scanners: pip-audit queries the OSV mirror (
--vulnerability-service=osv, no PyPI calls) while Safety cross-references its own advisory database. Both scanners normalize CVE severity and fix versions into the unifiedFindingschema.detect-secrets — Secrets Scanner
Detects hardcoded API keys, tokens, private keys, and high-entropy strings across every file in the repository. Findings include the file path, line number, and secret type — never the secret value itself.
Checkov — IaC Scanner
Scans Terraform, CloudFormation, Kubernetes manifests, and Dockerfiles for misconfigurations — public S3 buckets, open security groups, missing encryption-at-rest, root container execution — with CWE and severity mapped to the unified schema.
Trivy — Container & Filesystem Scanner
Trivy is the Go binary exception in an otherwise Python stack, pinned via
ARG TRIVY_VERSIONin the Dockerfile from a versioned release tarball (not the floating apt repo). Scans container images and filesystem paths for OS and library CVEs, exposed secrets, and IaC misconfigurations.Sandboxed Subprocess Execution
Every scanner runs as a non-root user inside a per-scan
tmpfsworking directory with no network egress except to the local advisory mirror. Output is parsed from JSON stdout; the scanner process state is never trusted. A compromised rule cannot escape the scan boundary.
Findings Model
One Schema to Rule All Seven Scanners
Unified Finding Schema
Every scanner normalizes to a single
Finding:scanner,rule_id,severity(CRITICAL / HIGH / MEDIUM / LOW / INFO),cwe,file_path,line_range,code_context,fix_guidance, anddedup_hash. The triage dashboard, Docket integration, and MCP tools all speak this one type.Content-Addressable Deduplication
The dedup hash is
sha256(scanner | rule_id | file_path | normalized_code_context | severity). Re-scanning the same code never creates duplicate finding rows — the existing row is updated in place and its status is preserved. Sprint-over-sprint false-positive noise is eliminated at the data layer.Finding Lifecycle & Audit Trail
Every finding transitions through
open → in_progress → resolved(orsuppressed). Every status change is recorded as afinding_eventwith actor, timestamp, and optional note. The full audit trail is queryable via the dashboard and MCP tools.Severity & CWE Mapping
Severity is normalized to a common five-level scale regardless of source scanner. CWE identifiers are mapped where the scanner provides them (Semgrep, Bandit, Checkov) and inferred from rule metadata where they don’t. Findings are filterable and sortable by both dimensions.
Suppression with Expiry
Risk-accept a finding with a written justification, an approver, and a mandatory expiration date. Expired suppressions automatically reopen to
openstatus. Every suppression and re-open is recorded in the audit trail — no finding ever silently disappears.
Vulnerability Database
Local Mirror, Sub-Second Lookups, No Calls Home
GitHub Advisory + OSV Nightly Sync
A nightly cron job syncs the full GitHub Advisory Database and OSV (Open Source Vulnerabilities) corpus into the local Postgres instance. SCA scanners look up CVE → severity → fix version entirely locally. No per-scan calls to external APIs — air-gapped scans work the same day as networked ones.
Sub-Second Advisory Lookups
The local advisory tables are indexed on package name, ecosystem, and CVE ID. A full Python dependency tree lookup across hundreds of packages completes in under 50 ms. There is no spinner waiting for a third-party SCA API to respond.
SBOM Export (CycloneDX 1.5)
Export a CycloneDX 1.5 software bill of materials for any registered repo via
GET /api/v1/repos/{id}/sbom?format=cyclonedx. SBOMs are generated from the most recent SCA scan results and the live advisory table, so every component entry includes its current CVE status.
Fleet Integrations
Docket, GitHub, Vigil — Wired at the Finding Level
Auto-Filed Docket Defects
When a scan surfaces a new HIGH or CRITICAL finding, Aegis opens a Docket card on the responsible team’s board automatically — no human triage step required. The card includes scanner, rule, severity, CWE, file location, and a link back to the finding in the Aegis dashboard. A finding resolved in Aegis closes the Docket card.
GitHub App Integration
Repo access runs through a GitHub App (not personal tokens). App ID and private key live in SSM; installation IDs are stored per workspace. Scans trigger automatically on push and pull request. PR scan results post as inline review comments with remediation hints directly in the diff view.
Per-Repo Scan Policies
Each registered repo carries a scan policy: which of the seven scanners run, the minimum severity floor for findings (suppress INFO-only noise on low-risk repos), an allowlist of known-false-positive rule IDs, and SLA windows (HIGH must be resolved in N days). Policy evaluation runs at normalization time, before findings are persisted.
MCP Tool Surface
Every Aegis operation is exposed as an MCP tool at
/mcp(Streamable HTTP) with a stdio bridge for direct Claude Code registration. Register repos, trigger scans, list findings, update finding status, suppress with justification, export SBOMs, and query the vulnerability database — all from a Claude Code agent or any MCP-compatible client.
Triage Dashboard
Real-Time Severity Heatmaps, Repo Leaderboards, Trend Lines
WebSocket-Driven Status Board
The React dashboard opens a WebSocket to the backend. Scan progress streams in real time — per-scanner status, finding counts as they land, completion events. No polling, no manual refresh. A scan started from the dashboard or a GitHub push event is visible on-screen within seconds.
Severity Heatmaps
Fleet-wide and per-repo severity heatmaps show the distribution of CRITICAL / HIGH / MEDIUM / LOW / INFO findings over time. Spot which repos are trending worse and which remediation sprints are actually moving the needle.
Repo Leaderboards
Repos ranked by total open HIGH+CRITICAL count, by findings-per-KLOC, and by mean-time-to-resolve. The leaderboard surfaces the highest-risk repos in the fleet without requiring anyone to manually aggregate scanner output.
Finding Detail & Inline Triage
Each finding opens a detail view with full code context, CWE description, fix guidance from the scanner, CVE advisories from the local mirror, and the full status history. Triage actions — assign, transition status, suppress with justification — execute without leaving the finding page.
Light & Dark Mode
Full CSS custom-property theming with light, dark, and system modes. Severity badges, heatmap cells, and status indicators maintain WCAG 2.1 AA contrast ratios in both themes. The dashboard is usable on a laptop at 2 AM without eye strain.
Infrastructure
Self-Hosted, Fleet-Native, No Third-Party Tenant
Worker Pool & NATS JetStream
Scan requests enqueue NATS jobs under the
aegis.scan.*subject prefix. A dedicated worker pool pulls jobs, fans out to per-scanner subprocesses, normalizes results, persists findings with dedup-aware upserts, and publishes a completion event back over NATS for the WebSocket layer. The FastAPI request loop is never blocked.Shared Fleet Infrastructure
Aegis runs on the shared fleet stack: PostgreSQL (shared RDS, dedicated
aegisdatabase), Valkey cache with theaegis:key prefix, and NATS fromtools/supporting-services/. No per-tool infrastructure to provision or maintain. New repos are registered via a single API call.
Accessibility
Built for Everyone
WCAG 2.1 AA Compliance
4.5:1 contrast for body text, 3:1 for large text and UI components, in both light and dark themes.
Keyboard Navigation
Every interaction reachable via keyboard. Logical tab order, visible focus indicators, Escape-to-dismiss for modals.
Screen Reader Support
VoiceOver, NVDA, and JAWS tested. Semantic HTML, ARIA labels, live regions for dynamic updates.
Reduced Motion
Respects
prefers-reduced-motion. Usable at 200% zoom. Touch targets meet 44x44 minimum.
How It Works
From Push to Triaged Defect
Step 1: Trigger
A GitHub push or pull-request event fires the GitHub App webhook. Aegis enqueues a scan job on NATS. Manual scans are triggered via the dashboard UI or the
aegis_trigger_scanMCP tool.Step 2: Scan
A worker pulls the job, fans out to all seven scanners (Semgrep, Bandit, pip-audit, Safety, detect-secrets, Checkov, Trivy) in isolated sandboxes. Each scanner runs as a non-root subprocess in a tmpfs directory with no network egress. Output streams back as JSON.
Step 3: Normalize & Persist
Per-scanner normalizers map raw JSON to the unified
Findingschema — severity, CWE, location, fix guidance, dedup hash. Findings are upserted: new findings are created; re-discovered findings update in place with status preserved. A completion event fires over NATS to the WebSocket layer.Step 4: Triage & Integrate
New HIGH and CRITICAL findings auto-open Docket cards on the responsible team’s board. PR scans post inline review comments. The triage dashboard updates in real time — severity heatmaps, repo leaderboards, and finding queues reflect the new scan within seconds of completion.
Technical Specifications
Under the Hood
Backend
- FastAPI (Python 3.12+)
- FastMCP for the MCP tool surface (
/mcpStreamable HTTP + stdio bridge) - SQLAlchemy 2.0 async + asyncpg
- PostgreSQL (shared RDS, dedicated
aegisdatabase) - Valkey cache — prefix
aegis:(shared, port 6380) - NATS JetStream — subject prefix
aegis.scan.* - APScheduler for nightly advisory sync (GitHub Advisory + OSV)
- Alembic migrations
- structlog structured logging
- 80% coverage gate per module; scanner integration tests run nightly against fixture repos
Frontend
- React 19 + TypeScript 5.6 (strict) + Vite 8
- Single bidirectional WebSocket — real-time scan progress and finding updates
- @avian/design-system tokens, components, and Tailwind preset
- @avian/auth-react 0.1.4 (OIDC via auth.renkara.com)
- Recharts for severity heatmaps, trend lines, and repo leaderboards
- Framer Motion 11 for transitions
- Light and dark mode (WCAG 2.1 AA in both)
Scanners
- Semgrep — multi-language SAST, pinned rule snapshots, LGPL 2.1
- Bandit — Python SAST, AST-level, Apache 2.0
- pip-audit — Python SCA via OSV mirror, Apache 2.0
- Safety — Python SCA, advisory cross-reference, MIT
- detect-secrets — secrets and high-entropy string detection, Apache 2.0
- Checkov — IaC (Terraform / CloudFormation / K8s / Dockerfile), Apache 2.0
- Trivy — container + filesystem CVE scan, Go binary, Apache 2.0
- All scanners run non-root in per-scan tmpfs with no outbound network
Integrations
- GitHub App (App ID + private key in SSM, installation IDs per workspace)
- Automatic scan on push and pull request
- Inline PR review comments with remediation hints
- Docket — auto-filed defect cards for HIGH + CRITICAL findings
- MCP (FastMCP) — full operation surface for Claude Code agent use
- CycloneDX 1.5 SBOM export per repo
- Local GitHub Advisory + OSV mirror (nightly sync, no per-scan egress)
Infrastructure
- Backend pipeline:
aegis(CodePipeline → CodeBuild → ECR → SSM deploy) - Frontend pipeline:
aegis-frontend(S3 bucket:aegis-frontend-production) - API domain:
aegis-api.renkara.com - Frontend domain:
aegis.renkara.com - ECR repo:
aegis - SSM secret prefix:
/renkara/aegis/ - Auth: mTLS via
renkara-tools-alb(prod) — JWT / API key fallback
- Backend pipeline:
Development
100% Built by Claude
Every tool in the Renkara fleet was built by Claude (Anthropic) working alongside a single human supervisor. Every line of code, every test, every deployment: AI-authored with human direction. The leverage factor across the fleet runs in the 20x–50x range, with individual sessions regularly exceeding 100x.
See the daily leverage records for per-task numbers across the full build history.