Kiln runs as a single executable with no daemon wrapper or separate process supervisor. It provides four flags and one platform-specific subcommand.
Flags
The full build (kiln) and the Lite build (kiln-lite) share the same flags.
| Flag | Default | Purpose |
|---|---|---|
-config <path> |
empty | Config file path; accepts kiln.toml or kiln.jsonc |
-version |
false |
Print version information and exit |
-healthcheck <url> |
empty | Probe an HTTP health endpoint and exit |
-h, -help |
none | Print usage and exit |
Parsing uses the Go standard library flag package, so a single dash and a double dash are equivalent, as are -config path and -config=path.
kiln -config /etc/kiln/kiln.tomlUnless -version or -healthcheck is given, -config is required. Omitting it prints kiln: -config is required to stderr and exits with status 2.
Exit codes
| Code | Meaning |
|---|---|
0 |
Clean exit, including -version, -help, and a passing health check |
1 |
Runtime failure: config load failed, data directory could not be created, health check failed |
2 |
Usage error: -config missing, flags unparseable, service subcommand unavailable |
-version
kiln -versionPrints one space-separated line:
kiln version=1.0.0 commit=dev built_at=unknown variant=fullvariant identifies the build: full or lite. The version, commit, and built_at values are injected by linker flags at build time and are placeholders when running straight from source.
A running instance also reports its version without a credential: GET / returns name, version, commit, and the admin console path. See the API reference.
-healthcheck
Issues a single GET with a 3-second timeout. A 2xx response exits 0; anything else writes the error or status line to stderr and exits 1. It reads no config file and starts no server.
kiln -healthcheck http://127.0.0.1:8080/healthzThe flag exists so container images do not have to ship curl or wget. The official image’s HEALTHCHECK instruction is exactly this command.
Windows service
The service subcommand registers Kiln with the Windows Service Control Manager, so no external supervisor is needed.
kiln.exe service install -config C:\kiln\kiln.toml
kiln.exe service start
kiln.exe service status
kiln.exe service stop
kiln.exe service uninstall| Subcommand | Purpose |
|---|---|
install |
Register the service; -config is required |
uninstall, remove |
Deregister the service; the two names are equivalent |
start |
Start the service and wait for it to run |
stop |
Stop the service and wait for it to stop |
status |
Print the current state |
| Flag | Default | Applies to |
|---|---|---|
-name |
Kiln |
All subcommands |
-config |
empty | install only |
-display |
Kiln Streaming Gateway |
install only |
-name lets several instances coexist on one host. Every subcommand other than install needs the same name to target the right service.
With no subcommand, or one that is not recognized, usage goes to stderr and the process exits with status 2. Install and uninstall need an elevated terminal.
What each subcommand does
install
Resolves -config to an absolute path and confirms it is readable, then refuses if a service with the same name already exists. The service is created as automatic-start with a three-step restart policy (5s, 15s, 60s, with a 24 hour reset window). On success it prints the service name, binary path, config path, and the command to start it.
start
Sends the start request and waits up to 30 seconds for the running state before returning 0.
stop
Sends the stop request and waits up to 30 seconds for the stopped state before returning 0.
status
Prints one of stopped, starting, stopping, running, paused, or unknown.
uninstall
If the service is not stopped, requests a stop and waits up to 20 seconds, then deletes the registration. Only the registration is removed; the data directory, logs, and config file are left alone.
If the service is not installed, the Service Control Manager is unreachable, or the operation fails, the reason goes to stderr and the process exits with status 1.
Runtime behavior under the service manager
The Service Control Manager starts processes in system32, so Kiln resolves -config to an absolute path and then switches the working directory to the folder holding the config. Relative paths such as data_dir = "./data" therefore still resolve against the config file.
Standard output is discarded under the service manager, so Kiln redirects stdout and stderr to kiln.log next to the config. If that file exceeds 16 MB at startup, it is first rotated to kiln.log.1.
The process accepts stop and shutdown controls and runs the same graceful shutdown path as a signal. The service exit code is the process exit code.
Installation records the absolute config path, so moving the binary or the config file means reinstalling the service.
Lite differences
The Lite binary takes the same command line. The differences show up after startup.
-versionreportsvariant=lite.- There is no
servicesubcommand, not even on Windows. - If
KILN_DEFAULT_PACKAGER_ENGINEis unset, Lite sets it tonative. - The config is validated before startup. Failing any of the following exits with status 1 and logs
lite config rejected:packager.enginemust benative;- every channel must resolve to the
nativeengine; - no
[[epg.sources]]entry may carryenabled = true; observe.otlp_endpointmust be empty;debug.pprof.enabledmust befalse.
- Resource adaptation uses a fixed low-memory profile instead of scaling with host memory.
For route surface differences, see the API reference.
Helper scripts
Three standalone tools live under scripts/. All carry a //go:build ignore tag, run directly with go run, and take no part in building the main binary.
Hash a password
go run scripts/hash-password.go 'your-password'Prints a single bcrypt hash for auth.users[].password_hash. Passing anything other than exactly one argument prints usage and exits with status 2.
Generate session signing keys
go run scripts/gen-jwt-keys.go ./secretsWrites the Ed25519 pair ed25519.pem and ed25519.pub.pem into the given directory and prints both paths. Omitting the directory writes to the current one. Point auth.token_private_key_file and auth.token_public_key_file at the results.
Generating keys is optional: on first start the process creates a key pair under {data_dir}/auth/ with the private key at mode 0600. Use the script when keys need to be managed centrally, or when several instances must share one signing key.
Generate romanization data
go run scripts/gen-romanize-data.go
go run scripts/gen-romanize-data.go -unihan ./Unihan.zip -out modules/httpserver/admin/assets/data/romanize.jsBuilds the romanization and simplification tables the admin console uses for channel search, from the official Unicode Unihan data set.
| Flag | Default | Purpose |
|---|---|---|
-unihan |
empty | Path to a local Unihan.zip; downloaded from unicode.org when empty |
-out |
modules/httpserver/admin/assets/data/romanize.js |
Generated module path |
The generated module exports the PINYIN, JYUTPING, and SIMPLIFY tables. This is a build-time, one-off step, only needed when tracking an upstream Unicode data update. Rebuild the admin console assets afterwards.