nono profile command provides scaffolding and tooling for creating custom profiles. Instead of reverse-engineering the JSON structure from existing profiles, you can generate skeleton files, get editor autocomplete via JSON Schema, and access an LLM-oriented authoring guide.
File Format
Profile files use JSONC (JSON with Comments): standard JSON plus// line comments, /* */ block comments, and trailing commas. Both .json and .jsonc file extensions are accepted.
Generating a Profile
Usenono profile init to scaffold a new profile:
~/.config/nono/profiles/<name>.json. Use --force to overwrite an existing file.
Minimal Skeleton
A minimal skeleton includes the core sections most profiles need:Full Skeleton
With--full, additional sections are included as empty stubs for all additive fields:
Fields that would override inherited behavior are intentionally omitted from the skeleton:
network_profile (emitting null would clear an inherited proxy profile), open_urls (would replace inherited OAuth2 origins), allow_launch_services (would override inherited browser-opening permissions), and allow_gpu (would override inherited GPU access). Add these explicitly only when you intend to change the inherited behavior.Validation
Theinit command validates inputs before writing:
- Profile name must be alphanumeric with hyphens (no leading/trailing hyphens)
--extendstarget must exist as a preset, pack, or user profile--groupsare checked against the embedded policy groups
JSON Schema
nono ships with a JSON Schema for profile files. Use it for editor autocomplete and validation.Exporting the Schema
Editor Integration
Export the schema locally, then add a$schema field to your profile for automatic validation in editors that support JSON Schema (VS Code, IntelliJ, Neovim with LSP, etc.):
.vscode/settings.json:
Authoring Guide
nono includes an embedded authoring guide designed for LLM agents assisting with profile creation:CLAUDE.md, AGENT.md, .cursorrules):
Workflow
A typical profile authoring workflow:-
Scaffold the profile:
-
Edit the generated file in your editor (with schema autocomplete):
-
Validate the profile:
-
Inspect the resolved profile (after inheritance and group expansion):
-
Compare against a baseline:
-
Test the profile:
-
Use the profile:
Available Groups
Usenono profile groups to list all available security groups. To see details for a specific group:
groups.include field. See Profiles & Groups for the full group taxonomy and built-in group list.
The
groups.include key was renamed from its former location under security in issue #594. The legacy key still deserializes with a deprecation warning; see nono profile guide for the full migration table. Legacy keys will be removed in v1.0.0.Process and IPC Isolation
Thesecurity section controls process-level isolation knobs that are not filesystem path grants:
| Field | Values | Description |
|---|---|---|
signal_mode | isolated, allow_same_sandbox, allow_all | Controls which processes the sandboxed command may signal. On Linux V6, restricted modes use Landlock signal scoping when available. |
process_info_mode | isolated, allow_same_sandbox, allow_all | Controls visibility of other process metadata. |
ipc_mode | shared_memory_only, full | Controls IPC compatibility. On Linux V6, shared_memory_only requests abstract UNIX socket scoping; full leaves abstract UNIX sockets unscoped for runtimes that require broader IPC compatibility. |
nono why --scope to inspect the effective scope policy for a profile:
Common Patterns
Agent with API Credentials
CI Build Environment
Override a Deny Rule
filesystem.bypass_protection only removes the deny rule. You must also grant access via filesystem.allow, filesystem.read, or filesystem.write (or the matching *_file variant) for the path to be accessible.Suppressing Repeated Save Suggestions
Usefilesystem.suppress_save_prompt for paths you intentionally do not want
to grant, but also do not want to see in the save-profile prompt on every run:
[save skipped], making
it clear why they are absent from the save prompt. It only suppresses
matching save-profile suggestions. filesystem.ignore is accepted as an alias,
but the canonical name is deliberately explicit so it is not mistaken for
allowing the denied path.
The post-run save prompt offers the same behavior interactively: choose
suppress to save all listed denied-path suggestions here instead of adding
them as read, read_file, allow, or allow_file grants.
Exclude Inherited Groups
Target Binary
User profiles can declare abinary field to specify the program that nono should execute. This makes the trailing -- <command> optional:
binary and a CLI trailing command are provided, the profile binary takes precedence and a warning is emitted.
Restrictions
Thebinary field is only honoured for user-authored profiles — profiles loaded from a filesystem path (e.g. ./my-profile.jsonc) or from the user profile directory (~/.config/nono/profiles/). Pack and built-in profiles cannot set binary; the field is silently ignored for security reasons.
Inheritance
When profiles are composed viaextends, the child’s binary overrides the parent’s. If the child does not specify binary, it inherits the parent’s value.
CLI Reference
| Command | Description |
|---|---|
nono profile init <name> | Generate a skeleton profile |
nono profile init <name> --extends <base> | Inherit from a base profile |
nono profile init <name> --groups <g1>,<g2> | Pre-populate security groups |
nono profile init <name> --full | Include all optional sections |
nono profile init <name> --output <path> | Write to a specific file |
nono profile init <name> --force | Overwrite existing file |
nono profile init <name> --description <text> | Set the profile description |
nono profile schema | Output JSON Schema to stdout |
nono profile schema --output <path> | Write JSON Schema to a file |
nono profile guide | Print the authoring guide |