Evidence infrastructure for engineering teams

Stop rebuilding compliance evidence every audit cycle.

Codevidence continuously connects compliance controls to the exact code that implements them — without giving anyone access to your source code.

Built for engineering and platform teams at companies with a real compliance burden — the ones pulled into every SOC 2 renewal, GDPR audit, and regulator RFI to prove, by hand, that a control exists.

The problem

Compliance evidence still lives in spreadsheets and Slack threads

Every audit cycle, the same thing happens: engineering and platform teams get pulled off roadmap work to manually prove that a control is actually implemented — evidence scattered across code, tickets, and documentation, re-explained to auditors every single time. Legal, privacy, and security write the requirements in prose; engineering interprets them into something buildable; and nothing durably links the two.

Codevidence closes that gap: a durable, queryable link between each requirement and the code that implements it — maintained automatically by your existing build.

How it works · Declared → Verified → Observed

Evidence you can actually trust — and evidence you can't, labeled honestly

Not all compliance evidence is equally strong. Codevidence is explicit about the difference — and today it takes you from what a developer declared all the way to what a test confirms.

A cryptographic artifact hash tells you evidence came from this exact build. Whether the control actually behaves as claimed is a separate question — the one Verified answers, with a test.

  1. 01 Available now

    DECLARED

    Developers annotate compliance-relevant code with a lightweight, typed annotation. A build-time step extracts it directly from compiled bytecode — your source code never leaves your environment.

  2. 02 Available now

    VERIFIED

    A JUnit test, annotated with @VerifiesControl, calls a typed compliance assertion — and Codevidence records whether that check passed or failed, linked to the control it verifies. The gap between what a developer declared and what the code actually does, closed.

  3. 03 Coming next

    OBSERVED

    Runtime instrumentation confirms the control executed in production, tied to a specific deployment and commit — the strongest evidence tier, generated from real behavior, not developer intent.

See what Verified looks like in code ↓

The mapping

Many call sites. One control. One source of truth.

Compliance logic is rarely in one place. Codevidence collapses every code path that implements a control into a single evidence record — declared at build, verified by a test, and anchored to the exact commit either way.

Codevidence links the code that implements a GDPR processing activity to its Article 30 record Four code locations — a payment controller, a consent service, a Stripe webhook handler and a data-retention job — are the collect, store, share and erase touchpoints of one processing activity. Codevidence links them to a single control, consent.capture, and anchors that mapping to a specific commit and build. The record's descriptive fields — lawful basis, data subjects, categories of personal data, recipients, transfers and retention — come from the organisation's own Article 30 register; Codevidence keeps the code mapping in sync beneath them rather than generating the legal content. checkout/PaymentController.java :47 consent/ConsentService.java :112 api/webhooks/stripe.ts :23 jobs/DataRetentionJob.kt :88 CONTROL consent.capture RECORD OF PROCESSING ACTIVITY ART. 30 GDPR Consent capture & management dpv:Consent · Controller: Acme Payments Ltd THE CODE THAT IMPLEMENTS IT · MAPPED BY CODEVIDENCE COLLECT consent captured STORE record persisted SHARE sent to processor ERASE retention enforced DESCRIPTIVE FIELDS · FROM YOUR ARTICLE 30 REGISTER Lawful basis Consent — Art. 6(1)(a) Data subjects Customers, prospects Personal data Email, consent state, timestamps Recipients Stripe Payments Inc. — processor Transfers United States — SCCs + DPF Retention 24 months after withdrawal IMPLEMENTATION COVERAGE 4 / 4 lifecycle stages linked · 0 gaps LAST BUILD ci-4821 · a3f9e21 re-checked every build
Codevidence maps the code that implements a processing activity and anchors it to the exact commit — so the technical layer of your Article 30 record never drifts from what’s actually deployed.

Trust & architecture

We never read your source code. On purpose.

Enterprises won't grant a third-party SaaS access to their codebase — and they shouldn't have to, just to prove they're compliant. Codevidence is architected around that constraint from day one: a Maven/Gradle plugin scans your compiled .class files after your normal build finishes, extracting only annotation metadata — never source, never business logic, never executed. What comes out is a structured JSON evidence record — never your source, never your business logic — that carries a cryptographic artifact hash, commit SHA, and build timestamp, so the chain of custody holds end to end. It stays in your build output, and — only when you set an API key — is also posted to your Codevidence portal (or an ingestion endpoint of your own).

  1. step 1 Your code stays in your VCS
  2. step 2 Compiled bytecode produced by your normal build
  3. step 3 Codevidence extractor reads bytes only Never executes your code.
  4. step 4 Evidence record JSON, in your build output
  5. step 5 Your Codevidence portal sign in, review, export In preview
The extractor is a read-only pass over compiled artifacts. It parses bytecode structure to pull annotation metadata and never loads or runs a single class. What comes out is a JSON evidence record — not your code.

That's not just an access-control choice — it's what makes the evidence model work. Codevidence doesn't need to read your source to establish a cryptographic provenance chain between a declared control and the exact artifact that implements it. Evidence platforms that connect to your repo can tell you a control exists somewhere in your codebase. Codevidence tells you exactly which artifact, class, method, commit, and build claimed to implement it — and proves that claim didn’t change silently between audits.

Where this fits

Why not just use Vanta or Drata?

Evidence-automation platforms are excellent at connecting to your cloud, your ticketing system, and your Git provider. What they can’t do is establish a cryptographically anchored link between a compliance claim and the specific application-code artifact that implements it — without reading your source. That’s a narrower problem, and it’s the one Codevidence solves. Run them together: the platform manages your program, Codevidence anchors the code-level evidence underneath it.

The tenant portal

Preview

Evidence doesn’t have to stop at a JSON file.

Every evidence record is structured JSON in your build output — portable, diffable, and entirely yours. The Codevidence tenant portal rolls those records up: sign in at app.codevidence.com and every control shows the code that implements and verifies it, an Article 30-style record, and the evidence JSON behind it. The build plugin publishes to it now; live per-tenant history is the piece we’re rolling out with our design partners.

Control → code map

The call-sites-to-control view above, per control: every method that implements or verifies it, which lifecycle stage each covers, and the commit and build that last changed the mapping.

Record of processing activity

Each control rendered as an Article 30-style record — lifecycle stages, descriptive fields from your register, and an implementation-coverage read showing which stages have code linked and where the gaps are.

The evidence behind it

Expand any control to the raw Declared and Verified JSON your build posted — the exact record, with a link to open it standalone. The auditor-facing, query-by-framework views build on this.

Publishing is opt-in: the plugin only posts when you set a CODEVIDENCE_API_KEY. See build plugin configuration.

For engineers

One annotation. Any framework. Zero new infrastructure to run.

Mark compliance-relevant methods the same way you already mark @Transactional or @Cacheable. The same annotation covers SOC 2, SOX, GDPR, and anything else that needs evidence — the framework field just points at the criterion it satisfies. Codevidence's build plugin does the rest. Below: two Declared examples, and a Verified one — a test that confirms the control actually behaves the way it was declared to.

ConsentService.java annotate
@ComplianceControl(
    id = "consent.capture",
    framework = "GDPR:Art.30"
)
public void recordConsent(String userId) {
    // your existing implementation
}
declared evidence record generated at build
{
  "schemaVersion": "0.1",
  "kind": "declared",
  "control": {
    "id": "consent.capture",
    "framework": "GDPR:Art.30"
  },
  "artifact": {
    "sha256": "a1b2c3...",
    "class": "com.acme.checkout.ConsentService",
    "method": "recordConsent",
    "descriptor": "(Ljava/lang/String;)V"
  },
  "provenance": {
    "commit": "a3f9e21",
    "commitSource": "ci-env:GITHUB_SHA",
    "buildId": "ci-4821",
    "buildEnvironment": "ci",
    "timestamp": "2026-08-28T14:32:00Z",
    "serviceId": "checkout-service"
  }
}
CustomerRepository.java annotate
@ComplianceControl(
    id = "data.encryption.at-rest",
    framework = "SOC2:CC6.1"
)
public void persistCustomerRecord(CustomerRecord record) {
    // your existing implementation
}
declared evidence record generated at build
{
  "schemaVersion": "0.1",
  "kind": "declared",
  "control": {
    "id": "data.encryption.at-rest",
    "framework": "SOC2:CC6.1"
  },
  "artifact": {
    "sha256": "d4e5f6...",
    "class": "com.acme.storage.CustomerRepository",
    "method": "persistCustomerRecord",
    "descriptor": "(Lcom/acme/storage/CustomerRecord;)V"
  },
  "provenance": {
    "commit": "a3f9e21",
    "commitSource": "ci-env:GITHUB_SHA",
    "buildId": "ci-4821",
    "buildEnvironment": "ci",
    "timestamp": "2026-08-28T14:32:00Z",
    "serviceId": "customer-service"
  }
}
ConsentServiceTest.java verify
@VerifiesControl(id = "consent.capture")
@Test
public void consentIsRecordedWithLawfulBasis() {
    var service = new ConsentService();
    service.recordConsent("user-42");

    ComplianceAssertions.assertConsentRecorded("user-42", "consent");
}
verified evidence record recorded on the test run
{
  "schemaVersion": "0.1",
  "kind": "verified",
  "verifiesControl": "consent.capture",
  "test": {
    "testClass": "com.acme.checkout.ConsentServiceTest",
    "testMethod": "consentIsRecordedWithLawfulBasis",
    "assertionType": "assertConsentRecorded"
  },
  "result": {
    "status": "passed",
    "buildId": "ci-4822",
    "commit": "a3f9e21",
    "timestamp": "2026-08-28T14:41:00Z"
  }
}

The same record, without reading JSON:

consent.capture

GDPR · Article 30

  • DECLARED
  • VERIFIED
  • OBSERVED
Service
checkout-service
Class
ConsentService
Method
recordConsent()
Commit
a3f9e21
Build
ci-4821
Artifact
SHA-256: a1b2c3...
Generated
Aug 28, 2026
Example evidence record — illustrative

Every annotated method produces its own evidence record at build time — one per control, tied to the exact class, method, and commit that implements it. Records are written as structured JSON under target/codevidence/; teams that need semantic interoperability with existing privacy or GRC ontologies (e.g. DPV for GDPR) can export to JSON-LD or RDF.

The third pair is Verified: a @VerifiesControl test calls a typed compliance assertion, and Codevidence records whether it passed or failed as its own evidence record, linked back to the Declared control. Read the full spec →

See the evidence

What a control's evidence looks like, assembled

One control, end to end: where it lives in your code, the exact build that proves it, and every prior build that carried it too.

Illustrative mockup

Control

consent.capture · GDPR:Art.30

Status

Declared

Implementation

checkout-service
└── ConsentService
    └── recordConsent()

Provenance

Commit
a3f9e21
Build
ci-4821
Artifact
SHA-256: a1b2c3...
Timestamp
Aug 28, 2026

Evidence history

  1. Aug 28 Build 4821
  2. Aug 21 Build 4798
  3. Aug 14 Build 4762

This is a mockup of what an evidence record looks like once assembled — the build plugin generates the underlying Declared data today. Browsing it laid out like this is part of your Codevidence workspace, described above — early access, not a live product yet.

Use cases

Built for the moments that actually matter

SOC 2

SOC 2 renewal, without the scramble

Stop rebuilding your evidence package from scratch every cycle. Every control carries a machine-readable record tied to the exact service and commit that implements it — regenerated on every build, not a spreadsheet you rebuild by hand.

GDPR Art. 30

GDPR Article 30 records that trace to real code

Trace the technical implementation of a processing activity back to the exact services and commits that carry it out — regenerated on every build, not stale documentation an intern updates twice a year.

Regulator RFI

Answer a regulator's question in minutes, not weeks

Show exactly which controls were declared and verified, in which service, at which commit — with a provenance chain (artifact hash, commit, build) an auditor can check independently.

See it on your codebase

See what your compliance evidence would look like

We’ll instrument one real control in your CI pipeline and show you the resulting evidence trail — no source code leaves your environment.

Codevidence is early, and we’re working directly with a small number of engineering and platform teams. A real person reads every request and replies.

No newsletter, no drip campaign. A real person replies. Prefer email? partners@codevidence.com