Project Config
NanoGraph supports a project-level nanograph.toml plus local env files for secrets and machine-specific overrides.
Use this for:
- default DB and schema paths
- query roots
- query aliases
- embedding defaults
- CLI output defaults
Use .env.nano for local secrets like OPENAI_API_KEY.
Files
nanograph.toml
Shared project defaults. Safe to commit.
Typical contents:
[project]
name = "Star Wars"
description = "Searchable Star Wars graph."
instruction = "Prefer aliases for common queries."
[db]
default_path = "starwars.nano"
[schema]
default_path = "starwars.pg"
[query]
roots = ["."]
[embedding]
provider = "mock"
model = "text-embedding-3-small"
batch_size = 64
chunk_size = 0
chunk_overlap_chars = 128
api_key_env = "OPENAI_API_KEY"
[cli]
output_format = "table"
json = false
[query_aliases.search]
query = "starwars.gq"
name = "semantic_search"
args = ["q"]
format = "table"
.env.nano
Local-only secrets and machine-specific overrides. Do not commit this file.
OPENAI_API_KEY=sk-...
You can also put non-secret local overrides here, but the intended use is secrets.
.env
NanoGraph also loads ./.env after ./.env.nano. It is a fallback compatibility path, not the preferred place for NanoGraph secrets.
Discovery
Config discovery is intentionally simple:
- if you pass
--config <path>, NanoGraph loads that file - otherwise, it looks for
./nanograph.toml - it does not walk parent directories
Env files are loaded from the config base directory:
- when
--config path/to/nanograph.tomlis used, NanoGraph looks forpath/to/.env.nanoandpath/to/.env - otherwise, it looks in the current working directory
Precedence
Command defaults
For command settings like DB path, query path, alias name, and output format:
- explicit CLI flags
query_aliases.<alias>- shared config defaults such as
db.default_path,schema.default_path, andcli.output_format
Embedding env and secrets
For embedding-related env like OPENAI_API_KEY:
- existing process environment
.env.nano.env[embedding]values innanograph.toml- engine defaults
This is why the recommended setup is:
- keep
OPENAI_API_KEYin.env.nano - keep shared embedding defaults like
providerandmodelinnanograph.toml
Supported sections
[project]
Advisory project metadata.
[project]
name = "Acme Graph"
description = "Operational context graph for customer work."
instruction = "Prefer trace queries before ad hoc search."
Currently this is descriptive metadata for humans and agents. It does not change engine behavior.
[db]
Default database path for commands that operate on a DB.
[db]
default_path = "app.nano"
With this set, commands like these can omit --db:
nanograph describe
nanograph export
nanograph run search "vector databases"
[schema]
Default schema path, mainly used by init.
[schema]
default_path = "schema.pg"
[query]
Query file search roots for check and run.
[query]
roots = ["queries", "examples"]
If a relative query path is not found directly, NanoGraph searches these roots in order.
[embedding]
Shared embedding defaults.
[embedding]
provider = "openai" # or "mock"
model = "text-embedding-3-small"
base_url = "https://api.openai.com/v1"
batch_size = 64
chunk_size = 0
chunk_overlap_chars = 128
api_key_env = "OPENAI_API_KEY"
Supported fields:
provider—openaiormockmodelbase_urlmockbatch_sizechunk_sizechunk_overlap_charsapi_key_env
Do not put raw API keys in nanograph.toml.
[cli]
Shared CLI defaults.
[cli]
output_format = "table"
json = false
output_format is used when a command supports multiple formats and no explicit --format is passed.
[query_aliases.<alias>]
Shortcuts for nanograph run. They work for both read and mutation queries.
[query_aliases.search]
query = "queries/search.gq"
name = "semantic_search"
args = ["q"]
format = "table"
Then:
nanograph run search "father and son conflict"
Multi-parameter aliases work the same way:
[query_aliases.family]
query = "queries/search.gq"
name = "family_semantic"
args = ["slug", "q"]
format = "table"
nanograph run family luke-skywalker "chosen one prophecy"
Explicit --param values still work and override alias-derived positional params when both are present.
init scaffolding
When missing, nanograph init scaffolds:
nanograph.toml.env.nano
It writes them into the inferred project directory shared by the DB path and schema path.
The generated config includes:
db.default_pathschema.default_pathquery.roots = ["queries"]- default
[embedding]keys - a commented alias example
What does not belong here
nanograph.toml is not live database state.
Do not use it for:
- manifest values
- tx / CDC cursors
- dataset versions
- any other engine-managed runtime state
That state already lives inside the database folder.