skip to content

// Reference

config.json

the host's registry file — every setting and instance field.

config.json

kern's state lives in a single JSON document at <app_data>/config.json:

json
{ "version": "2.0.0", "settings": { "...": "..." }, "servers": { "srv_a1b2c3": { "id": "srv_a1b2c3", "...": "..." } } }

// warn

the app owns this file. it rewrites it on every change, and manual edits made while kern is running are overwritten. prefer the ui or the automation api; edit the file only with kern closed.

settings

keytypedefaultmeaning
defaultSandboxPathstring<app_data>/serverswhere new instances go unless a custom path is chosen
launchOnLoginboolfalseregister kern as an os-login item
closeToTraybooltrueclose (×) hides to the tray instead of quitting
startHiddenInTrayboolfalsestay hidden when launched by the os at login
trayRadarbooltrueanimate the tray icon as a live radar
powerPricePerKwhnumber0local price; 0 disables the energy meter
machineWattsnumber120average draw for cost estimation
registryUrlstringhttps://kern.aaenz.noplugin registry base url
webRemoteEnabledboolfalseserve the lan control panel
webRemoteBindstring"0.0.0.0"interface the panel binds: 0.0.0.0 (all), 127.0.0.1 (localhost only — tunnel/reverse-proxy mode), or a specific ip
webRemotePortnumber7440https port for the web remote
nativeNotificationsbooltruemirror notifications to os toasts when unfocused
webhookUrlstring""discord/slack/generic webhook
webhookEnabledboolfalsemaster switch for webhook delivery
logAlertsarray[]{ id, name, pattern, enabled } regex rules over streamed logs
automationEnabledbooltrueserve the loopback automation api
automationPortnumber7442loopback port
syncRepoUrlstring""git remote for registry export/import

webRemotePassphrase is a legacy field kept so older files parse.

instance fields

each entry in servers is an instance. the fields you'll actually touch:

keytypemeaning
idstringstable srv_… id
namestringdisplay name
serverTypestringplugin id (custom, minecraft_java, discord_bot, …)
pathstringthe instance folder
statusstringstopped \running \error \stopped-forced \transitional states
isOrphanedboolfolder missing; set automatically
userOverridesobjectconfig-form values, referenced as {{userOverrides.*}}
autoStartboollaunch with kern
stopCommandstring?stdin line for graceful stop; "" skips stdin, absent uses the plugin default
stopTimeoutSecsnumbergraceful window before force-kill (default 30)
groupstring?sidebar group / fleet filter
tagsstring[]lowercase labels; --tag filters
watchdogobject{ enabled, maxAttempts } crash auto-restart
tasksarraysee scheduled tasks
backupScheduleobject{ intervalSecs, keep, onStop, lastBackupSecs }
alertRulesobject{ cpuThreshold, ramThreshold, sustainedSecs, crossedSinceSecs }
rconobject{ host, port } — password lives in the os keyring
commandHistory / commandSnippetsstring[]terminal conveniences
lastPortsnumber[]last observed listening ports (preflight)

host-managed fields (status, pid, pidStarted, isOrphaned, lastBackupSecs, crossedSinceSecs, lastPorts, task run stamps) are written by kern — PATCH and the ui preserve them even if your copy is stale.

instance state after a crash

if kern quits while servers are running, it detaches them rather than killing them. the next launch finds each persisted pid + pidStarted, verifies the process is still alive and identical (recycled pids fail the start-time check), and re-adopts it as a pid-only monitor. adopted instances show a distinct badge and support metrics and force-stop, but no stdin or log streaming — kern no longer owns their pipes.

schema version

version tracks the document schema. unknown fields are ignored, new fields default, so a config written by an older kern loads cleanly. downgrades aren't supported — back up config.json before rolling back.

raw markdown ↗
updated 2026-09-12edit on github ↗