TOML Key Lister
Print every key path the document contains — server.tls.cert, servers[0].ip — as a plain list, JSON, or CSV. Use it to find the path you need, to diff two configs by key set, or to build the input for another tool.
What this tool does
It walks the parsed document and prints the full path to each key. Leaf keys — the ones holding an actual value — are the default, because those are the settings. Switch to tables to get the section map instead, or to everything for the complete inventory. Entries inside an array of tables are expanded with a bracketed index, so upstreams[1].url is addressable.
The intent it closes: "what can I actually set in this file?" It is also the fastest way to compare two configs by key set: list both, sort both, and diff — differences in values disappear and structural differences stand out.
The output is deliberately plain, so it can feed something else: a JSON array for a script, a CSV column for a spreadsheet, quoted lines for pasting into code, or a bare list for grep and comm.
When you'd reach for it
- Find the path for the Query tool. List, copy the one you want, paste it into TOML Query.
- Diff two configs by key set. Sort both lists and compare — this catches a key that exists in staging but not production regardless of values.
- Audit for missing settings. Compare a config's key list against your documented options.
- Build a match list for redaction. Scan the key names for anything credential-shaped, then feed those into Redact.
- Generate documentation. A sorted list of every setting is a decent skeleton for a reference page.
How it works
A single traversal, filtered and formatted on the way out.
1. Walk the tree
Starting at the root, each key is appended to the current path with a dot. When a value is a table, the walk descends into it. When a value is an array of tables, each entry is visited with [n] appended, unless you set Array entries to skip. Plain arrays of scalars are treated as leaves — the array is the value.
2. Classify and filter
Each key is classified as a table (its value is a table, or an array of tables) or a leaf. The Include setting decides which classes are kept. A prefix filter is applied afterwards as a plain string match on the beginning of the path, so server. keeps everything under that section.
3. Format
The surviving paths are optionally sorted and deduplicated, then written in your chosen format. Plain list is one path per line. JSON is a string array. CSV adds a key header for spreadsheet import. Quoted lines wrap each path in double quotes, ready to paste into a code literal.
Options reference
Include
Leaf keys only lists the settings — the keys you can assign a value to. Tables only gives you the section map, which is a compact table of contents for a long config. Everything lists both, at the cost of a much longer output.
Array entries
Expand with [n] gives one path per entry — the addressable form, and what you need for Query. Skip inside arrays stops at the array itself, which is better when you want the schema of a config rather than an inventory of its data.
Prefix filter
A literal prefix match. server keeps server.host and also servers.0.ip; add the dot — server. — to keep only the one section. Leave it blank for everything.
Sort / Unique / Format
Sorting alphabetically is what makes two lists comparable with a diff. Deduplication matters mainly with array expansion off, where several entries can produce the same path. The four formats cover reading, scripting, spreadsheets, and pasting into code.
Example
Input:
[server]
host = "0.0.0.0"
[server.tls]
enabled = true
[[upstreams]]
name = "auth"
Output (leaf keys, array entries expanded):
server.host
server.tls.enabled
upstreams[0].name
Switch Include to Tables only and the same input yields server, server.tls, and upstreams — the section map. Switch Array entries to skip and upstreams[0].name disappears, leaving just the two server paths.
FAQ
Why brackets for array entries but dots for tables?
Because it reads the way the data is shaped: upstreams[1].url makes it obvious that the second element of an array is involved. The Query tool accepts the dotted form of the same path (upstreams.1.url) as well.
Are keys inside plain arrays listed?
A plain array of scalars is a leaf — the array is the value, so you get one path for it. Only arrays of tables are descended into, since those have keys inside them.
How do I compare two configs?
List both with sorting on, save each, then diff. Because values are excluded, the diff shows exactly which settings exist on one side and not the other.
Can I get the values too?
Use the Flattener — it prints one path = value line per leaf, which is the same list with the values attached.
Is the file uploaded?
No. The whole traversal runs in your browser.