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 |
| 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)
Command Blocking
Dangerous commands are blocked by default:
| Category | Commands |
|---|---|
| File destruction | rm, rmdir, shred, srm |
| Disk operations | dd, mkfs, fdisk, parted |
| Permission changes | chmod, chown, chgrp |
| Privilege escalation | sudo, su, doas |
Override per invocation with --allow-command, or permanently in a profile with allowed_commands:
# Per invocation
# Via profile
Documentation
License
Apache-2.0