Configuration
A node’s configuration is its composition: which plugins run, with what config (design/composition.md). There is no other config file.
Layers
Section titled “Layers”- Distribution base — the CLI (and the FFI library) ship a built-in base composition with the standard entries below.
- Node composition —
<data-dir>/composition.toml(or--composition/INSEAM_COMPOSITION), which changes base entries by id and adds new ones. inseam configprints the composition;inseam config --resolvedprints the merged result the node actually boots with — what prints is what runs.
How merging works: when your entry matches a base entry’s id, your config replaces the base config entirely (fields are not merged one by one); plugin and disabled override when present; ids the base doesn’t know become new entries. Entries can nest ([[entry.entries]]) into groups; disabling a group disables everything inside it.
The base entries and their configs
Section titled “The base entries and their configs”| id | plugin | config (defaults) |
|---|---|---|
fs |
connection-fs |
host_id (default fs-<hostname>) |
llm |
llm-endpoint |
base_url (OpenRouter), api_key_env (OPENROUTER_API_KEY), transform_model, agent_model |
embedder |
embedder |
provider = endpoint | hashed | none, model, dimensions |
transforms |
transforms |
— (the registry) |
markdown |
transform-markdown |
— |
chunker |
transform-chunker |
target_chars (1600) |
summarizer |
transform-summarizer |
target_chars (400), llm_call_budget (500) |
entities |
transform-entities |
max_per_source (12), llm_call_budget (500) |
finder |
finder |
seed_k, rrf_k, damping, iterations, epsilon, max_hints, max_vector_distance, [weights] |
sweep |
sweep |
max_sources (0 = unlimited), max_fragments_per_source (400), max_depth (6), max_content_bytes (2 MB), modified_after (YYYY-MM-DD) |
operations |
operations |
— |
Example composition.toml — an offline node with a loaded OCR plugin:
[[entry]]id = "embedder"[entry.config]provider = "hashed"model = "hashed"dimensions = 256
[[entry]]id = "entities"disabled = true
[[entry]]id = "ocr"plugin = "wasm:plugins/ocr/ocr.wasm"[entry.config]cooldown_days = 7 # wait period before a newly seen plugin version activates# allow_new = true # explicit consent to activate a version still inside its wait period# admission = "enforce" # validation on first sighting: enforce | warn | offSecrets never live in the composition or the store: the llm entry names an environment variable (api_key_env), nothing more.
What a config change costs
Section titled “What a config change costs”Which entry you change decides how much work the next inseam index does (indexing/maintenance.md):
finderand the llmagent_modelonly affect query time — free.- Budgets (
max_sources,llm_call_budget) only limit each run — free. - Transform configs and the sweep’s size/depth dials change what the index would build, so affected sources re-index.
- The
embedderentry re-computes vectors in place, without re-running transforms. - Mounting or unmounting a transform plugin re-indexes only the sources that plugin applies to.