Live · event-driven detection A product by Data Insights AI · Vienna
supply chain · provenance

An immutable record
of every dependency,
the moment it shipped.

SCG resolves every CI/CD dependency to an immutable hash, stores the full history in our temporal knowledge graph, and surfaces compromise the moment it lands — not the morning after.

scg.platform
tracking
platform v0.3.16 stable
cli v0.1.30 latest
tools 75,000 +
profiles 210 curated
ecosystems 4 gha · npm · pypi · docker
I

Pinned at the hash

Every dependency locked to an immutable content hash. Tag hijacks, typosquats and dep-confusion all halt the build.

II

Tracked over time

Every resolution stored in our temporal knowledge graph. Hash drift, dependency injection and burst publishes all surface here.

III

Sealed for verify

Lockfiles signed with ed25519. Verifiable offline. Webhook alerts the moment a watched ref drifts.

75,000+ tools tracked across four registries
7s median detection event-driven crawler
ed25519 lockfile signing offline verifiable
20/hr free tier no account · no tokens
§ 01 — the gap

Daily cron is the attacker's window.

On 11 May 2026, TeamPCP published 84 malicious versions across 42 @tanstack/* npm packages in under six minutes — pushed through TanStack's own OIDC trusted-publisher binding after the workflow was hijacked. SCG's event-driven watcher recorded the burst in seconds. Tools relying on daily crawls saw it the next day.

TanStack compromise — 11 May 2026

window: 6 min 12 s · all times utc
19:20:14
First malicious publish · @tanstack/react-router@1.130.x Authenticated via TanStack's OIDC trusted-publisher binding. Cryptographically legitimate at the registry layer.
+ 7 s
SCG _changes watcher records the publishscg npm replication feed → resolve → store. New hash sealed in temporal graph at 19:20:21 UTC.
+ 6 m
SCG burst detector firesscg 42 publishes across the @tanstack scope inside the 10-minute window crosses threshold. Webhook alert dispatched.
+ 38 m
Socket public advisory Streaming-feed competitors disclose within the hour.
+ 23 h 39 m
Daily-cron crawlers would noticeindustry standard Until our event-driven watchers shipped, this was SCG too. Now closed.
§ 02 — defense

Three layers.
Pinned. Tracked. Sealed.

The same compromise can hide in three different shapes — a tag that quietly moves to a new commit, a published version that grows a new dependency, a step that gets handed a secret it never needed. SCG closes each one.

L · 01 — pinning

Digest pinning

Every dependency is locked to an immutable content hash. If the hash changes — tag hijack, typosquat, dependency confusion — the build halts before a single byte of attacker code runs.

Catches tj-actions, ua-parser-js, event-stream, codecov.
L · 02 — graph

Dependency tracking

The platform stores every package's dependency graph in our temporal knowledge graph. When a new version suddenly grows an unknown dependency, SCG flags it — the axios pattern, the Shai-Hulud worm.

Catches axios 1.14.1, mistralai 2.4.6, Mini Shai-Hulud.
L · 03 — scope

Secret scoping

Each CI tool has a security profile naming the secrets it requires and the ones it must never see. Mismatches are surfaced before the step runs — no NPM_TOKEN handed to a linter.

Stops post-compromise exfiltration. The reviewdog and tj-actions class.
§ 03 — architecture

From every publish
to your CI in seconds.

The five-stage pipeline. Built around the upstream event feeds — npm _changes long-poll, PyPI updates RSS, GitHub tags webhook — not the once-a-day registry crawl that the rest of the industry calls real-time.

01 · observe

Changes feed

Long-poll the registry's replication stream. Every publish surfaces in seconds.

replicate.npmjs.com/_changes
pypi.org/rss/updates.xml
02 · resolve

Hash + dep graph

Fetch the new version's integrity hash and direct deps. Capture maintainers.

sha512 · sha256 · sha1
maintainers[ ].name
03 · store

Temporal graph

Tool → RESOLVES_TO → Digest, with full valid-time history. TKG TieredStore — hot refs, time-windowed events.

tkg v3 · ed25519-signed
04 · detect

Burst + drift

Per-scope and per-maintainer burst detectors. Hash drift on re-resolve. Volatility scoring via Tyla.

scope cohort · maintainer cohort
10 min window
05 · alert

Webhook + API

Watching orgs receive a signed webhook the moment a watched ref drifts.

/v1/check · /v1/history
webhook · ed25519 sig
§ 04 — evidence

What stopped a
12M-download attack at minute six.

The real-world supply chain compromises SCG defends against — pinned, force-pushed, typosquatted, worm-propagated. Each row maps an actual published attack to the layer that catches it.

AttackDateImpactDefense
TanStack / Mini Shai-Hulud42 npm packages, 84 versions, 6-minute burst May 2026 12.7M weekly DLs (react-router alone) _changes feedburst detectmaintainer
mistralai 2.4.6 (PyPI)malicious payload on import; lived ~hours May 2026 AI/agent dev tooling RSS watcherdigest pin
Checkmarx KICS Docker / VSCodecredential-stealer in official image Apr 2026 enterprise security tooling digest pindrift
axios 1.14.1 (npm)injected dependency (plain-crypto-js) Mar 2026 83M weekly DLs dep graphdigest pin
trivy-action / LiteLLMtag force-push to malicious commit Mar 2026 95M monthly DLs driftdigest pin
tj-actions / changed-filesCISA KEV · stole CI secrets Mar 2025 23,000+ repos digest pinsecret scope
reviewdog / action-setupsecret exfiltration via post-step Mar 2025 CISA KEV digest pinsecret scope
Codecov bash uploaderCI secret harvest 2021 29,000+ customers digest pinsecret scope
ua-parser-js (npm)account takeover · malicious version Oct 2021 7M+ weekly DLs digest pin
event-stream (npm)maintainer handoff to attacker Nov 2018 8M installs digest pindep graph
PyTorch torchtritonPyPI namespace confusion Dec 2022 2,700+ DLs digest pin
§ 05 — coverage

Four registries.
One source of truth.

GitHub Actions, npm, PyPI, Docker Hub. Each crawled with its own throttle, each resolved to its own hash format, every result re-checked on a 15-minute drift schedule.

GitHub Actions
git tag → commit sha
67,000
tools tracked
npm
version → integrity hash
5,200
+ _changes long-poll
PyPI
version → sha256 digest
850
+ updates rss feed
Docker Hub
tag → manifest digest
1,700
official images
§ 06 — install

Three commands.
No tokens. No accounts.

The CLI queries the platform directly. Linux and macOS, amd64 and arm64. A single static binary. The install script verifies SHA-256 against the manifest before it touches your path.

install · curl | sh
$ curl -sSfL https://scg.data-insights.ai/install.sh | sh
1 · lock — scan + resolve
$ scg init scanning .github/workflows/ + package-lock.json + requirements.txt resolved 18 tools across 3 ecosystems written: scg.lock (18 entries, signed ed25519)
2 · verify — check against live state
$ scg check checking 18 tools… 0 drift
3 · protect — audit per-step secrets
$ scg audit 18 tools, 4 secrets, 2 violations VIOLATION deploy: PYPI_TOKEN exposed to actions/checkout (no PyPI access needed)
resolve a single reference
$ scg resolve github_action actions/checkout@v4 b4ffde65f46336ab88eb53be808477a3936bae11 sha1 $ scg resolve npm express@4.21.0 sha512-MILBy3SOSEjeAaqaEf2bvO9OZcwxNYJ…
// download

Pre-built binaries

Current CLI: v0.1.30. Each release ships SHA-256 checksums and an ed25519-signed manifest.

checksums.txt →
all releases →
platform public key →
// from source

Go install

If you'd rather build it yourself.

$ go install gitlab2024.bds421-cloud.com/
  bds421/rho/supply-chain-guardian/
  cmd/scg@latest
// integrate

CI step

Drop into any pipeline. Exits non-zero on drift or scope violation.

$ scg check --fail-on drift,scope
§ 07 — api

Every answer
pre-computed.

The CLI talks to api.scg.data-insights.ai by default — no tokens, no accounts. 20 requests per hour per IP is enough for any single repo. Paid tiers raise the ceiling.

MethodEndpointAuth
GET/v1/resolve/{ecosystem}/{reference}public
GET/v1/profile/{ecosystem}/{tool}public
GET/v1/statuspublic
POST/v1/signpublic
GET/v1/history/{ecosystem}/{reference}api-key
POST/v1/checkapi-key
POST/v1/lockfileapi-key
GET/v1/trends/{ecosystem}?days=30admin · tyla

ecosystems: github_action · npm · pypi · docker

§ 08 — plans

Free for one repo.
Paid for fleets.

The public API is the same on every plan. The difference is the rate limit, the temporal history depth, and the webhook channel.

Free

20 req / hr · per IP

Enough for any single repo. No account needed.

  • resolve, profile, status, sign
  • community support

Pro

5,000 req / hr · per key

For teams running fleets of repos. Webhook alerts on drift.

  • history, check, lockfile
  • signed drift webhooks
  • multi-repo monitoring
  • 30-day temporal history

Enterprise

50,000 req / hr · sla

Custom policies, dedicated profiles, and a self-hosted option.

  • custom security profiles
  • self-hosted platform
  • incident response sla
  • unbounded temporal history

Defend the build,
not the apology.

A single binary, pinned hashes, scoped secrets, event-driven drift detection. Install in one line.