Your AI catalogue, from what you already run
AI systems are found on your platforms, in your code and at the gateway, then claimed by an owner who adds the purpose and the risk class. The browser extension is not yet available.
- GitHub organisationevery repository, including archived ones (flagged), none skipped · one AI system per deployable unit
- GitLab groupevery project of the group and its subgroups, by group token · GitLab.com and self-managed
- Self-hosted hostsGitHub Enterprise Server and GitLab self-managed: a collector you run reads them and sends the findings
- OpenAIeach API key, in its project
- Anthropiceach workspace or service-account key
- Azure OpenAIeach model deployment
- Amazon Bedrockeach IAM role seen calling Bedrock in CloudTrail
- Databrickseach serving endpoint
- Snowflakeeach role calling Cortex
- A repository you scanone per application, on the Policy tab: the AI SDKs and models it imports
- The gatewayeach application registered with an application key
- roadmapThe browser extensionAI services people use, by team (extension not yet published)
- roadmapAzure DevOps · Bitbucketafter GitHub and GitLab
- roadmapOne system across platformsa repository matched to its keys, roles and images
Each repository is read in memory as one archive of its head commit and then discarded. The next scan reads again only the repositories whose head commit changed. With the collector, the archive is read on your own network and only the findings below are sent. The per-application scan on Policy → From your code is separate. It keeps the trimmed line on which a finding sits, and the AI catalogue takes only the SDK and model names from it.
- Read, by fixed patterns
- Dependency manifests naming an AI SDK or agent framework; imports in code
- Environment variable names: OPENAI_API_KEY, ANTHROPIC_API_KEY, AZURE_OPENAI_*, BEDROCK_*
- Model id strings; prompt files and system prompts; .mcp.json and tool schemas; AGENTS.md, CLAUDE.md, .cursorrules
- Terraform and CloudFormation for Bedrock agents, Azure OpenAI deployments and Vertex endpoints; CODEOWNERS
- One archive per repository whose default branch changed, read in memory · no model reads your code
- Kept by Saible
- Repository names, the head commit, each unit's folder, and the file and line a signal sits on with the matched name only
- SDK, framework and model names; environment variable names; counts of prompts, tools and MCP servers
- A CODEOWNERS team, shown in the claim drawer as a suggestion · a person named there is only flagged
- A confidence of high, medium or low, computed from the kinds of signal found
- Never
- Source code or prompt text stored or sent to a model (prompts are only counted) · the text of a line beyond the matched name
- An environment variable's value, or your code host's token in a finding
- A person's name or e-mail on a candidate: entries describe software, never people
- A repository skipped because it looks inactive · a connection Saible opens into your network
- Metadata: readthe list of repositories, their default branch and whether each is archived
- Contents: readone archive of the head commit per repository whose branch changed, read in memory
- All repositoriesthe installation covers the whole organisation · nothing is selected by hand and nothing is skipped
- App ID · installation ID · private keyentered once at Connect · the key goes to the organisation's own secret store, and a new installation token is issued for each scan
- Your own GitHub App on the organisation, or Saible's when your Saible region offers the install link. Push and repository events are not read yet. A change is picked up by the nightly scan or by Scan now. Webhooks are on the roadmap.
- FirstCollector run by your team
- A distroless image: non-root, no shell, no inbound port, outbound only to your code host and to Saible
- Connect the host in Saible as “Our collector reads it”, then issue a collector key (sdc.<org>.<secret>). It is shown once, and Saible keeps only its SHA-256 hash
- Runs as a cron job or a Kubernetes CronJob · asks Saible which commits it already holds, reads only what changed and sends the findings
- The same scanner as Saible's own, so a push finds the same AI systems as a pull · up to 200 repositories per push
- Every value sent is checked on arrival for its format (a name, a path, a line number or a team slug), and anything else is refused
- SecondPrivate connectivity, without a collectorroadmap
- AWS PrivateLink: your endpoint service, with Saible's interface endpoint in your Saible region
- Next, an allow-listed fixed egress address, as the gateway's requests to the control plane use today
- Then VPC peering, for Dedicated Saible only
- SplitA unit that is really several services: name the folders and give a reason. Each folder becomes its own AI system. A folder with no signal is refused. The record states whether the parent was kept or replaced.
- MergeSeveral units that are one product: select the rows, name the product and give a reason. The result is one AI system to claim, and a reconnection keeps the merge.
- Not AIAn organisation admin sets a row aside with a reason, such as a test fixture or code where nothing deployed calls a model. It is not listed again.
- ConfidenceHigh: an SDK, import or infrastructure declaration plus another kind of signal. Medium: one strong signal, or a supporting one. Low: a prompt file or README mention alone. Coding-assistant files alone never make a system.
- PurposeWhat the AI system is for, in one sentence. It is required to claim the system and is never pre-filled.
- AI Act risk class and its reasonProhibited, high, limited or minimal, with the reason in one sentence, or decided later. The owner declares it. Saible never does.
- Owner and teamThe CODEOWNERS team is a suggestion in the claim drawer, and the person confirms it. Data classes and autonomy are declared by the owner, or taken from the data map where your platforms' tags state them.
- ApprovalsA claim into an existing system is approved by its owner or an organisation admin. A policy change is approved by a second person. The owner attests every 90 days.
Home and the AI catalogue count the AI systems found with no owner, in code and on the platforms, with where each was found and how long it has waited. After 14 days, an unclaimed system is flagged to the organisation admins.
The AI Act inventory lists each discovered, unclaimed system as such, with where it was found and the date first seen, and no owner, purpose or tier until a person claims it. The AI landscape report counts them, apart from the names seen in use with no registration. No owner suggestion appears on a report. A row count is a list of what was found, never a register on its own.
See evidence ledgers, checks and the evidence pack for the contents of the reports, and control coverage for the source of the Know and Own areas.
- 1Open Catalogue → Systems → Discovered from code → Connect GitHub: your GitHub organisation through a GitHub App or a fine-grained token, or a GitLab group through a group token. For a self-hosted host choose Our collector reads it, then Collector key and run the collector where it can reach the host.
- 2Connect your AI platforms under Settings → Providers. The first scan runs the same night, or press Scan now. Test counts the repositories and reads nothing else.
- 3Open Discovered from code. It lists each service that calls a model, with its repository and folder, Saible's confidence and what was found. The figures on Home and in the AI catalogue count what has no owner, in code and on the platforms.
- 4Open a row. It shows where each signal was found, by file and line, and suggests the CODEOWNERS team. Press Claim it and type the purpose and the risk class. Alternatively, Split it by folder, select rows to Merge, or mark it Not AI, each with a reason.
- 5Press Attest as owner on the system's Access tab, and again every 90 days. Mark a system that does not belong to you as Not ours.
This topic is also documented as Agent Skills that your agents can load: discovery, catalog, code-scan, exposure-report, human-ai-use. Request them from Saible.