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.
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.
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.
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.
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.
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.
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.
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.
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.
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
Commit messages
Raw author names & emails
File paths
Churn hotspots & change-coupling file pairs
Leaves (derived facts only)
the complete category list - nothing else crosses
Counts & aggregates
Structural edges
Entity identities
Pseudonymized author IDs
Whitelisted external SaaS names
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.
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.
- 01Minta 9-minute app JWT is exchanged for a ~1-hour installation token - held in memory only, never logged, never written to disk
- 02Clonethe repo checks out into an isolated, encrypted, ephemeral working directory on Catio's infra
- 03Scrubthe token is removed from the checkout's git config - the credential never outlives the run
- 04Analyzemine git history, detect the functional surface, build the C4 graph - all inside the boundary
- 05Egress-filteronly policy-approved derived facts pass the chokepoint
- 06Deletethe working tree is deleted when the scan finishes; a reaper sweeps any orphans from crashed runs
scan workers reach only GitHub, the AKB, and the LLM router - no general internet egress.
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.
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: ReadMetadata: ReadDeliberately not requested:
(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 enabledacme/paymentsscanning enabledacme/catalognot scannedacme/identitynot scannedacme/internal-toolsnot scannedThe 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.
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.
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.
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
Never sent
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.
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.
minedetect surfacesbuild C4 graphegress filterAKB syncadjudicateThe “why” behind the design
Per-repo scans, the AKB as the join
Evidence, not asserted truth
Deltas by default
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.
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 ↗