Browser
Managed extension policy plus a paste guard that stops secrets before they reach the prompt box.
Shadow AI detection across browser, CLI, IDE, endpoint, network and cloud. One finding schema, one registry of known AI tools, one dashboard — running on infrastructure you already have, for roughly the cost of nothing.
No single commercial tool sees all of the places AI turns up. CASB and DLP see the browser. Endpoint tools see installed applications. Cloud access tools see OAuth grants.
None of them read ~/.claude.json to tell you which account your developers' AI CLIs are signed into.
And the account is the part that matters: an approved tool on a personal account is unmanaged data flow, invisible spend, and an offboarding gap. Adding a new AI tool to detection is a merge request to a YAML file — not a script change on every endpoint.
Coverage
Managed extension policy plus a paste guard that stops secrets before they reach the prompt box.
Reads ~/.claude.json and friends to report which account each AI CLI is actually signed into.
Editor assistants and their config, inventoried from the endpoint rather than guessed at.
Collectors for macOS (Jamf), Windows (Intune) and Linux (any RMM, cron or config management).
SentinelOne DNS telemetry, including local process bridges that never touch the browser.
Entra sign-ins, delegated access with OAuth scopes, Exchange signup evidence, Intune and Jamf inventory.
Demo
No Kubernetes cluster, no MDM, no cloud logins. The demo runs the real receiver and a real Grafana dashboard against fake data, all in Docker — so you land on a dashboard that's already full instead of an empty one.
Clone the repo
$ git clone https://github.com/AmanSK5/shadow-ai-guard.gitGo into the demo folder
$ cd shadow-ai-guard/demoshadow-ai-guard is the folder git just created; demo is where the compose file lives.
Bring the stack up
$ docker compose upGive it about 30 seconds — the receiver, Loki, the registry builder and Grafana all start and the demo data is seeded on startup.
Open the two demo surfaces
What you land on
A static recreation of the Grafana board the demo provisions at localhost:3000, with the same seeded data. The real one is backed by Loki and refreshes every five minutes.
8
3
3
2
| user | tool | surface | account_type | account_domain | device |
|---|---|---|---|---|---|
| gengar | cursor | desktop | presence only | — | C02GENGAR |
| pikachu | claude-code-mcp:atlassian,figma | mcp | presence only | — | C02PIKACHU |
| bulbasaur | deepseek | network | presence only | — | NIX-BULBA |
| ditto | ollama | desktop | presence only | — | NIX-DITTO |
| snorlax | github-copilot | ide | presence only | — | WIN-SNORLAX |
| squirtle | fireflies | cloud | personal | gmail.com | — |
| pikachu | claude-code | cli | personal | gmail.com | C02PIKACHU |
| charmander | chatgpt | browser | personal | gmail.com | WIN-CHAR |
| eevee | claude-code | cli | work | example.com | C02EEVEE |
| mew | claude | desktop | work | example.co.uk | C02MEW |
| bulbasaur | codex-cli | cli | personal | gmail.com | NIX-BULBA |
| tool | user | device |
|---|---|---|
| claude-code-mcp:atlassian,figma | pikachu | C02PIKACHU |
claude-code-mcp:atlassian,figma
Reading the board: presence of a tool is informational. Red means a personal (non-corporate) account is signed into an AI tool on a managed device, or an unexplained integration was found — in a real deployment those route to your alerting channel automatically.
In-browser playground
A simulation of two pieces of the system: the browser paste guard, and how a detection becomes a finding. Type into it and watch the report change. This is a re-implementation for the website — it runs entirely in your browser, sends nothing anywhere, and is not the shipped guard.js or a real collector. For the real thing, run the Docker demo above.
waiting for input
Architecture
browser extension ─┐
macOS collector ──┤
Windows collector ─┼──► receiver ──► Loki ──► Grafana
Linux collector ──┤ │
cloud scanners ───┤ └──► Alertmanager ──► alerts
network scanner ───┘ ▲
registry (YAML, reviewed) ─┘FastAPI service. Accepts findings, logs structured JSON, fires alerts for personal accounts, serves the registry to collectors.
The source of truth for what counts as an AI tool: domains, extension IDs, config paths, approval status. Schema-validated in CI.
Cloud and fleet scanners for Entra, Exchange, Intune, Jamf and SentinelOne. Each module is optional.
Collectors that read AI tool config files for the signed-in account. This is the data no API-level product has.
Weekly job that classifies unrecognised AI-looking domains and proposes registry additions. A human approves every change.
Grafana over Loki. Set your corporate domains in the dashboard variable and personal accounts light up red.
Finding schema
Any new scanner or collector that emits this works with everything downstream. severity is warn when the account domain isn't one of your corporate domains, info otherwise.
The user field carries an account name so a finding can be followed up with the right person.
{
"tool": "claude-code",
"surface": "cli",
"os": "macos",
"account_domain": "gmail.com",
"device": "SERIAL123",
"user": "aman.test",
"evidence": "~/.claude.json",
"severity": "warn",
"reported_at": "2026-01-01T09:00:00Z",
"source": "collector-macos"
}Prebuilt images are published to GHCR by CI, and a Helm chart at charts/ai-guard ships the compiled registry, so an install needs no build step.
The registry ships with every tool set to approved: false. Approval is your organisation's decision, not this project's default. The discovery job proposes additions; it never merges them.
Under ISO 42001 or similar, the registry doubles as your maintained inventory of AI systems in use, and the dashboard as its evidence.
Security model: one bearer token shared by reporting sources, rate-limited public ingest, findings carry usernames and device identifiers — treat your log store as sensitive.
Alpha
Released early on purpose. It runs in production in one environment, and the rough edges are labelled rather than hidden. Treat findings as leads to follow up, not verdicts.
Browser extension inventory skips profiles under ~/snap on Linux, so an AI extension there stays invisible.
Entra reads interactive sign-ins only. Non-interactive use is covered separately as delegated access findings; service principal sign-ins are not read as usage.
Linux is driven end to end in CI and macOS has run on a fresh cluster. Windows has had the least real-world running — pilot on one machine first.
Hit something wrong or missing? Open an issue with the finding JSON and what you expected. That is genuinely useful.
Apache-2.0. Others may legitimately charge for hosting, deployment or support, but the software itself is here at no cost. Before buying anything based on it, check what is actually being provided beyond the code.