Skip to content

Configuration

A node’s configuration is its composition: which plugins run, with what config (design/composition.md). There is no other config file.

  1. Distribution base — the CLI (and the FFI library) ship a built-in base composition with the standard entries below.
  2. Node composition<data-dir>/composition.toml (or --composition / INSEAM_COMPOSITION), which changes base entries by id and adds new ones.
  3. inseam config prints the composition; inseam config --resolved prints 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.

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 | off

Secrets never live in the composition or the store: the llm entry names an environment variable (api_key_env), nothing more.

Which entry you change decides how much work the next inseam index does (indexing/maintenance.md):

  • finder and the llm agent_model only 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 embedder entry re-computes vectors in place, without re-running transforms.
  • Mounting or unmounting a transform plugin re-indexes only the sources that plugin applies to.