Skip to content

BlastShield is in beta and may contain bugs. Validate it in a non-production environment before relying on it for safety-critical workflows.

Profiles

All cloud profiles enforce a default-deny posture for mutations. The AI agent can inspect resources (list, describe, get, plan) but cannot modify them. Any mutating operation — apply, deploy, create, delete, update — requires the user to run it manually.

This is by design: the agent plans, you execute.

Profiles are SBPL (Seatbelt Profile Language) files in profiles/. They compose by intersection — every deny rule from every loaded profile is enforced.

For .app launches, BlastShield uses GUI compatibility mode: it skips the always-loaded secrets profile and skips project profile auto-detection, because long-lived GUI apps often run startup checks that need normal CLI auth files. BlastShield automatically adds gui-app for .app bundles and conductor-app for Conductor’s com.conductor.app bundle id. Explicit -p profiles still apply.

ProfileAlways LoadedPurpose
baseDeny-all default, project writes, system reads
secretsProtect SSH keys, cloud creds, browser data
terraformAutoState file protection, deny all tfstate writes
gcloudAutoGCP credential protection, ADC denial
awsAutoAWS credential protection, SSO cache denial
azureAutoAzure credential protection, MSAL cache denial
kubectlAutoKubeconfig write protection, SA token denial
ghAutoGitHub auth protection, workflow file locks
installAutoPackage manager install blocking, lockfile protection, global dir protection
gui-app.appGUI app compatibility for Launch Services-style apps
conductor-appConductor .appConductor-managed workspace and repo writes

Create profiles in ~/.config/blastshield/profiles/:

;; ~/.config/blastshield/profiles/custom.sb
;; Deny access to internal API keys directory
(deny file-read* (subpath "/Users/you/secrets"))
(deny file-write* (subpath "/Users/you/secrets"))

Load with -p:

Terminal window
blastshield -p custom claude

The foundation of every BlastShield session. Establishes a deny-by-default policy and opens only the minimal paths needed for an agent to function.

PolicyDetail
DefaultDeny all
Project writesAllowed in current working directory
System readsAllowed for standard system paths
Process executionAllowed for standard binary paths
NetworkOutbound allowed, inbound allowed
Codex runtime writesAllowed under ~/.codex, except auth/config/rules/skills/memories
Claude runtime writesAllowed under ~/.claude, except settings/plugins/native integration
Grok Build runtime writesAllowed under ~/.grok for sessions, memory, logs, sockets, and auto-update binaries; auth, config, policy, skills, plugins, and hooks stay protected
Gradle cache/state writesAllowed under ~/.gradle, except user-level init/config files
Browser / OAuth opensAllowed via Launch Services (lsopen) so CLI agents can open the system browser for login and MCP OAuth
Mount/unmountDenied
IOKitDenied

Protects the most sensitive files on your system — the ones that, if read by an AI agent, would give it credentials to act on your behalf.

ProtectedPath
SSH keys~/.ssh/
Cloud credentials~/.aws/, ~/.azure/, ~/.config/gcloud/
Browser dataSafari, Chrome, Firefox profile data
Shell init files.bashrc, .zshrc, .profile
Git credentials~/.gitconfig, ~/.netrc

Prevents ALL state mutations — not just destroy. The agent can plan but not apply. State files are read-only.

BlockedAllowed
terraform applyterraform plan
terraform destroyterraform init, fmt, validate
terraform import, taint, untaintterraform show, output, console
terraform refreshstate list, state show
terraform state rm/mvworkspace list, workspace select
ALL tfstate writesterraform providers, version, graph
Plan file writes (.tfplan)
Provider/module downloads

Auto-detection trigger: *.tf files in project directory

Protects GCP credentials and blocks ALL mutating gcloud operations.

BlockedAllowed
gcloud * delete/create/deploy/updategcloud * list/describe/get
gcloud * add/remove/patch/setgcloud auth status
gcloud * enable/disable/submitgcloud config list/get
gcloud builds submitgcloud version, help
gcloud app deploy
Service account key reads

Auto-detection trigger: .gcloudignore, cloudbuild.yaml, app.yaml

Protects AWS credentials and blocks ALL mutating AWS CLI operations.

BlockedAllowed
aws * delete/create/put/updateaws * describe-/list-/get-
aws * deploy/terminate/run-aws s3 ls, cp (download), presign
aws * start-/stop-/rebootaws sts get-caller-identity
aws * authorize/revoke/sendaws logs describe-/get-/filter-
Credential readsaws dynamodb scan/query/get-item
SSO token cache readsaws iam list-/get-
CDK/SAM state writesaws lambda list-, invoke

Auto-detection trigger: serverless.yml, template.yaml, cdk.json, samconfig.toml

Protects Azure credentials and blocks ALL mutating Azure CLI operations.

BlockedAllowed
az * delete/create/update/deployaz * list/show
az * set/remove/add/lock/unlockaz account show/list
az * scale/restartaz version, help
ALL ~/.azure access

Auto-detection trigger: azure-pipelines.yml, local.settings.json

Protects Kubernetes cluster access — read-only inspection only.

BlockedAllowed
kubectl apply/create/deletekubectl get/describe/logs
kubectl patch/scale/execkubectl top, events
kubectl taint/cordon/uncordon/drainkubectl api-resources/versions/explain
kubectl rollout restart/undokubectl auth can-i
kubectl label/annotate/setkubectl config view/get-contexts
kubectl expose/run/cp/debugkubectl rollout status/history
Kubeconfig writeskubectl version
Helm install/upgrade/deleteHelm list/status/show/search

Auto-detection trigger: kustomization.yaml, Chart.yaml, skaffold.yaml

Protects GitHub authentication — prevents destructive repo operations and CI manipulation.

BlockedAllowed
gh repo delete/edit/renamegh repo list/view/clone/fork
gh pr create/merge/close/editgh pr list/view/diff/checks/status/checkout
gh release deletegh release create/list/view/download
gh workflow disable/enablegh workflow list/view
gh run cancelgh run list/view/watch
gh issue create/close/commentgh issue list/view
gh api -X DELETE/PUT/PATCH/POSTgh api with GET/HEAD
Workflow file writesgh auth status
CODEOWNERS writes, gh secret set

Auto-detection trigger: .github/ directory

Prevents AI agents from installing new dependencies without human review. Adding packages introduces supply chain risk, license obligations, and runtime bloat. Both the command-argument level (guard) and the filesystem level (sandbox profile) are protected.

BlockedAllowed
npm install / ci / addnpm list / ls / view / info / outdated
yarn add / install / removeyarn list / info / why / outdated
pnpm add / install / removepnpm list / info / why / outdated
pip install / uninstall / buildpip list / show / freeze / check
brew install / reinstall / uninstallbrew list / info / search / outdated
gem install / uninstall / buildgem list / search / spec / query
cargo install / add / rmcargo search / tree / list / metadata
hermit install / uninstall / upgradehermit list / search / help / info
apt install / remove / purgeapt list / search / show / cache
dnf install / remove / upgradednf list / search / info / check
Global package directories (writes)Global package directories (reads)
Lockfile writesLockfile reads

Auto-detection trigger: package.json, requirements.txt, Pipfile, pyproject.toml, Gemfile, Cargo.toml, go.mod, .hermit

Filesystem protections:

  • Denies writes to global npm/yarn/pnpm directories
  • Denies writes to pip cache and user site-packages
  • Denies writes to Homebrew Cellar, Caskroom, and Taps
  • Denies writes to gem, cargo, and hermit install directories
  • Denies writes to lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, Gemfile.lock, Cargo.lock, poetry.lock, uv.lock)

Note: Local installs (e.g., npm install into node_modules/) are blocked by the guard but not by the sandbox profile — project writes are allowed by base.sb. The guard is the primary defense for local installs; this profile provides defense-in-depth for global/system installs.


Enables macOS GUI app launches while keeping child processes inside the BlastShield sandbox. BlastShield auto-adds this profile when it detects open /path/to/App.app.

AllowedWhy
GUI app bundle readsLocate and execute app bundle binaries
Launch Services URL/document opensExternal links and “open in browser” actions
WebKit sandbox extension issuanceEmbedded auth/UI web views
Power registrationNormal sleep/wake notification setup
Metal/CoreAnimation/IOSurface GPU accessMetal-backed GUI rendering, including Zed
~/Library/Application Support, ~/Library/Caches, ~/Library/Preferences, ~/Library/Logs writesNormal per-user app state and logs

For GUI app launches, BlastShield also keeps runtime guards ahead of user shell paths, even when the app rebuilds PATH through a login shell. In interactive terminals, GUI app logs are streamed until the app exits or you press Ctrl-C.

Auto-detection trigger: any .app bundle passed through open

Supports Conductor as a first-class GUI app launch target. BlastShield auto-adds this profile when the app bundle identifier is com.conductor.app.

AllowedWhy
~/conductor/workspaces writesConductor agents edit workspace files
~/conductor/repos writesConductor manages root checkouts and shared repo state
~/.conductor writesConductor user settings and local app state

The Conductor profile intentionally allows full writes under those managed roots so git worktree can create new workspaces from repos that track project metadata such as .idea, .vscode, or .mcp.json. Use explicit profiles or a custom profile when a Conductor session needs stricter write policy.

Auto-detection trigger: .app bundle with CFBundleIdentifier = com.conductor.app

See the Conductor guide for the supported launch workflow.


Profiles are loaded in this order:

  1. base — always (deny-by-default foundation)
  2. secrets — always (credential and SSH key protection)
  3. GUI compatibility profiles — gui-app for .app bundles, plus conductor-app for Conductor
  4. Auto-detected profiles — based on project directory contents
  5. Explicitly specified profiles — via -p flag

For GUI app launches, secrets is skipped and project profile auto-detection is skipped. Explicit profiles still apply.

All deny rules from all profiles are enforced. Allow rules must pass every profile’s checks. This means adding more profiles can only make the sandbox more restrictive, never less.