OSCAL-native, local-first GRC platform. Attesting treats governance, risk, and compliance as one connected graph — controls, evidence, risks, and threats all flow through a single SQLite database and propagate to each other as state changes.
Attesting is a CLI + Web UI + HTTP API for teams that need to satisfy multiple compliance frameworks without spreadsheets. You import control catalogs (NIST 800-53, ISO 27001, CMMC, SIG, 10+ more), write implementation statements once, and they resolve across every mapped framework. Evidence moves through a lifecycle state machine. Compliance scores recompute when implementations or evidence change. A drift scheduler watches the graph and raises alerts when something slips. Audit-ready PDF/DOCX reports ship with one command.
Everything runs locally against a single SQLite file. No cloud dependency, no account required, no proprietary lock-in. OSCAL 1.1.2 is the native data model.
- 14 bundled catalogs — NIST 800-53 (+4 baselines), 800-171, CSF 2.0, 800-218, ISO 27001, CMMC 2.0, HIPAA, SOC 2, PCI DSS 4.0, GDPR, CCPA/CPRA, EU AI Act, NISPOM
- 282 pre-resolved cross-framework mappings — write once, satisfy many
- Compliance scoring engine (Phase 8A) — weighted three-factor formula with per-family breakdown and time-series history
- Executive dashboard (Phase 8B) — single-call aggregated posture summary with gauge, trend, risk, drift, POA&M widgets; printable board handouts
- Audit-ready reports (Phase 8C) — professional PDF and DOCX generators with cover, control inventory, risk summary, methodology appendix
- Continuous monitoring (Phase 8D) — threshold, delta, and trend alerting wired into the drift scheduler
- Evidence lifecycle (Phase 8E) — strict state machine (draft → submitted → reviewed → accepted → expiring → expired → archived), reviewer workflow, renewal reminders, version chaining
- 11 connector adapters — CISA KEV, NIST NVD, SBOM (CycloneDX + SPDX), CrowdStrike, ServiceNow, Jira, Splunk, Okta, Azure AD, AWS Security Hub, GCP SCC
- Drift detection engine — 8 scheduled checks for evidence staleness, policy reviews, risk exceptions, disposition expiry, posture monitor, evidence expiry sweep
- Propagation engine — state changes cascade automatically (implementation change → risk recalc → score snapshot → alert)
- CLI + Web UI + HTTP API — every capability available in all three surfaces
- 664 tests, 100% pass rate — across 71 files
npm install -g attesting # requires Node 20+
attesting org init --name "Acme Corp"
attesting scope create --name "Production" --type product
# Import a bundled framework
attesting catalog import --format oscal \
--file data/catalogs/nist-800-53-r5.json \
--name "NIST SP 800-53 Rev 5" --short-name nist-800-53-r5
# Check coverage
attesting score show --catalog nist-800-53-r5 --scope Production
# Start the web UI + API
attesting serve --port 3000
# → browse http://localhost:3000 for the dashboard
# → http://localhost:3000/api/docs for Swagger UIEvery command supports --json for machine-readable output. Run attesting <group> --help for full details.
catalog import— import a catalog (OSCAL JSON, SIG .xlsm, CSV)catalog list— list all imported catalogscatalog inspect— show catalog contents + control countcatalog diff— compare two catalog versionscatalog impact— impact analysis for catalog updatescatalog update— update catalog from sourcecatalog refresh— re-import catalog from its original filecatalog watch— register a catalog source for update notifications
mapping create— create a single control-to-control mappingmapping import— bulk import mappings from CSVmapping list— list mappings with filtersmapping resolve— resolve direct + transitive mappings for a controlmapping auto-link— suggest mappings via similarity
impl add— add an implementation statementimpl edit— edit an implementationimpl list— list implementations with filtersimpl status— coverage summary for a scopeimpl import— bulk import implementations from CSV
risk create— create a riskrisk list— list risks with filtersrisk update— update a riskrisk link— link controls to a riskrisk exceptions— manage risk exceptionsrisk matrix— view/update the risk matrix
score show— show current score for a catalog + scopescore snapshot— persist a new snapshotscore history— show score trend over timescore summary— cross-catalog summary for a scope
evidence list— list evidence with status/implementation filtersevidence show— detail + full state historyevidence create— add a new evidence artifact (starts as draft)evidence transition— apply a state machine action (submit/review/accept/reject/renew/archive)evidence freshness— cross-catalog freshness summary
monitor status— current posture findings across all catalogsmonitor check— run the posture monitor on demandmonitor configure— set per-scope/catalog thresholdsmonitor thresholds— list or resolve configured thresholds
report audit— generate an audit-ready PDF or DOCX report
intel list— list threat inputsintel submit— submit manual intelintel promote— promote provisional intel to confirmedintel corroborate— auto-corroborate against threat feedsintel shadow— show shadow impact of hypothetical intel
drift list— list open drift alertsdrift check— run a named drift checkdrift dispose— create a disposition for an alertdrift tasks— list disposition tasksdrift schedule— view or update the drift check schedule
connector add— register a connectorconnector list— list configured connectorsconnector sync— trigger a syncconnector log— show sync logsconnector health— run a health check
export pdf— generic PDF export (for audit reports usereport audit)export csv— flat CSV with implementations + mappingsexport oscal— OSCAL JSON (component-definition, SSP)export sig— SIG questionnaire response workbookexport soa— ISO 27001 Statement of Applicability workbook
assessment create— create a new assessmentassessment evaluate— evaluate an assessment against implementationsassessment poam— generate POA&M items from unmet results
org init— initialize your organization profilescope create/scope list— manage product/system scopes
setup— interactive onboarding wizardserve— start the web UI + HTTP API
The Express API exposes every domain as a REST namespace. Start the server with attesting serve and browse:
http://localhost:3000/api/docs— Swagger UI with all 77 paths documented (OpenAPI 3.1)http://localhost:3000/api/docs/openapi.json— raw spec
Mounted namespaces:
| Namespace | Domain |
|---|---|
/api/org |
Organization profile + scopes |
/api/catalogs |
Framework catalogs + controls (FTS) |
/api/mappings |
Cross-framework mappings |
/api/implementations |
Implementation statements |
/api/coverage |
Per-catalog coverage aggregates |
/api/governance |
Policies, committees, roles |
/api/risk |
Risk register, matrix, exceptions |
/api/intel |
Threat inputs + manual intel |
/api/drift |
Drift alerts + dispositions |
/api/assets |
Asset inventory |
/api/connectors |
Data connectors + adapters |
/api/owners |
Owner/person directory |
/api/audit |
Immutable audit trail |
/api/export |
CSV/OSCAL/SIG/SOA/PDF export |
/api/diff |
Catalog diff |
/api/scores |
Compliance scoring (Phase 8A) |
/api/dashboard/summary |
Executive dashboard (Phase 8B) |
/api/reports/audit |
Audit-ready PDF/DOCX (Phase 8C) |
/api/monitoring |
Continuous monitoring (Phase 8D) |
/api/evidence |
Evidence lifecycle (Phase 8E) |
Global rate limit: 100 requests / 60 seconds. Errors use a consistent { error, code, status, details?, stack? } envelope.
React 19 + Tailwind + Recharts dashboard, served at http://localhost:3000/ when attesting serve is running. Pages:
- Dashboard — executive summary with score gauge, per-framework bars, trend, risk posture, drift alerts
- Catalogs / Controls — browse imported frameworks
- Implementations — edit implementation statements
- Mappings — explore cross-framework relationships
- Risk — register, matrix, exceptions
- Assets — inventory + threat correlation
- Intel — threat inputs + manual intel with shadow analysis
- Drift — alert feed + disposition workflow
- Connectors — configure + trigger adapters
- Governance — policies, committees, roles
- Evidence — lifecycle queue with status badges + inline transitions
- Exports — one-click exports + audit report generator
Attesting stores all state under ~/.attesting/:
~/.attesting/attesting.db— the SQLite database (schema + 6 migrations)~/.attesting/exports/— generated export files~/.attesting/reports/— generated audit reports~/.attesting/uploads/— staged import files
Environment variables:
NODE_ENV— set toproductionto suppress stack traces in error responses
Node ≥20 required.
Local-first. Single SQLite file, no external services required. Schema defined in src/db/schema.sql + numbered migrations under src/db/migrations/ (006 and counting).
Propagation engine (src/services/propagation/) — every write passes through a dispatcher that routes to entity-specific handlers. Evidence changes trigger score recalculation. Implementation status changes trigger risk recalculation. Handler errors are caught per-handler so one bad cascade can't crash the caller.
Drift scheduler (src/services/drift/scheduler.ts) — runs 8 periodic checks: evidence staleness (5min), policy reviews (hourly), risk exceptions (hourly), disposition expiry (hourly), manual intel expiry (hourly), posture monitor (hourly), evidence expiry sweep (hourly), full posture recalc (daily).
Connector adapters (src/services/connectors/adapters/) — each inbound adapter extends BaseAdapter with fetch() + transform(). All HTTP calls go through fetchWithTimeout with configurable per-connector timeouts (default 30s). Credentials validated at construction.
| Catalog | Short name | Source format |
|---|---|---|
| NIST SP 800-53 Rev 5 (full) | nist-800-53-r5 |
OSCAL JSON |
| NIST 800-53 Low baseline | nist-800-53-r5-low |
OSCAL JSON |
| NIST 800-53 Moderate baseline | nist-800-53-r5-moderate |
OSCAL JSON |
| NIST 800-53 High baseline | nist-800-53-r5-high |
OSCAL JSON |
| NIST 800-53 Privacy baseline | nist-800-53-r5-privacy |
OSCAL JSON |
| NIST SP 800-171 Rev 3 | nist-800-171-r3 |
OSCAL JSON |
| NIST Cybersecurity Framework 2.0 | nist-csf-2.0 |
OSCAL JSON |
| NIST SP 800-218 (SSDF) | nist-800-218 |
OSCAL JSON |
| CMMC 2.0 Level 2 | cmmc-2.0 |
CSV |
| ISO/IEC 27001:2022 | (bring your own) | CSV |
| HIPAA Security Rule | hipaa-security |
CSV |
| SOC 2 Trust Services Criteria | soc2-tsc |
CSV |
| PCI DSS 4.0 | pci-dss-4 |
CSV |
| GDPR | gdpr |
CSV |
| CCPA / CPRA | ccpa-cpra |
CSV |
| EU AI Act | eu-ai-act |
CSV |
| NISPOM 32 CFR 117 | nispom-117 |
CSV |
| SIG Lite 2026 | (bring your own .xlsm) | SIG XLSM |
Copyrighted framework text (SIG questions, ISO 27001 control bodies) is not shipped. Bring your own licensed source file and Attesting imports only the structural metadata.
| Adapter | Connects to | Auth |
|---|---|---|
| CISA KEV | Known Exploited Vulnerabilities feed | none (public) |
| NIST NVD | National Vulnerability Database | optional API key |
| SBOM CycloneDX | CycloneDX SBOM files | file-based |
| SBOM SPDX | SPDX SBOM files | file-based |
| CrowdStrike Falcon | Detections API | OAuth2 client credentials |
| ServiceNow | Incident / Security Incident table | Basic auth |
| Jira | Issues via JQL search | Basic auth + API token |
| Splunk | Search API (async jobs) | Bearer token |
| Okta | System Log | SSWS API token |
| Azure AD / Entra ID | Identity Protection risk detections | OAuth2 client credentials |
| AWS Security Hub | GetFindings (ASFF) | SigV4 |
| GCP Security Command Center | Findings API | Service-account JWT |
All adapters: fail-fast credential validation on construction, 30s fetch timeout (configurable), 429 Retry-After handling, structured error responses.
Contributions welcome — see CONTRIBUTING.md for dev setup, architecture overview, how to add a connector, and how to add a framework catalog.
MIT © Anthony Rossi III
See CHANGELOG.md for release history.