Skip to content

Station Configuration

A station runs on your own hardware, so its configuration is yours to set. This page lists every setting stationd itself reads. The operations a station runs are configured separately, by the extension that provides them — see Extension settings below.


stationd reads /etc/nonbl/stationd.conf at start-up. Pass --config <path> to read a different file.

The file is optional: when it is absent, or the path does not exist, every setting takes its default and the station starts normally.

Each line is key = value. A line beginning with # is a comment.

A value that does not parse as its key’s type falls back to the default and is warned about. A Boolean value is 1, true, yes or on, or 0, false, no or off, compared without regard to case — any other value, including a typo, is warned about and takes the default.

A key may take its value from the environment, or from a file of its own, instead of from a literal line — which is how a secret stays out of the config file. Add a sidecar line naming the source:

dataDir = /var/lib/nonbl
dataDir:env = NONBL_DATA_DIR

<key>:env names an environment variable; <key>:file names a file whose contents become the value. A sidecar wins over the literal line when it resolves, so the literal is the fallback.


KeyTypeDefaultEffect
dataDirPath/var/lib/nonblBase directory for the station database and the enrolment file.
enrollDirPath(follows dataDir)Directory holding the enrolment file. Set it only to place enrolment somewhere other than dataDir.
modulePathPath../extensions/Directory the station loads extensions from, relative to the binary.
tzdataPathPath../data/tzdataThe bundled IANA time-zone database, relative to the binary. A synced copy at <dataDir>/tzdata is preferred over this one when it carries a readable version file.
logDirPath(unset)Directory for rotating log files. When unset, the station logs to standard output.
logLevelInteger2 (info)Verbosity: 0 trace, 1 debug, 2 info, 3 warn, 4 error, 5 critical, 6 off.
logSizeInteger1048576Size at which a log file rotates, in bytes.
logFilesInteger5How many rotated log files are kept.
trusted_rootsString""Comma-separated hex-encoded Ed25519 public keys the station accepts as entitlement roots. Whitespace around an entry is ignored; an entry that is not a valid key is skipped with a warning.
lists.pageRowsInteger100The most rows one page of a list holds on this station; a client may ask for fewer. 0 reads as the default. See Paging Lists.

Everything a station’s operations do is configured by the extension that provides them, not by the settings above. Those keys live in this same file, each under its extension’s own prefix.

An extension documents its own keys — their defaults, their units, and what each one bounds — on its Configuration page. Find the extension in the Extensions section of these docs; which extensions a station runs depends on what is installed on it.

SQLite Storage’s row bound, extras.sqlite.maxRows, is one of these: the station’s owner sets it, and the Extras extension’s Configuration page documents it. The rows a Task produces stay on the station; a reply that carries them upstream is bounded separately.


A station reaches the network it is on. Unlike a hosted slot — where the platform blocks connections to loopback, link-local and private address ranges — a station applies no such filter, because talking to devices on the local network is the reason to run one.

That is a deliberate difference, and it is worth keeping in mind when a Task on a station takes a URL or a topic from an outside source: the station will reach whatever that value names, including hosts on your own network. An Operation that makes outbound calls documents what it checks regardless, on its own extension’s Configuration page.