Catio · Source Code Ingestion

Catio reads your architecture from your code.

Cloud integrations show Catio what you’ve deployed. Source code shows why it exists and how it fits together - the services, contracts, and ownership your infrastructure can’t express. One honest sentence before anything else: your source code is never stored - it’s analyzed in an ephemeral, isolated environment and deleted, and only derived facts ever enter Catio’s knowledge base.

loading the architecture constellation…

That lighting-up is the whole story of this page: the same system, seen twice. Scroll to watch the difference - and if you’re here as a security reviewer, the security deep dive goes as deep as you need.

Questions about this section? Type or record one - it goes straight to us.

Before / after

The blind spot every infra tool shares

AWS and Kubernetes integrations see deployed resources: clusters, databases, queues, and workloads. What they can’t see is what those workloads are - which services call which, what contracts bind them, who owns them. The result is an architecture map of boxes with almost no meaningful lines.

Drag the divider. Left is what infrastructure alone can tell you. Right is the same system once source code joins the evidence.

INFRA ONLYWITH SOURCE CODE
Plain-text summary of this visual

A slider compares two views of the same system. Infra-only: deployed resources and opaque service workloads with almost no meaningful edges between them. With source code ingestion: the same nodes now carry service-to-service call edges (with confidence scores), gRPC contracts, an async topic connecting producer to consumer, data-store dependencies, team ownership, and external SaaS integrations.

Questions about this section? Type or record one - it goes straight to us.

Evidence only code can give

What source code surfaces that nothing else does

Each switch below adds a class of evidence extracted from code: service-to-service calls with confidence scores, gRPC and HTTP contracts, async topics that join producer to consumer, data stores identified from the drivers you import, team ownership from CODEOWNERS - and the external SaaS you actually integrate with.

Service-to-service calls & contracts
Async pub/sub
Data stores
External SaaS
Ownership (CODEOWNERS)
try it: flip on External SaaS - your code shows you integrate with Datadog; AWS resource inventory never told you that.
Plain-text summary of this visual

Switches add evidence layers that only source code surfaces, on top of the deployed-infra baseline: (1) service-to-service calls and gRPC/HTTP contracts, each carrying a confidence score and discovery method; (2) async pub/sub, where producer and consumer join on the topic; (3) data stores detected from database/cache/queue drivers and SDKs; (4) external SaaS integrations from a curated whitelist - Datadog, Stripe, Auth0, Sentry, OpenAI; (5) ownership, mapping CODEOWNERS to teams.

Beyond the graph, code carries delivery-risk signals no other source has: contributor counts, bus factor, churn and change-coupling - where your effort is going, and where the risk is concentrated.

Questions about this section? Type or record one - it goes straight to us.

The payoff

Four evidence streams. One corroborated truth.

Source code doesn’t replace your other signals - it joins them. Catio’s Architecture Knowledge Base combines source code, cloud provider data, observability, and cost into one time-aware graph, where every edge carries a confidence score and the method that discovered it.

Source codestructure, dependencies, business logicCloud providerdeployed resources (AWS)Observabilityruntime behavior (CloudWatch, Datadog, Splunk)Costinfrastructure spend (AWS CUR) Architecture Knowledge Baseevery edge: confidence + discovery_method · adjudicated, time-awarecode · intendedruntime · realthe gap = drifta finding neither streamcould produce alone*
*code↔runtime corroboration (“grounding”) is on the roadmap - today every code-derived edge already ships as evidence with confidence + provenance, ready for it.
Plain-text summary of this visual

Four evidence streams - source code, cloud provider data, observability data, and cost data - converge into one Architecture Knowledge Base. Each contributed edge carries a confidence score and its discovery method, and the AKB adjudicates evidence into time-aware facts. The highlighted principle: code shows the intended architecture, runtime shows the real one, and the gap between them is drift. Automated code-to-runtime corroboration is roadmap; the evidence model that enables it ships today.

Why it matters: code says intended, runtime says real - and the gap is drift. Four corroborating streams can confirm each other, dispute each other, and expose the difference between the architecture you designed and the one you’re running. One stream alone never can.

Questions about this section? Type or record one - it goes straight to us.

The question you should ask

“But we’d be giving you our source code.”

Right - that’s exactly the question to ask, and it deserves a specific answer, not a platitude. The answer is an architecture: a single egress chokepoint that behaves like a one-way membrane. Raw source - files, contents, commit messages, identities - stays inside an ephemeral scan environment and is deleted with it. Only derived facts pass through.

Plain-text summary of this visual

A one-way membrane separates the ephemeral scan environment from Catio’s knowledge base. Raw material - source files, file contents, commit messages, author names, file paths - presses against the membrane and never crosses; it is deleted with the scan. Only derived facts pass through: counts, aggregates, structural edges, contracts, and pseudonymized identifiers. Four reassurance chips link into the security deep dive.

Each chip above links into the security deep dive, where every claim is unpacked to the level of the specific permission, the specific policy default, and the audit artifact your security team can run themselves. Prospects can stop here; reviewers, keep going.

Questions about this section? Type or record one - it goes straight to us.

Part 2 · Security & architecture deep dive

For your security team: the full mechanics

Everything below is grounded in Catio’s customer-facing integration guide, the extractor’s design documentation, and its actual egress-policy code. Where a capability is roadmap rather than shipped, it says so.

Deep dive · A1

The privacy boundary is the product

All sensitive work - clone, git log, parsing - happens inside the scan boundary. Everything that leaves passes through one chokepoint, auditable in one file. The default policy: author identities hashed, file paths excluded, hotspot and coupling detail excluded.

Never leaves

stays inside the ephemeral scan; deleted with it

Source code bodies & file contents
never emitted by the egress filter - nothing that reveals implementation crosses
Commit messages
never written anywhere durable; excluded from all output
Raw author names & emails
names blanked; emails replaced with SHA-256 pseudonyms (anon:…) under the default policy (HashAuthors: true)
File paths
source-revealing, so stripped by default (IncludeFilePaths: false); opt-in only
Churn hotspots & change-coupling file pairs
file-level detail excluded under the default policy; opt-in only

Leaves (derived facts only)

the complete category list - nothing else crosses

Counts & aggregates
contributor count, bus factor, churn totals, language mix - numbers, not content
Structural edges
service CALLS service, contracts, pub/sub topics, data-store dependencies - each with confidence + discovery_method
Entity identities
module paths, package names, deployable names - the graph's nouns
Pseudonymized author IDs
anon:<sha256-prefix> - stable for bus-factor math, not reversible to a person
Whitelisted external SaaS names
Datadog, Stripe, Auth0… only when matched against a curated provider whitelist

Don’t take the diagram’s word for it - the boundary is one auditable file (internal/egress), and a dry run prints exactly what would ever be sent, writing nothing:

# security review: print exactly what would be egressed, write nothing
$ extract -repos /path/a,/path/b -egress-manifest

policy: HashAuthors=true  IncludeFilePaths=false  IncludeHotspots=false  IncludeCoupling=false
entities: SoftwareSystem · RuntimeUnit · CodeComponent · ExternalSystem · Team
edges: CALLS · CONTRACT · HAS_MODULE · PART_OF · OWNED_BY (each: confidence + discovery_method)
metadata fields: contributor_count · active_contributors_90d · bus_factor · churn_adds · churn_dels · primary_language · third_party_deps · …
authors: anon:9f2a41c8b03d17e6 (sha-256, names blanked)
source bodies: none · file contents: none · commit messages: none · file paths: none
- dry run complete. nothing written. -

Illustrative output - field names from the extractor’s README; run it against your own repos during review.

Plain-text summary of this visual

Two lists define the privacy boundary. Never leaves: source code bodies and file contents, commit messages, raw author names and emails, file paths (by default), and file-level hotspot/coupling detail (by default). Leaves: counts and aggregates, structural edges with confidence and discovery method, entity identities, SHA-256-pseudonymized author IDs, and whitelisted external SaaS names. A dry-run command, -egress-manifest, prints exactly what would be sent and writes nothing - the boundary is auditable in one file.

Questions about this section? Type or record one - it goes straight to us.

Deep dive · A2

Where the work happens: ephemeral, isolated, then gone

Analysis runs within Catio’s AWS environment, in the United States. Your repository exists there only for the duration of a scan - cloned into an isolated, encrypted, ephemeral working directory, and deleted when the scan finishes. No source, file contents, or commit messages are written anywhere durable.

  1. 01
    Minta 9-minute app JWT is exchanged for a ~1-hour installation token - held in memory only, never logged, never written to disk
  2. 02
    Clonethe repo checks out into an isolated, encrypted, ephemeral working directory on Catio's infra
  3. 03
    Scrubthe token is removed from the checkout's git config - the credential never outlives the run
  4. 04
    Analyzemine git history, detect the functional surface, build the C4 graph - all inside the boundary
  5. 05
    Egress-filteronly policy-approved derived facts pass the chokepoint
  6. 06
    Deletethe working tree is deleted when the scan finishes; a reaper sweeps any orphans from crashed runs
Network-isolated workers

scan workers reach only GitHub, the AKB, and the LLM router - no general internet egress.

Cloned code is treated as untrusted

git operations only - no shell execution of repo contents; CPU, memory, time, and disk limits; a hard repo-size cap.

Plain-text summary of this visual

Six steps: (1) mint a short-lived installation token (~1 hour, in memory only); (2) clone into an isolated, encrypted, ephemeral working directory; (3) scrub the token from the checkout’s git config; (4) analyze; (5) pass results through the egress filter; (6) delete the working tree, with a reaper sweeping orphans. Throughout: scan workers are network-isolated (GitHub, AKB, and LLM router only) and cloned code is treated as untrusted - git only, no shell, resource limits, repo-size cap.

Questions about this section? Type or record one - it goes straight to us.

Deep dive · A3

A least-privilege GitHub App - and nothing more

Access is a standard GitHub App install your security team has reviewed a hundred times: two read-only permissions, repo-by-repo opt-in that defaults to off, and revocation that’s one toggle - or one uninstall - away.

The app asks for exactly two permissions

Contents: Read
to clone the repos you opt in - read-only
Metadata: Read
GitHub’s required baseline for any app

Deliberately not requested:

Contents: WriteAdministrationActions / WorkflowsSecretsWebhooks adminIssues / Pull request writeMembers / Org adminDeployments

(Pull requests: Read is a possible later, optional addition for PR-scoped scans - not part of today’s install.)

Per-repo opt-in - default off

Installing the app scans nothing. Each repo is enabled explicitly; disable one - or uninstall - any time. Try it:

acme/checkoutscanning enabled
acme/paymentsscanning enabled
acme/catalognot scanned
acme/identitynot scanned
acme/internal-toolsnot scanned

The install itself is bound to your tenant with a signed state parameter, so an installation can’t be replayed into another customer’s account.

Plain-text summary of this visual

The GitHub App requests two read-only permissions: Contents Read (to clone opted-in repos) and Metadata Read (GitHub’s required baseline). No write, no admin, no actions, no secrets, no org access. Scanning is opt-in per repository and defaults to off; you can disable a repo or uninstall the app at any time, which revokes access. The install is bound to your tenant with a signed state parameter to prevent cross-tenant replay.

Questions about this section? Type or record one - it goes straight to us.

Deep dive · A4

Tenant isolation and the write path

A scan can only write into your graph. Tenancy is taken from the stored installation record - never from request input - and every write happens in a single database transaction scoped to that tenant.

Tenant Astored Installationinstallation_id ↔ tenant_idscan jobtenant from recordone transactionset_config(‘akb.tenant_id’, A)Architecture Knowledge Basetenant A graphtenant B graphwrites outside the boundtenant cannot happenrequest input:"tenant_id": "B" ?tenancy is never taken from request input
Plain-text summary of this visual

A scan job’s tenant identity comes from the stored Installation record (installation id bound to tenant id at install time) - never from anything in a request. Every write to the knowledge base happens inside a single database transaction scoped with set_config(‘akb.tenant_id’, …), so one customer’s scan writes only into that customer’s graph. A request claiming a different tenant id is simply ignored.

Questions about this section? Type or record one - it goes straight to us.

Deep dive · A5

LLM enrichment without your source code

A language model helps label what a repository is for - its domain, its business flows. It does that from structure, not source: the model receives the structural surface and a bounded README excerpt, never code bodies, via AWS Bedrock under zero-data-retention agreements.

Sent to the model

The structural surface
modules, entry points, contracts, dependency names - the graph, not the code
A bounded README excerpt
capped-length project description text, for domain/purpose inference
Where it runs
AWS Bedrock, under zero-data-retention agreements - prompts are not stored and not used for training. Output is JSON-schema-constrained; if the model is unreachable, the scan degrades gracefully to its deterministic output.

Never sent

Source code bodies
function and file contents never reach the model
Commit history
no messages, no diffs, no author identities
Secrets & config values
the scanner looks at structure, not values

LLM-derived labels (domain, capability, business flows) carry a lower confidence score than contract-derived facts - the graph always knows which claims came from where.

Plain-text summary of this visual

LLM enrichment receives only the structural surface of a repository plus a bounded README excerpt - never source code bodies, commit history, or secret values. It runs on AWS Bedrock under zero-data-retention agreements, output is constrained to a JSON schema, and the pipeline degrades gracefully to deterministic output if the model is unavailable. LLM-derived labels carry lower confidence than contract-derived facts.

Questions about this section? Type or record one - it goes straight to us.

Deep dive · A6

How it’s architected - and why

The pipeline is deliberately boring: one pass per repository, one privacy filter, one evidence write. The interesting choices are the ones that keep it safe and scalable - no central linker ever holds your codebase, and nothing the extractor says is treated as unquestioned truth.

mine
deterministic git metrics: contributors, bus factor, churn - delta-aware, so repeat runs analyze only new commits
detect surfaces
ingress, egress, and contracts per repo: gRPC services, HTTP routes, topics, data-store drivers
build C4 graph
systems, runtime units, code components, data stores, external systems - the AKB ontology
egress filter
the single privacy chokepoint - only policy-approved derived facts continue
AKB sync
facts written as evidence, in one tenant-scoped transaction
adjudicate
evidence becomes time-aware facts: first observation → genesis; re-runs → freshness or supersession

The “why” behind the design

Per-repo scans, the AKB as the join
Every repo is scanned independently - there is no cross-repo working set to protect, and no central linker holding your whole codebase. Entity IDs are content-addressable (an import path is the module path), so independent runs mint identical node IDs and join in the knowledge base by name. Cross-repo calls resolve through symbolic interface nodes both sides mint on their own.
Evidence, not asserted truth
Every code-derived edge carries a confidence score and a discovery_method. The AKB adjudicates: observed beats derived, re-runs supersede cleanly, and a partial scan never asserts a service is gone. Roadmap: 'grounding' corroborates code-derived edges against runtime evidence to surface drift.
Deltas by default
The last analyzed commit SHA is recorded with the results, so subsequent runs need only the history since - less data touched, faster scans, same boundary.
Plain-text summary of this visual

The pipeline runs mine → detect surfaces → build C4 graph → egress filter → AKB sync → adjudicate, with the egress filter highlighted as the single privacy chokepoint. Three design ideas: per-repo scanning with the knowledge base as the join (content-addressable IDs, symbolic interface nodes, no central linker); evidence rather than asserted truth (confidence + discovery method on every edge, adjudication, planned code↔runtime grounding); and delta scans by default via the last analyzed commit SHA.

Questions about this section? Type or record one - it goes straight to us.

Deep dive · A7

Compliance & posture - the checklist

Every line below comes from Catio’s sanctioned customer documentation - this list contains nothing we wouldn’t put in a security questionnaire.

  • SOC 2 Type II compliantCatio Source Code Integration Guide · trust.catio.tech
  • All data processing occurs within AWSCatio Source Code Integration Guide
  • All data is processed solely within the United StatesCatio Source Code Integration Guide
  • LLM-based processing uses AWS Bedrock with zero data retention agreementsCatio Source Code Integration Guide
  • Source code is not stored or retained - repositories are cloned into an ephemeral, isolated, encrypted working directory and deleted when the scan finishesCatio Source Code Integration Guide
  • Only derived facts (counts, aggregates, structural edges) are persisted; identifiers are pseudonymized and file paths are excluded by defaultCatio Source Code Integration Guide
  • GitHub App with least-privilege permissions: Contents: Read, Metadata: ReadCatio Source Code Integration Guide
  • Opt-in is per repo and revocable at any time - uninstall the app or toggle a repo offCatio Source Code Integration Guide
  • Analysis runs against each repository's default branchCatio Source Code Integration Guide

Compliance documentation, subprocessors, and audit reports live in Catio’s trust center: trust.catio.tech ↗

Questions about this section? Type or record one - it goes straight to us.