Config reference
This page is an exhaustive, field-by-field reference for rudof.toml (the file read by
--config/-c and the config discovery process). For an
introduction to how configuration is loaded and merged, see Configuration;
this page only documents what can be set.
Note on how this page is generated: this reference is hand-written from the Rust source of
RudofConfigand the per-subsystem config structs it aggregates (see the “Source” line under each section below).rudofdoesn’t currently have tooling that extracts doc comments from these structs automatically (noschemars/documented-style derive is used for this purpose —schemarsis used elsewhere, for the MCP server’s tool schemas), so if a field is added, renamed, or its default changes, this page needs a matching manual update rather than being regenerated.
rudof config prints the effective configuration (defaults merged with whatever files
were discovered) as plain TOML, which is useful as a starting template — but the TOML crate
doesn’t carry Rust doc comments into that output, so it isn’t self-documenting. This page is
the missing piece.
Top-level keys
Source: rudof_lib/src/config/rudof.rs, rudof_lib/src/config/common.rs
| Key | Type | Default | Description |
|---|---|---|---|
version | string (semver) | current rudof version | Stamped automatically; a missing version in a loaded file just logs a warning, and a major-version mismatch is a hard error. You normally don’t set this by hand. |
base_iri | IRI string | unset | Default base IRI used to resolve relative IRIs, shared across sections that don’t set their own (see Base IRI propagation below). |
auto_base | boolean | false | If true and no base_iri is set anywhere, http://base is used as the base automatically instead of leaving relative IRIs unresolved. |
Every other key is a [table] for one subsystem, listed below.
Base IRI propagation
After loading, RudofConfig resolves cross-section values (RudofConfig::resolve()):
- Any section with its own
base_iriunset ([rdf],[shex],[service],[tap2shex]) inherits the top-levelbase_iri(orhttp://baseifauto_base = true). - A handful of fields exist in the Rust structs only because a section embeds another
section’s config (e.g.
[shex_validator]embeds a copy of[rdf]and[shex],[shacl]embeds a copy of[rdf],[tap2shex]embeds a copy of[tap],[shex2uml]/[shex2html]/[shex2sparql]embed a copy of[shex]). These embedded copies are always overwritten with the real top-level section on resolve, so they aren’t independently configurable — setting them directly in TOML has no effect. They’re omitted from the tables below; only the tables actually worth setting are listed.
There is no
[pgschema]table — PGSchema loading is controlled entirely through CLI flags / therudof_libAPI, not throughrudof.toml.
[logging] — diagnostic output
Source: rudof_lib/src/config/logging.rs
| Key | Type | Default | Description |
|---|---|---|---|
level | string | "" (unset) | Filter for rudof’s own diagnostic output (progress, retries, warnings — not command results, which always go to stdout/--output). Unset defers to the RUST_LOG environment variable, and to "info" if that’s unset too. |
level accepts either a bare level name — "error", "warn", "info", "debug", or
"trace" — or a full tracing_subscriber::EnvFilter
directive string such as "rudof_rdf=debug,info".
A bare level is automatically scoped to rudof’s own crates, with everything else — HTTP
and TLS libraries, the shell’s line editor, etc. — capped at warn. This is what keeps
debug/trace readable: without it, turning up verbosity to see what rudof itself is doing
also dumps per-keystroke tracing from the line editor and every dependency’s own internals.
Write a filter containing = or , yourself (e.g. "debug,reqwest=trace") to opt back into
a dependency’s logs — a filter like that is passed to EnvFilter unscoped, exactly as
written.
[logging]
level = "debug"
Inside the shell, this can also be changed for the rest of the session without restarting:
rudof> config set logging.level debug
logging.level = debug
RUST_LOG, when set, takes precedence over a persisted logging.level at startup (both go
through the same bare-level scoping above) — but $RUST_LOG can only be read once, at
process start, so it’s config set logging.level alone that can change the filter live once
the shell is already running.
[rdf] — RDF data
Source: rudof_rdf/src/rdf_core/rdf_data_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
base_iri | IRI string | unset | Base IRI to resolve relative IRIs in RDF data. If unset (and auto_base is off), relative IRIs are an error. |
local_base | boolean | true | Automatically use the local file/URI being read as the base IRI. |
pretty_json | boolean | true | Indent json/jsonld result-format output instead of emitting it as compact single-line JSON. |
colorize_json | boolean | false | Style json/jsonld output with ANSI colors (keys, strings, numbers, …). Only takes effect when pretty_json is also true, and only on a real terminal (auto-disabled when output is redirected or piped). |
endpoints | table of tables | Wikidata, DBpedia, UniProt pre-registered | Named SPARQL endpoints — see [rdf.endpoints.<name>] below. |
visualization | table | see [rdf.visualization] | Styling for RDF graph visualizations (svg/png/plantuml output). |
qlever | table, optional | unset | QLever Docker backend settings — see [rdf.qlever] below. Only compiled in with the qlever cargo feature, and not available on wasm. |
[rdf.endpoints.<name>]
Each key under endpoints names one registered endpoint. The registered name is actually
the endpoint’s own name field — the <name> in the table header is just where it lives in
the TOML tree, and should match name for a given endpoint to make sense, though nothing
enforces that. -e NAME/--endpoint NAME and the shell’s endpoint NAME command match
NAME against name case-insensitively — wikidata, Wikidata and WikiData all
resolve the same endpoint. rudof pre-registers three by default — Wikidata, DBpedia,
UniProt — which you can override or add to.
| Key | Type | Default | Description |
|---|---|---|---|
name | string | (required) | The endpoint’s display name — also what it’s matched against (case-insensitively) by -e/--endpoint/the shell’s endpoint command. |
query_url | IRI string | (required) | URL of the SPARQL query endpoint. |
update_url | IRI string, optional | unset | URL for SPARQL update operations, if the endpoint supports them. |
prefixmap | table (alias = "iri") | empty | Prefixes to abbreviate IRIs in this endpoint’s query results. |
[rdf.endpoints.Wikidata]
name = "Wikidata"
query_url = "https://query.wikidata.org/sparql"
[rdf.endpoints.Wikidata.prefixmap]
wd = "http://www.wikidata.org/entity/"
wdt = "http://www.wikidata.org/prop/direct/"
The default endpoints are themselves defined this same way, as standalone files — name,
query_url, and [prefixmap], without the [rdf.endpoints.<name>] wrapper — under
rudof_rdf/endpoints/,
embedded into rudof at compile time. Every *.toml file in that folder is registered
automatically, so adding a new default endpoint (or changing an existing one) is just adding
or editing a file there and opening a pull request — no Rust code change needed. The same
file shape can also be loaded at runtime: RdfDataConfig::load_endpoint_description(path)
registers an endpoint from such a file under its own name field, which is what the shell’s
endpoint FILE.toml command (see shell) uses.
[rdf.visualization]
Controls the appearance of --result-format svg/png/plantuml graph output.
| Key | Type | Default | Description |
|---|---|---|---|
uri_style | node style | blue outline, white fill, rounded | Style for IRI nodes. |
bnode_style | node style | blue outline, gray fill, rounded | Style for blank nodes. |
literal_style | node style | black outline, cyan fill, square | Style for literal nodes. |
reifier_style | node style | black outline, yellow fill, square | Style for RDF 1.2 reifier nodes. |
asserted_style | node style | black outline, white fill, square | Style for asserted triple nodes. |
non_asserted_style | node style | blue outline, white fill, square | Style for non-asserted (quoted) triple nodes. |
subject_arrow_style | arrow style | blue, dashed | Style for subject-role arrows. |
predicate_arrow_style | arrow style | red, dashed | Style for predicate-role arrows. |
object_arrow_style | arrow style | green, dashed | Style for object-role arrows. |
subject_label | string | "subject" | Label used for a triple term’s subject role. |
predicate_label | string | "predicate" | Label used for a triple term’s predicate role. |
object_label | string | "object" | Label used for a triple term’s object role. |
reifies_label | string | "reifies" | Label used for the reification relationship. |
subject_text | string | "subj" | Short text on the subject arrow. |
predicate_text | string | "pred" | Short text on the predicate arrow. |
object_text | string | "obj" | Short text on the object arrow. |
unasserted_triple_shape | "Cloud" | "Rectangle" | "Cloud" | Node shape for non-asserted triples. |
asserted_triple_shape | "Cloud" | "Rectangle" | "Rectangle" | Node shape for asserted triples. |
Note: unasserted_triple_shape/asserted_triple_shape take the values "Cloud" or
"Rectangle" capitalized as shown — unlike most other enum-valued settings on this page,
this one isn’t lowercased/snake_case.
Node-style fields
Each *_style above (except the arrow ones) is a table with these keys:
| Key | Type | Description |
|---|---|---|
line_color | color name | Outline color. |
line_thickness | integer | Outline thickness. |
background_color | color name | Fill color. |
round_corner | integer | Corner radius (0 = square corners). |
Valid color names (snake_case): white, black, cyan, gray, red, green, blue,
yellow, light_blue, light_green, light_coral.
Arrow-style fields
| Key | Type | Description |
|---|---|---|
line_color | color name | Arrow line color (see the color list above). |
line_thickness | "bold" | "normal" | "dashed" | "dotted" | Arrow line style. |
text_color | color name | Color of the arrow’s label text. |
[rdf.visualization.uri_style]
line_color = "blue"
line_thickness = 1
background_color = "white"
round_corner = 25
[rdf.qlever]
Only relevant when running RDF data through a QLever
Docker container backend (--backend qlever). Every field is optional; rudof only sets a
--flag on the QLever process when you set the corresponding key.
| Key | Type | Default | Description |
|---|---|---|---|
image_name | string | "adfreiburg/qlever" | Docker image to run. |
image_tag | string | "commit-a307781" | Docker image tag. |
index_dir | path, optional | <cache dir>/rudof/qlever/<hash> | Host directory for the QLever index. Also settable per-invocation with --qlever-index-dir <DIR> (which takes precedence over this key), so you don’t need a config file just to pin or share an index location. When left unset, the resolved directory is logged at startup so you can find it, reuse it in later invocations, or copy it to another machine — building the index is idempotent and is skipped whenever the target directory already holds a finished index. |
index_name | string | "default" | Index base name (QLever’s -i). |
auto_delete_if_created | boolean | false | Delete the index directory when the container is dropped, if this run created it. |
stxxl_memory | string, optional | unset | STXXL memory for index building. |
parser_buffer_size | string, optional | unset | --parser-buffer-size. |
parser_parallel | boolean, optional | unset (QLever default: on) | --parse-parallel. |
container_memory | string, optional | unset | Docker container --memory cap. |
container_memory_swap | string, optional | unset | Docker container --memory-swap cap. |
host_port | integer, optional | unset (ephemeral port) | Pin the host-side port instead of picking one automatically. |
container_port | integer | 7001 | Container-side port. |
access_token | string, optional | unset | QLever -a admin access token. Never written back out by rudof config when unset. |
num_simultaneous_queries | integer, optional | unset | QLever -j. |
memory_max_size | string, optional | "5G" | Server memory limit (QLever -m). |
cache_max_size | string, optional | "2G" | Cache size (QLever -c). |
cache_max_size_single_entry | string, optional | "1G" | Max cacheable single-entry size (QLever -e). |
lazy_result_max_cache_size | string, optional | unset | QLever -E. |
cache_max_num_entries | integer, optional | unset | QLever -k. |
no_patterns | boolean | false | QLever -P. |
no_pattern_trick | boolean | false | QLever -T. |
text | boolean | false | QLever -t. |
only_pso_and_pos_permutations | boolean | false | QLever -o. |
default_query_timeout | string, optional | unset | QLever -s. |
service_max_value_rows | integer, optional | unset | QLever -S. |
throw_on_unbound_variables | boolean | false | QLever --throw-on-unbound-variables. |
run_as_host_user | boolean | true | Run the container as the host UID/GID instead of root. |
container_label | string, optional | unset | Extra Docker label on the spawned container. |
server_readiness_timeout_secs | integer | 60 | How long to wait for the QLever server to become ready. |
[shex] — ShEx schema handling
Source: shex_validation/src/shex_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
base_iri | IRI string | unset | Default base IRI for resolving relative IRIs in a ShEx schema; falls back to the top-level base_iri if unset. |
shex_format | "shexc" | "shexj" | an RDF format name | "shexc" | Format of ShEx schemas read from disk (shexc/shex for ShExC, shexj/json for ShExJ, or any RDF serialization name — e.g. turtle — when the schema is embedded as RDF). |
check_well_formed | boolean | true | Check that the schema is well-formed after parsing. |
show_extends | boolean | true | Include EXTENDS relationships when showing a schema (shex command). |
show_imports | boolean | true | Include import information when showing a schema. |
show_shapes | boolean | true | Include the shape list when showing a schema. |
show_dependencies | boolean | false | Include shape dependency information when showing a schema. |
show_ir | boolean | false | Show the compiled Schema Internal Representation instead of the source syntax. |
[shex_validator] — ShEx validation
Source: shex_validation/src/validator_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
max_steps | integer, optional | unset (unbounded) | Maximum number of validation steps before giving up. |
check_negation | boolean | true | Check the ShEx negation requirement during validation. |
width | integer | 80 | Line width used when pretty-printing validation output. |
shapemap | table | see below | ShapeMap display settings. |
External-shape resolvers (used to resolve EXTERNAL shape declarations) are configured
programmatically (add_external_resolver) or via CLI flags, not through rudof.toml.
[shex_validator.shapemap]
| Key | Type | Default | Description |
|---|---|---|---|
nodes_pm | table (alias = "iri") | empty | Prefix map used to abbreviate node IRIs in ShapeMap output. |
shapes_pm | table (alias = "iri") | empty | Prefix map used to abbreviate shape-label IRIs in ShapeMap output. |
ok_text | string | "OK" | Text shown for a passing result. |
fail_text | string | "FAIL" | Text shown for a failing result. |
[shacl] — SHACL validation
Source: shacl/src/validator/config.rs
Not compiled in on the wasm target. Besides the keys below, this section also embeds a
copy of [rdf], which is always overwritten by the top-level [rdf] on resolve (see
Base IRI propagation) — it isn’t independently settable.
| Key | Type | Default | Description |
|---|---|---|---|
store_errors | boolean | true | Keep violations in the ValidationReport returned by validation. Turning this off still computes conformance correctly — conforms stays accurate — it just omits the per-violation detail, which is cheaper to carry around when you only need the boolean. |
store_evidences | boolean | false | Also keep evidence for why each (node, shape) pair conforms, not just why it fails. Off by default since most validation runs only care about violations. |
evidence_shapes_only | boolean | false | When store_evidences is on, keep only the per-shape summary evidence (one per conforming (node, shape) pair with its own targets, e.g. “conforms to :PersonShape”) and drop the finer per-constraint-component evidence (sh:datatype, sh:minCount, …). No effect when store_evidences is off. |
recursion_semantics | "none" | "cautious" | "brave" | "cautious" | Whether a shape that (directly or transitively) references itself is accepted at all, and if so, how a cycle in the data is resolved. none rejects the shapes graph outright — a schema-loading error — the moment it contains such a cycle, regardless of the data. cautious (the default) accepts it and assumes a node caught in a cycle does not conform unless that can be shown without relying on the cycle; brave accepts it and assumes it does conform as long as that assumption is self-consistent. A cycle built only from monotonic constructs (sh:and, sh:or, sh:node, sh:property, sh:minCount, sh:closed, …) is always sound under cautious/brave; one that also carries a negating constraint (sh:not, sh:xone, …) is sound too as long as it’s stratified — every such constraint targets a shape that doesn’t itself depend on any recursion. A cycle where negation instead reaches back into a recursive shape has no safe order to resolve it in and is always rejected, regardless of this setting — see Recursion and negation. |
store_errors/store_evidences/evidence_shapes_only only affect what the report
contains, never whether the data conforms. recursion_semantics is different: setting it to
none turns what would otherwise load and validate successfully back into a hard error (any
cyclic shape reference) — and for a shape with no cycles in it, this setting has no effect at
all.
[shacl]
store_errors = true
store_evidences = false
evidence_shapes_only = false
recursion_semantics = "cautious"
[shex2uml] — ShEx → UML/PlantUML conversion
Source: shapes_converter/src/shex_to_uml/shex2uml_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
plantuml_path | path | $PLANTUML env var, else "plantuml.jar" | Path to the PlantUML jar used to render diagrams. |
annotation_label | list of IRIs | [rdfs:label] | IRIs used as annotation labels in the diagram. |
replace_iri | boolean | false | Replace IRIs with their labels (from annotation_label) in the diagram. |
shadowing | boolean | true | Use shadowing for shapes in the diagram. Only honored by the PlantUML engine — Graphviz has no equivalent effect and ignores it. |
line_type | "orthogonal" | "polyline" | "default" | "default" | Connector line style. |
direction | "left_to_right" | "top_to_bottom" | "top_to_bottom" | Diagram layout direction. |
class_skin | table | see [shex2uml.class_skin] | Border/background/arrow colors for class boxes. Read by both visualization engines (see --viz-engine in convert), so svg/png output looks the same regardless of which one generated it. |
[shex2uml.class_skin]
| Key | Type | Default | Description |
|---|---|---|---|
border_color | color name | black | Class box outline color. |
background_color | color name | light_blue | Class box fill color. |
arrow_color | color name | black | Default color for association/generalization arrows. |
Same color names as [rdf.visualization] above.
[shex2uml.class_skin]
border_color = "black"
background_color = "light_blue"
arrow_color = "black"
[shex2html] — ShEx → HTML conversion
Source: shapes_converter/src/shex_to_html/shex2html_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
title | string | "ShEx schema" | Title used in the generated HTML pages. |
landing_page | string | "index.html" | Filename of the generated landing page. |
shape_template | string | "shape.html" | Filename of the per-shape page template. |
template_folder | string, optional | unset (built-in templates) | Folder with custom Tera/HTML templates, if overriding the built-in ones. |
css_file | string | "shex2html.css" | Generated stylesheet filename. |
target_folder | path | "." | Output directory for the generated site. |
property_color | string | "blue" | Color used for property names in the generated pages. |
annotation_label | list of IRIs | [rdfs:label] | Same as [shex2uml].annotation_label, used for the embedded diagrams. |
replace_iri_by_label | boolean | true | Replace IRIs with their labels in the generated pages. |
embed_svg_schema | boolean | true | Embed an SVG diagram of the whole schema on the landing page. |
embed_svg_shape | boolean | true | Embed an SVG diagram on each shape’s own page. |
[shacl2shex] — SHACL → ShEx conversion
Source: shapes_converter/src/shacl_to_shex/shacl2shex_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
starting_shapes_mode | "non-bnodes" | "non-bnodes" | How to pick the ShEx schema’s starting shapes; currently the only mode is “shapes which aren’t blank nodes”. |
embed_bnodes | boolean | false | Embed blank-node shapes inline instead of giving them their own top-level shape. |
add_target_class | boolean | false | Add an rdf:type/ex:class triple constraint for each SHACL sh:targetClass declaration. |
Unlike the other embedded-subsystem fields described in Base IRI propagation,
[shacl2shex].shacl(an embedded copy of[shacl]) is not overwritten byresolve()— if you need to pointshacl2shexat different SHACL settings than the top-level[shacl], you can set[shacl2shex.shacl]directly.
[tap] — DCTAP (CSV) handling
Source: dctap/src/tap_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
delimiter | single character | , | Column delimiter in the DCTAP CSV. |
quote | single character | " | Quote character for CSV fields. |
flexible | boolean | true | Allow rows to have a varying number of fields instead of erroring on mismatch. |
picklist_delimiter | single character | | | Delimiter between values inside a picklist cell. |
value_shape_delimiter | single character | ' ' (space) | Delimiter between values inside a value-shape cell. |
property_placeholders | table, optional | empty | Experimental. Per-property-ID value generators — see below. |
empty_property_placeholder | table, optional | unset | Experimental. Value generator used for rows with an empty property ID. |
Placeholder resolvers are tables of the form { stem = "..." } (currently the only kind is
stem, which generates "<stem><row number>"-style values):
[tap.property_placeholders.x]
stem = "pending"
[tap2shex] — DCTAP → ShEx conversion
Source: shapes_converter/src/tap_to_shex/tap2shex_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
base_iri | IRI string | unset (inherits the top-level base_iri) | Base IRI for the generated ShEx schema. |
datatype_base_iri | IRI string, optional | unset | Base IRI used to resolve bare datatype names from the DCTAP valueDatatype column. |
prefixmap | table (alias = "iri") | dc, rdf, rdfs, sh, xsd, and an empty-alias prefix for http://example.org/ | Prefixes used in the generated ShEx schema. |
[shex2sparql] — ShEx → SPARQL conversion
Source: shapes_converter/src/shex_to_sparql/shex2sparql_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
this_variable_name | string | "this" | SPARQL variable name used for “the focus node” in generated queries. |
[service] — SPARQL service description
Source: sparql_service/src/service_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
base_iri | IRI string | unset (inherits the top-level base_iri) | Base IRI used when resolving relative IRIs in a SPARQL service description. |
[comparator] — shape comparison
Source: shapes_comparator/src/comparator_config.rs
| Key | Type | Default | Description |
|---|---|---|---|
ignore_value_constraints | boolean | false | Treat two shapes as equivalent even if their value constraints differ. |
prefixes_equivalences | list of [iri, iri] pairs | empty | Pairs of IRIs to treat as equivalent prefixes when comparing shapes, e.g. [["http://a/", "http://b/"]]. |
Full example
Combining several sections above into one file (based on
bindings/python/examples/example.toml):
base_iri = "http://example.org/"
auto_base = false
[logging]
level = "info"
[rdf]
base_iri = "http://example.org/"
[rdf.endpoints.Wikidata]
name = "Wikidata"
query_url = "https://query.wikidata.org/sparql"
[rdf.endpoints.Wikidata.prefixmap]
wd = "http://www.wikidata.org/entity/"
wdt = "http://www.wikidata.org/prop/direct/"
[shex]
show_imports = true
show_dependencies = true
[shex_validator]
max_steps = 100
check_negation = true
[tap]
delimiter = ","
flexible = true
[tap2shex]
base_iri = "http://example.org/"
[tap2shex.prefixmap]
dc = "http://purl.org/dc/terms/"
Generate a real starting point for your own project with
rudof config -o rudof.toml, then edit in the keys you need from the tables above — you only ever need to set what you want to override.