Oh-My-NavLogg inn

Bygget med GitHub Copilot

PersonvernTilgjengelighetGitHub

cplt — Your AI agent is sandboxed.

Kernel-level isolation for AI coding agents. Your secrets stay secret — enforced by the OS, not by trust.

navikt/cplt★ 64
cplt — sandboxed Copilot session
cplt demo: Copilot agent attempts to read credentials and exfiltrate data, all blocked by cplt sandbox
brew install navikt/tap/cplt
curl -fsSL https://raw.githubusercontent.com/navikt/cplt/main/install.sh | bash

macOS (Apple Seatbelt) · Linux (Landlock + seccomp-BPF)

Security boundary

What your agent can and cannot access — enforced at the kernel level.

Resource

Without cplt

With cplt

Project directory (read/write)

Allowed

Allowed

Secrets (.env*, .pem, .key, SSH keys)

⚠

Exposed

Protected

Your agent sees the code, not your secrets.

Four layers of kernel-enforced protection — no userspace bypass possible.

Filesystem Isolation

Kernel-level blocks on secrets, credentials, keys, and .env files. Your ~/.ssh, ~/.aws, and registry credentials are invisible to the agent.

Network Control

CONNECT proxy intercepts all outbound traffic. Blocklist or allowlist mode, private IP protection, full audit logging.

Environment Hardening

npm lifecycle scripts disabled, safe env var allowlist, git hooks write-protected, no exec from /tmp.

Multi-platform Enforcement

Same policy on macOS (Seatbelt) and Linux (Landlock + seccomp-BPF). Kernel-enforced — no userspace bypass.

Network proxy

All outbound traffic routes through a local CONNECT proxy. Block, allow, or audit — your choice.

cplt sandboxAI Agentcurl, fetch, gitCONNECT Proxylocalhost:ephemeralBlocklist / AllowlistPrivate IP filterDNS rebinding protectionAudit log ✓✓ AllowedInternetgithub.com, npm, PyPI, api.openai.comAllowlisted or not in blocklist✗ BlockedDroppedwebhook.site, ngrok.io, pastebin.com169.254.x.x, 10.x.x.x, tunneling servicesproxy.blocked_domains~70 domains · hot-reload every 5s

Multi-agent support

Same sandbox, different agents. Choose the AI that fits your workflow.

GitHub Copilot CLI

Default. Runs Copilot CLI in sandbox with full filesystem and network isolation.

cplt -- -p "fix the tests"

OpenCode

Runs OpenCode in sandbox. Same kernel-level protections, different AI agent.

cplt --agent opencode

Shell

A sandboxed shell with no AI. Useful for testing what the sandbox allows and blocks.

Team configuration

Commit sandbox settings to your repo. Everyone gets the right config automatically.

.cplt.toml
# Tighten automatically — no approval needed
[deny]
env = ["VAULT_TOKEN", "NPM_TOKEN"]

# Propose — requires `cplt trust` approval
[propose]
allow_localhost_any = true

[propose.allow]
ports = [5432]
localhost = [3000]

[deny] — auto-applied

Can only tighten the sandbox. Block env vars, deny file paths — no approval needed.

[propose] — requires approval

Request additional permissions. Each developer approves with cplt trust accept --all. Content-pinned — any change invalidates the approval.

Auto-detect your project

cplt init scans your project for build files, frameworks, and patterns — then generates the right .cplt.toml automatically.

$ cplt init
Detected:
  Spring Boot  application.yml + spring-boot-starter
  Flyway       db/migration/ directory
  Docker       Dockerfile + compose.yml
  Gradle       build.gradle.kts
  .env         .env.example found

Generated .cplt.toml:

# Deny access to sensitive env vars
[deny]
env = ["DB_PASSWORD", "API_KEY"]

[propose]
allow_jvm_attach = true

[propose.allow]
ports = [5432]
localhost = [8080]

⚠ allow_docker  Docker detected — grants broad access

Run cplt init --write to save

15 ecosystem detectors

Each detector knows which sandbox permissions the ecosystem needs. Dangerous permissions get risk warnings.

JVMGradle / Maven

Configuration

Every option explained. Search by name or description.

Type to search or select a section to browse 0 config options.

How it works

Three steps from zero to sandboxed agent.

STEP 1

Install

brew install navikt/tap/cplt

One command via Homebrew (macOS). Linux: see install script.

STEP 2

Configure

cplt init --write

Detect your project's tooling and generate sandbox config.

Trust the kernel, not the agent.

Open source. MIT licensed.

GitHubSecurity PolicyMIT License

Credentials (~/.aws, ~/.azure, ~/.m2, ~/.gradle, ~/.cargo)

⚠

Exposed

Protected

Git hooks, /tmp execution, SSH agent

⚠

Exposed

Protected

Outbound network (HTTPS)

⚠

Exposed

Filtered*

Private IPs and localhost

⚠

Exposed

Protected

Copilot auth and tool caches (read-only)

Allowed

Allowed

*Routed through CONNECT proxy — telemetry and non-allowlisted domains are blocked.
All blocks are enforced by the operating system kernel. No userspace bypass is possible.

proxy.allowed_domainsFail-closed strict mode
cplt --agent shell

Tamper-proof

Read from git HEAD, not the working tree. The agent cannot modify its own sandbox config.

Node.js
npm / pnpm
DockerCompose
Pythonpip / uv
Spring Boot8080 + PG
Ktor8080
Next.js3000
FlywayPG 5432
Playwrightbrowsers
Rust / Godefaults

Personal config with --global

Detects Gradle wrapper, Playwright browsers, GPG signing, and alternative agents on your machine. Writes to ~/.config/cplt/config.toml.

STEP 3

Run Your Agent

cplt -- -p "fix the tests"

Your agent works normally — but secrets are invisible.

Make it the default

Run cplt --shell-install so copilot always runs sandboxed.

$ cplt --shell-install
✓ Added to ~/.zshrc
✓ copilot → cplt (sandboxed)

Restart your shell or: source ~/.zshrc
View on GitHub →