Your CI/CD scanner says the package is clean? Great — so did the scanner that was itself compromised last Tuesday. Static analysis reads code. Tracecage runs it, in a hardened sandbox with kernel-level telemetry, intercepting every file access, network connection and process execution. Because the only way to know what a dependency actually does is to let it try. Detonate before you deploy.
AI didn't just make developers faster — it made attackers faster too. Script kiddies now generate working exploits with a prompt. Supply chain attacks that took months to craft are now templated and automated. Malicious npm packages, typosquatted PyPI libraries and backdoored Docker images are published faster than any advisory database can track.
Your CI/CD scanner checks signatures and CVE databases — but what about the package that was published 20 minutes ago? The one with clean code, zero CVEs and a postinstall script that quietly exfiltrates your ~/.ssh/id_rsa to a Telegram bot?
Static analysis reads code. Reputation databases check history. But neither tells you what happens when the code actually runs. That's what Tracecage does — detonate first, deploy after.
One command. No setup wizard. No config files. Firecracker, kernel, rootfs images and the monitoring agent — all baked into the Docker image.
# Run Tracecage — everything is included in the image docker run -d \ --name tracecage \ -p 3000:3000 \ --device /dev/kvm:/dev/kvm \ jotka/tracecage:latest # Submit an artifact via API curl -X POST http://localhost:3000/api/v1/submit \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"artifactType":"npm","source":"suspicious-pkg@1.0.0"}' # Check the verdict curl http://localhost:3000/api/v1/verdict/1 \ -H "Authorization: Bearer $TOKEN"
Every syscall, every connection, every file touch — captured and classified in real time. Nowhere to hide.
Kernel-level telemetry captures every file read, write, search and directory traversal inside the sandbox.
All outbound connections, DNS queries and HTTP requests are intercepted, logged and optionally blocked.
Full process tree reconstruction with command-line arguments, exec paths, fork chains and exit codes.
Detect artifacts that try to fingerprint and evade the sandbox before showing their true behavior.
Plant fake credentials, SSH keys, API tokens and cloud configs inside each cage. Any access is an instant red flag.
Configure per-run whitelist policies for files, IPs, domains and ports. Three verdict levels: benign, suspicious, policy-violating.
REST API with UI-managed tokens. Submit artifacts, poll status and gate deployments on verdicts.
Not just Docker — layered isolation with gVisor, seccomp-BPF and optional microVM support via Firecracker.
Combine behavioral analysis with artifact signatures, SBOMs, CVE scan results and ecosystem reputation scores.
Don't want to detonate suspicious packages on your own infrastructure? We'll do it on someone else's. Fully isolated cloud workers with the same telemetry, none of the risk.
Detonate someone else's malware on someone else's infrastructure.
Curated detection rules, domain reputation enrichment, MITRE ATT&CK mapping, fake credential bait tuned to current campaigns, and richer verdict explanations your compliance team will actually read.
Defense in depth — every layer adds visibility without trusting the layer below it. Trust issues? We prefer "security-conscious."
Tracecage controller (SvelteKit + Node.js) │ ├── Docker API → create/start/stop containers │ │ │ └── Sandbox container (gVisor/runsc or runc) │ │ │ ├── Artifact under test (npm/pypi/maven/binary) │ ├── Deception honeypots (fake creds, SSH keys) │ ├── Seccomp-BPF profile (block ptrace/mount/reboot) │ ├── Read-only rootfs + tmpfs overlay │ └── Isolated network (no egress by default) │ ├── eBPF probes → scoped to container cgroup │ ├── File access tracing (openat, read, stat, getdents) │ ├── Process exec tracing (execve, clone, exit) │ └── Network connect tracing (connect, sendto) │ ├── DNS interceptor (sidecar container) │ ├── Log all queries │ ├── Apply domain whitelist │ └── Respond or NXDOMAIN │ ├── iptables logger → LOG + DROP/ACCEPT per whitelist │ └── Event collector → JSONL → database → SSE to UI For Docker image artifacts: DinD (Docker-in-Docker) inside sandbox container └── Inner daemon fully isolated in sandbox network Optional microVM isolation: Firecracker via /dev/kvm passthrough └── Each cage runs in its own microVM (strongest isolation)
Purpose-built detonation scripts for each package ecosystem
Install scripts, require hooks, postinstall payloads
setup.py hooks, import side effects, entry points
JAR execution, plugin hooks, class loading behavior
ELF/Mach-O executables with full strace wrapping
Docker-in-Docker with inner daemon fully sandboxed
Plant convincing honeypots inside every cage — if the artifact goes looking for your SSH keys, it'll find ours instead
Fake RSA/Ed25519 private keys, known_hosts with production hostnames, SSH config with interesting targets. Detects credential theft and lateral movement preparation.
Fake cloud provider credentials, config files and service account keys. Catches cloud-focused supply chain attacks.
Planted .npmrc, .pypirc, .git-credentials and .yarnrc with realistic auth tokens. Detects registry credential exfiltration.
Fake Docker registry credentials, kubeconfig with cluster endpoints and service account tokens.
Fake .env and .env.production files with database URLs, API secrets, Stripe keys and JWT secrets.
Create your own deception packs with files tailored to your infrastructure. Plant anything — if the artifact touches it, it's flagged.
Gate your deployments on behavioral verdicts with a simple REST API. If it fails, blame the package, not the pipeline.
# GitHub Actions example - name: Submit to Tracecage run: | CAGE_ID=$(curl -s -X POST \ $TRACECAGE_URL/api/v1/submit \ -H "Authorization: Bearer $TC_TOKEN" \ -H "Content-Type: application/json" \ -d '{"artifactType":"npm", "source":"$PACKAGE_NAME", "quarantineDuration":600}' \ | jq -r '.id') # Poll for verdict while true; do RESULT=$(curl -s \ $TRACECAGE_URL/api/v1/verdict/$CAGE_ID \ -H "Authorization: Bearer $TC_TOKEN") COMPLETED=$(echo $RESULT | jq -r '.completed') if [ "$COMPLETED" = "true" ]; then PASS=$(echo $RESULT | jq -r '.pass') if [ "$PASS" != "true" ]; then echo "Tracecage verdict: FAIL" exit 1 fi break fi sleep 30 done
POST /api/v1/submit — submit artifactGET /api/v1/status/:id — poll statusGET /api/v1/verdict/:id — get pass/fail verdictGET /api/v1/report/:id — full report (JSON/CSV)Download full detonation reports in JSON, CSV or text format from the UI or API. Every event, every verdict reason, every deception hit.
Create and revoke API tokens from the web UI with granular permissions: submit, read, admin. Tokens are shown once at creation — never stored in plaintext.
Full detection quality on every tier. No crippled free version. We're not that kind of company.
For solo developers, OSS maintainers and the gloriously paranoid. Full engine, no compromises, no "upgrade to see results" nonsense.
For teams that wire Tracecage into CI and want to sleep at night. Cheap enough to expense without procurement.
For companies that can't afford to run unvetted code in their infrastructure. SSO, audit trails and air-gapped deployment.
Know exactly what your dependencies do before they run in production. Or keep trusting npm install. Your call.