nono-cli
CLI for capability-based sandboxing using Landlock (Linux) and Seatbelt (macOS).
Installation
Homebrew (macOS/Linux)
Cargo
From Source
Usage
# Allow read+write to current directory
# Separate read and write permissions
# Multiple paths
# Block network access
# Use a built-in profile
# Use the Codex profile
# Keep a profile but temporarily allow unrestricted network
# Start an interactive shell inside the sandbox
# Check why a path would be blocked
# Dry run (show what would be sandboxed)
Themes
The CLI supports named output themes for banners, summaries, warnings, and status text.
Available themes: mocha, latte, frappe, macchiato, tokyo-night, minimal
# Per invocation
# Environment variable
# Config file
# ~/.config/nono/config.toml
# [ui]
# theme = "frappe"
Precedence is: CLI flag, then NONO_THEME, then config file, then the default mocha.
Built-in Profiles
| Profile | Command |
|---|---|
| Claude Code | nono run --profile claude-code -- claude |
| Claude Code (No Keychain) | nono run --profile claude-no-kc -- claude |
| Codex | nono run --profile codex -- codex |
| OpenCode | nono run --profile opencode -- opencode |
| OpenClaw | nono run --profile openclaw -- openclaw gateway |
| Swival | nono run --profile swival -- swival |
Profile Inheritance
User profiles can extend built-in or other user profiles with the extends field. The child inherits all settings from the base and only declares additions or overrides.
You can also extend multiple profiles at once. Bases are merged left-to-right, then the child overrides:
Save to ~/.config/nono/profiles/my-claude.json, then:
Merge semantics
- Lists (filesystem paths, security groups, rollback patterns): appended and deduplicated
- HashMaps (credentials, hooks): merged, child wins on same key
- Booleans (
network.block,interactive): OR — either activates - Scalars (
meta): child overrides - Nullable scalars (
network_profile): absent inherits,nullclears, string overrides
When extending multiple bases, they are merged left-to-right using the same rules. The child then overrides the accumulated base.
Chaining
Profiles can form chains (up to 10 levels deep). Circular dependencies are detected and rejected. Shared transitive bases are deduplicated.
my-dev.json → team-base.json → claude-code (built-in)
Deprecated Command Blocking
Command blocking is deprecated in v0.33.0. It is only checked against the
directly-invoked startup command, not enforced for child processes, and should
not be treated as a sandbox security boundary.
Dangerous commands are still startup-blocked by default in v0.33.x:
| Category | Commands |
|---|---|
| File destruction | rm, rmdir, shred, srm |
| Disk operations | dd, mkfs, fdisk, parted |
| Permission changes | chmod, chown, chgrp |
| Privilege escalation | sudo, su, doas |
Compatibility overrides still exist temporarily:
# Per invocation
# Via profile
Prefer resource-based controls instead: narrower filesystem grants,
add_deny_access, unlink_protection, and network policy.
Documentation
License
Apache-2.0