NUU Guide
Reference

Configuration Reference

This page documents the configuration files and the state files of a Flint.

The Three Layers

Flint configuration separates into three layers.

  • The committed declaration that a person edits (flint.toml).
  • The committed machine-managed identity of the Flint (flint.json).
  • The local fulfillment and runtime state of this machine (.flint/).

A Flint declares what it is and what it needs. Each machine fills in its own paths and live state.

Main Files

FileLocationPurposeEdit
flint.tomlFlint rootHuman-edited declaration of the Flintyes
flint.jsonFlint rootMachine-managed state of the Flint, tracked in gitusually no
.gitignore, .gitattributesFlint rootThe Git policy of the Flint. Flint writes the managed block between # === Flint Managed (do not edit) === and # === End Flint Managed ===outside the managed block only
.flint/local.json.flint/The local version record: the Flint Version of the local state and the ledger of the local migrationsno
.flint/references.json.flint/Local fulfillment for reference-style resourcesno
.flint/shards.json.flint/The local records of the shards: the facts of this machineno
.flint/sync.json.flint/Last sync timestampno
.flint/modules.json.flint/The local records of the modules: the facts of this machineno
.flint/modules/<name>/.flint/The data folder of one module on this machineno
.flint/run/modules/<name>.log.flint/The output of the process of a live moduleno
Modules/Flint rootThe builds and the sources of the modules, and the settings file of each module (<Name>.settings.toml)the settings files and the local sources only
flint.envFlint rootThe env values of the Flint. Git ignores it.yes
flint.env.localFlint rootThe env values of this machine. A value here wins over flint.env. Git ignores it.yes
flint.env.exampleFlint rootThe names of the env values, with no values. Tracked.yes
.flint/locks/, .flint/staging/.flint/The lock files of running writes, and the temporary folders of installs and clonesno
.obsidian/Flint rootThe Obsidian payload (release files), the settings files, and the runtime files of Obsidiansettings files only, in Obsidian
.flint/obsidian/.flint/The records of the Obsidian payload on this machine: the installed state, the manifest, the resolved applied settings, the last applied result, and the profile receiptno
.flint/backups/obsidian/.flint/The Obsidian backups of this Flintno
.orb/Flint rootOrbh session and event stateno
.steel/Flint rootSteel preferences and plate stateno
flint-hooks.tomlFlint rootThe hook configuration of the Flint server runtimeyes, when you use the runtime
~/.nuucognition/config.tomlglobalThe NUU config: your Name, the machine names, and the org of this machineyes
~/.nuucognition/machine.jsonglobalThe id of this machineno
~/.nuucognition/orbh/settings.jsonglobalThe Orbh settings of this machine: the machine layer of the default target list (defaultTargets)with flint orbh profiles default set
~/.nuucognition/computer-flint.jsonglobalThe claim of the Computer Flint: the id and the path of the Computer Flint of this machineno
~/.nuucognition/flint/failures/globalThe failure records of the failed Flint commands, the newest 20 (see Doctor and Fix > The Failure Record)no
~/.nuucognition/flint/config.tomlglobalThe Flint CLI config of this machine (flint-dev/config.toml for a dev build)yes
~/.nuucognition/places.jsonglobalThe roster: the Flints that this machine knowsno
~/.nuucognition/flint/registry.jsonglobalThe copy of the rosterusually no

flint.toml

flint.toml is the main declaration file for a Flint. It describes the environment that Flint materializes.

[flint]
name = "My Notes"
type = "flint"
preset = "default"
visibility = "private"
tags = ["research"]
description = "Example Flint"
org = "nuucognition"

[shards]
flint = { source = "@nuucognition/flint@0.3.5", git = "NUU-Cognition/shard-flint" }
projects = { git = "NUU-Cognition/shard-projects" }
notepad = "@nuucognition/notepad@^1.1"
knap = { source = "@nuucognition/knap", git = "NUU-Cognition/shard-knap", from = "source" }

[sources]
repositories = [
  { name = "Design System", url = "https://github.com/org/design-system" },
]
bundles = [
  { source = "flint", name = "Research Hub/Guide" },
]

[workspace]
repositories = [
  { name = "App", url = "https://github.com/me/app.git" },
]

[references]
codebases = [
  { name = "Flint" },
]
flints = [
  { name = "Research Hub" },
]
bundles = [
  { source = "flint", name = "Research Hub/Guide" },
]

[orbh]
default = ["claude/o55h", "codex/a6h"]

[obsidian.applied.appearance]
enabledCssSnippets = { add = ["blockquote-tables"] }

[modules]
dms = "@nuucognition/module/dms"
crons = "@nuucognition/crons"

[flint]

Identity fields of the Flint:

KeyMeaning
nameThe name of the Flint. Required.
typeThe type slug of the Flint, for example flint.
presetThe preset that made the shard list. Information only.
variantThe old spelling of preset. Reads only. A writer removes it.
visibilityprivate, org, or public. Absent means the default of the type.
tagsA list of tags.
descriptionA short description.
orgThe org slug that the Flint declares.

flint.json#org holds the org of the Flint with its id and its slug. flint org set <org> writes both. flint org show shows both.

The [flint] table is the only section that Flint validates strictly at whole-file parse time. Feature-owned sections are tolerant: malformed entries stay for drift reporting instead of rejecting the whole file, and unknown sections and keys pass through.

[shards]

[shards] declares the cognitive programs of the Flint. Each key is the alias of one shard in this Flint. See Shards.

A string value is a package spec: @org/name[@range][#place]. A table value holds these fields:

FieldMeaning
sourceThe package spec, a path (./, ../, ~, or an absolute path), or a Git location (owner/repo).
gitThe Git location (owner/repo) that a person chose. It goes with a package spec in source, or with no source.
from"source": build the shard from its source in this Flint.
usecopy (a build under Shards/), reference (no build; the loader reads the folder in its place), or none (a source with no build here). Absent means copy.
ofThe shard of a declaration that the merge keeps apart. It names another record of [shards].
idThe id of the package (a UUID). A reader accepts it. The CLI never writes it: the lock record holds the id.
versionRetired. The spec carries the version (@0.4.0). A record with version is not valid. The next command is flint migrate rerun flint-0.6.0-to-0.7.0-s6.
editRetired. edit = true was the 0.6.0 form of from = "source" plus git = <source>. A record with edit is not valid. The next command is flint migrate rerun flint-0.6.0-to-0.7.0-s6.

Every other field stays as it is and changes no meaning. flint shard install with a source writes a record. flint shard install --from-git <owner/repo> writes <alias> = { source = "<spec>", git = "<owner/repo>" } for a package the registry knows (the spec carries @<tag> when the build hash matches a registry version), and <alias> = { git = "<owner/repo>" } only for an unregistered package or when the registry does not answer. flint shard install with no argument makes the lock match the records.

The shard registry serves versions of most NUU Cognition shards (Flint 0.4.0, Orbh 0.5.0, Knap 1.2.0, and more). An install by package spec resolves its range against the registry. With no range, it takes the latest release. A few older records still have no shard id. Install one of those with flint shard install --from-git NUU-Cognition/shard-<slug>.

A Flint of 0.6.0 has the old lists installed, dev-remote, and dev-local. flint migrate run rewrites them to records. Until then, flint shard list, status, and start read them with a notice, and every shard write is refused.

[sources]

[sources] declares read-only material that flint sync fetches. See Sources.

KeyMeaning
repositoriesReference repos. Each entry holds name and url. Sync puts a snapshot of each one into Sources/Repos/<name>/: a shallow clone with no .git.
bundlesBundle entries. Each entry holds source = "flint" and name in slash form ("Flint Name/Bundle Name").

A bundle entry names a bundle of a producer Flint. flint sync copies Exports/(Bundle) <Bundle Name>/ of the producer Flint into Sources/Bundles/<Bundle Name>/. No command adds or removes a bundle source entry. A person edits it by hand.

[workspace]

[workspace] declares full-cloned working repos. See Workspace.

KeyMeaning
repositoriesManaged repos. Each entry holds name and url. Sync clones each one into Workspace/Repos/<name>/. Then each sync runs git fetch origin in it and reports how it stands against its base. Sync never pulls.

[references]

[references] declares names that resolve to paths on this machine. See References.

KeyMeaning
codebasesCodebase references. Each entry holds name.
flintsFlint references. Each entry holds name.
bundlesBundle references. Each entry holds source = "flint" and slash-form name.

flint reference codebase <name> <path> writes the declaration and records the path in .flint/references.json. flint reference flint <name> and flint reference remove <name> write the declaration only. flint fulfill records a local path for a codebase reference. flint sync fulfills the references.

[plates]

[plates] holds the plate declarations of Steel, keyed by plate name. A declaration can hold title, source, version, path, and repo.

[server]

[server] holds settings of the Flint server of this Flint.

KeyMeaning
orb-browsetrue or false: turns on the Orbh browse of the Flint server. The environment variable FLINT_ORBH_BROWSE wins over it. Absent means off.
dev-originsAuthorizes nothing. Git shares flint.toml, so it cannot authorize an origin. The Flint server prints one notice that names [orbit] devOrigins of the Flint CLI config.

[orbh]

Current field:

  • default: the Flint layer of the default target list of Orbh. It is a list of one or more runtime/profile targets, in order.
[orbh]
default = ["codex/a6h", "claude/o55h"]

A command of Orbh with no target (flint orbh i, flint orbh launch "<prompt>", flint orbh request "<prompt>") in this Flint starts the first available target of this list. The Flint layer replaces the machine layer and the shipped list; it does not merge with them. flint orbh profiles default set --flint <target>... writes the key, and flint orbh profiles default unset --flint removes it. A value that is not a list of targets stops each launch with no target in this Flint. The refusal names flint orbh profiles default unset --flint -p <the Flint root>. See Agent Sessions > The Default Target List.

[obsidian]

[obsidian] holds only applied: the Flint layer of applied settings. See Using Obsidian.

[obsidian.applied.appearance]
cssTheme = "Baseline"
enabledCssSnippets = { add = ["blockquote-tables"], remove = ["old-snippet"] }

[obsidian.applied.app]
showLineNumber = true

The tables under [obsidian.applied] are appearance and app. A string, a boolean, or a number sets one key. { add = [...] } and { remove = [...] } change a list. { set = [...] } sets a whole list. The Flint layer wins over the machine layer and the release layer. flint obsidian applied set <file>.<key> <value> and flint obsidian applied unset <file>.<key> write this table.

[modules]

[modules] holds one record for each module of the Flint. A module is a package of the kind module, as a shard is a package of the kind shard: it has a source, a version, a lock record, and a build in Modules/. The pages Module - … of these docs use the word "module" for an area of Flint; that is a different meaning. See Modules, Crons, and DMs and Write a Module.

[modules]
dms = "@nuucognition/module/dms"                                 # A package spec
crons = "@nuucognition/crons"                                    # The short form @<org>/<slug> names the same package
hello = { source = "@/hello", from = "source" }                  # Built from its source in this Flint
bot = { source = "@acme/bot", git = "acme/module-bot" }          # A package with its Git location
FieldMeaning
The keyThe name of the module in this Flint: kebab-case. It is the first word of flint module <name> <command>, the data folder .flint/modules/<name>/, and FLINT_MODULE_NAME. A verb of flint module (list, status, install, uninstall, build, update, release, start, stop, restart, control, settings, help) cannot be a key.
sourceRequired. A package spec (@org/name[@range][#place]), a path, or owner/repo. A string value is the record { source = <string> }.
gitThe Git location of a package spec: owner/repo.
from"source": build the module from its source in this Flint.
use"copy", "reference", or "none". The same rule as for a shard record. "none" makes no build, and no process of the module runs.

flint module install, uninstall, and build write the records. flint sync makes the builds match the lock, runs the plan of each module, and makes the objects of the modules on this machine (cron schedules, stations). When a record goes away, sync pauses the objects of its module; it never deletes them. The objects are in the Orb store .orb/ of each machine.

A table [modules.<id>] with no source key is a legacy declaration of the built-in modules of the 0.7.0 pre-releases. Sync never reads it as a record, and no migration moves it. A legacy table does not make the Flint behind. flint module list, the sync report, and flint doctor name it with a step by hand and the next command flint module install @nuucognition/module/<id>. To replace [modules.crons] or [modules.dms]: move its keys, without enabled, to Modules/Crons.settings.toml or Modules/DMs.settings.toml (each [modules.crons.schedules.<name>] becomes [schedules.<name>]), remove the table, then run flint module install @nuucognition/module/<id> and flint sync. When the table has enabled = false, do not install the module.

The Settings Files

The settings of a module in this Flint are in Modules/<Name>.settings.toml. <Name> is the folder of the build: Modules/Crons.settings.toml for the record crons, Modules/DMs.settings.toml for the record dms. Git tracks the file. A build, an install, and an update never change it, and flint module uninstall keeps it. The manifest of the module names its keys. A settings file that does not parse fails the plan of its module, and sync does not reconcile that module. After a change, run flint sync.

The Settings of the Module crons

KeyMeaning
machineThe default owner machine of the schedules: a machine slug, or a machine id (UUID).
targetThe default target of the fired sessions: <runtime> or <runtime>/<profile>. Absent means the Orbh default target.
schedules.<name>One schedule (a table [schedules.<name>]). The key is the name of the schedule: lower-case letters, digits, and hyphens.
machine = "katana"

[schedules.morning-brief]
expr   = "0 7 * * 1-5"
prompt = "Write the brief of the day."

The keys of [schedules.<name>]:

KeyMeaning
exprRequired. A 5-field cron expression.
promptThe prompt of the fired session. Give exactly one of prompt and prompt-file.
prompt-fileA file inside the Flint, relative to the Flint root, that holds the prompt. Sync stores its text.
timezoneAn IANA timezone. Absent means the clock of the owner machine.
descriptionOne line that says what the schedule does.
machineThe owner machine of this schedule. Absent means machine at the top of the file. With neither, no machine fires the schedule.
targetThe target of this schedule. Absent means target at the top of the file.
misfirecoalesce (the default) or skip.
overlapskip (the default) or allow.
enabledfalse pauses this schedule.

A value of machine with the UUID shape is compared with the machine id. Each other value is compared with the machine slug (machine-slug of the NUU config). Only the owner machine makes and fires the schedule. Flint does not check that two machines have different slugs, so a slug owner is safe only when each machine that syncs the Flint has a different machine slug. A machine id names one exact machine: nuu computer id prints it. flint module crons own [<name>] writes the slug of this machine. A schedule that does not parse is an issue, and sync keeps its object as it is. A wrong type of machine, target, or schedules fails the plan, and sync changes no schedule. An unknown key is an issue, and the module ignores it.

The Settings of the Module dms

Each key is optional. With no settings file, the module serves DMs with the defaults.

KeyMeaning
targetThe target of the session that answers the DMs: <runtime>/<profile>. Absent means the Orbh default target.
modeoneshot (the default: a session starts when a DM waits, answers the queued DMs, and then finishes) or resident (one bound session that waits for more DMs).
promptThe duty of the session that answers. Absent means the built-in DM duty.
prompt-fileA file inside the Flint that holds the duty. Give prompt or prompt-file, not both.
allowlocal, the only value in 0.7.0: each process of this OS user can send a DM.

A value that is not valid fails the plan, and sync keeps the station dm as it is.

flint.json

flint.json holds machine-managed state that travels with the Flint in git. Only flint create makes it. A writer never recreates a lost one.

KeyMeaning
versionThe Flint release version of this file.
idThe identity of the Flint.
typeThe type slug of the Flint.
createdThe creation time.
migrationsThe migration ledger: each migration id with its time.
pendingThe queued migrations.
shardsThe lock records, keyed by shard id.
modulesThe lock records of the modules, keyed by module id: the address, the version, the state, and the hash of each build.
reposThe pins of the shard repositories: each repo name with its remote, ref, and sha.
orgThe org of the Flint: its id and its slug. The id is the truth. The slug is a cache.
featuresPer-feature lock slices, keyed by feature id.
obsidianThe pin of the Obsidian payload: release, commit, and manifest.
about, regarding, owner, memberOf, ofThe relations of a typed Flint (a Guide, a Member Flint). Each holds an id, and the address as a cache.
conversion, conversionsThe pending conversion of flint convert, and the record of each finished conversion.

Each lock record in shards holds the spec, the package name, the alias, the shorthand, the name, the address, the version, the state, the Git facts of the fetch (resolved: repo, ref, sha), the package hash and its files, the payloads, the folders, the setup state, the migrations, and the pending migration steps. The state is published (a registry version with its tag and hash), snapshot (a build of a commit with its sha), or edited (a build of an edited source). The request and the answer of the registry are local facts in .flint/shards.json.

These commands write the Obsidian pin: flint create writes the recommended release for each new Flint, flint obsidian update moves the pin to the recommended release or to --to, a full backup restore writes the pin of the backup, and the conversion of a legacy payload writes a pin only when the Flint has none. flint sync never changes the pin.

Local State

Git ignores .flint/. Each machine has its own.

.flint/local.json

.flint/local.json is the local version record. It holds the Flint Version of the local state of this machine and the ledger of the local migrations. flint create writes it, so a new Flint is current. A current Flint that arrives from Git gets it at its first flint sync or flint git sync. Before that, flint sync --dry-run and flint plan show Would initialize the local state at <version>, and flint doctor counts it as one change to apply (Next: flint sync); no migration is needed.

{
  "version": "0.7.0",
  "migrations": {
    "flint-0.6.0-to-0.7.0-l1": "2026-10-04T16:57:07.681Z"
  }
}

.flint/references.json

.flint/references.json holds the local fulfillment of the [references] declarations.

{
  "version": 2,
  "codebases": [],
  "flints": [],
  "bundles": []
}

Each fulfillment records name, path, and optional fulfilled (the time of fulfillment). Names match without case.

.flint/shards.json

.flint/shards.json holds the local record of each shard, keyed by shard id. Each entry holds the setup state, the Git presence of a source (branch, sha, ahead, behind, dirty, last fetch time), the walk of this machine for the request (where the files came from and what the registry said), and the install and build times. It is not committed.

.flint/modules.json

.flint/modules.json holds the local record of each module, keyed by module id: the walk of this machine for the request (where the files came from and what the registry said), and the install and build times. The data folder of a module is .flint/modules/<name>/: only that module writes there. It is not committed.

.flint/sync.json

.flint/sync.json holds the last sync timestamp.

{
  "synced": "2026-07-07T00:00:00.000Z"
}

Env Files

Three files at the Flint root hold the env values of the Flint. The syntax is dotenv: NAME=VALUE lines, # comment lines, an optional export prefix, single quotes (literal), and double quotes (with the escapes \n, \r, \t, \", and \\).

FileGitHolds
flint.env.exampleTrackedThe names of the env values, with no values
flint.envIgnoredThe env values of the Flint
flint.env.localIgnoredThe env values of this machine. A value here wins over flint.env.
# flint.env.local: the values of this machine (Git ignores this file)
DISCORD_TOKEN="…"

Each module process gets every value. A name that starts with FLINT_ is refused: only Flint sets those values. A line that does not parse is an issue with its line number, and it is not loaded. When flint.env.example names a value that no env file sets, flint module status and flint sync show one notice; the exit code does not change. An agent can read the values from flint.env.local and flint.env at the Flint root; Orbh does not put them into a session.

The managed block of .gitignore always ignores flint.env and flint.env.local. When the Flint has Modules/ or [modules], it also ignores Modules/(Source Remote) */, Modules/**/node_modules/, Modules/**/.venv/, and Modules/**/__pycache__/.

The NUU Config

~/.nuucognition/config.toml (or $NUU_HOME/config.toml) is the NUU config. Every NUU CLI reads it. Flint reads and writes these keys:

KeyMeaningWriter
nameYour Name, the author of your notes.flint config name, flint setup
machine-nameThe branch prefix of this machine.flint config machine-name, flint setup
machine-display-nameThe name that people read, for example "Ada Laptop".flint setup, flint rename in the Computer Flint
machine-slugThe short word after # in an address. A rename keeps it.flint setup
machine-idA copy of the id of this machine, for older builds. The id itself is in machine.json of the NUU home.The first write of the machine id, only when the key is absent
person-idYour person id. A Member Flint records it as its owner.The first Member Flint with no owner (flint create --type member, flint convert)
default-orgThe org of this machine. Each new Flint gets it.flint config org set
default-org-idThe id of the org of this machine.flint config org set
[orgs.<slug>] githubThe GitHub owner of an org. flint migrate run reads it for the Git records that the shard registry does not know.flint config org map <slug> <github-owner>

flint setup --machine-proper-name "<name>" and flint rename "<name>" in the Computer Flint change machine-display-name and rename the Computer Flint too. See The Computer Flint > Rename the Machine.

flint config org unset makes new Flints local again. A NUU account and an org are optional. Flint works with no NUU account and no org.

The Orbh Settings

~/.nuucognition/orbh/settings.json holds the Orbh settings of this machine. The key defaultTargets is the machine layer of the default target list:

{
  "defaultTargets": ["codex/a6h", "claude/o55h"]
}

flint orbh profiles default set <target>... writes the key, flint orbh profiles default unset removes it, and step 4 of flint setup writes it when you put another target first. The Flint layer ([orbh] default in flint.toml) wins over this key. With no key, the shipped list applies: claude/o55h, then codex/a6h. The variable ORBH_SETTINGS_PATH names another settings file. See Agent Sessions > The Default Target List.

The Flint CLI Config

~/.nuucognition/flint/config.toml is the Flint CLI config of this machine. A dev build uses ~/.nuucognition/flint-dev/config.toml. The build selects the file. The code reads these keys:

Key in the fileMeaningCommand
[obsidian] choiceThe machine choice of Obsidian: on or off. No value means on. The 0.6.x key obsidian = "off" still reads as off.flint config set obsidian on|off, flint config get obsidian
[obsidian] trustCommunity-plugin trust: auto or ask. ask gives the trust screen of Obsidian for each new vault. No value means auto.flint config set obsidian-trust auto|ask, flint config get obsidian-trust
update-checkThe daily release check: on or off. No value means on.flint config set update-check on|off
[obsidian.applied]The machine layer of applied settings, for every Flint on this machine. It has the same form as [obsidian.applied] of flint.toml.flint obsidian applied set <file>.<key> <value> --machine
[orbit] devOriginsA list of exact origins of dev Orbit servers, for example ["http://localhost:5173"]. The Flint server adds them to the origins that it authorizes. It reads the key from flint/config.toml and flint-dev/config.toml.flint config set orbit.devOrigins '["http://localhost:5173"]'

flint config get <key>, flint config set <key> <value>, and flint config open act on this file. flint config set writes a dotted key as a nested table, and it keeps every other key and comment of the file. It refuses a key under obsidian. and names the command to use instead. flint config name, flint config machine-name, and flint config org write the NUU config, not this file. This file holds preferences of this machine, not the declaration of a Flint.

update-check = "on"

[obsidian]
choice = "on"
trust = "auto"

[obsidian.applied.appearance]
cssTheme = "Tokyo Night"

[orbit]
devOrigins = ["http://localhost:5173"]

The Roster Files

The roster is ~/.nuucognition/places.json: the list of Flints that this machine knows. Each row holds the path and the kind of a Flint. ~/.nuucognition/flint/registry.json is a copy of the roster: it holds the id, the name, the type, and the path. flint registry rebuild makes the copy again. flint registry check checks it without writes. See The Roster.

The roster is how Flint finds a Flint by its name: flint open, flint list, Flint references, and source bundles.

Environment Variables

VariableMeaning
NUU_HOMEOverrides the NUU home (~/.nuucognition) in full. With it set, Flint does not contact a live Obsidian.
FLINT_NO_UPDATE_CHECKSet to 1 to turn the daily release check off.
FLINT_SHARD_REGISTRY_URLReplaces the shard registry and org endpoints together.
FLINT_ORBH_BROWSE1 or true turns on the Orbh browse of the Flint server; 0 or false turns it off. It wins over [server] orb-browse.
EDITOR, VISUALThe editor that flint config open uses.
NO_COLORSet to any value to turn CLI colours off.
ORBH_SESSION_IDMarks an Orbh session. The release check never runs inside one.
FLINT_CRONS_NO_ORCHESTRATORSet to 1 so that no command starts the Orbh orchestrator by itself (for a test world). Then no cron schedule fires.

The daily release check also stays off after flint config set update-check off, in a pipe, with --json, in CI, for flint update and flint setup, and on a machine that is not set up.