Every config.yml key with its shipped default, the restart schedule, the kick thresholds, and the messages.yml surface — the complete configuration map.
System Velocity ships exactly two configuration files, both created in plugins/systemproxy/ on first boot: config.yml for behavior and messages.yml for text. Every key below is the real key with its shipped default — nothing is paraphrased into "see the file". The config layer is hardened in code: malformed YAML on first load falls back to built-in defaults, values are clamped at their usage sites, and a reload parses both files before swapping anything.
| Key | Default | Meaning |
|---|---|---|
log4shell.enabled | true | Enable the Log4Shell chat filter |
log4shell.notify-player | true | Tell the player when a message is blocked |
log4shell.log-blocked | true | Log blocked attempts to console — payload sanitized |
log4shell.kick-enabled | true | Kick after repeated exploit attempts |
log4shell.max-violations | 3 | Violations before the kick |
unicode-filter.enabled | true | Enable the Unicode injection filter |
unicode-filter.notify-player | true | Notify on block |
unicode-filter.log-blocked | true | Log blocked attempts (sanitized) |
unicode-filter.kick-enabled | false | Kick after repeated malicious messages — off by default |
unicode-filter.max-violations | 5 | Violations before the kick |
flood-filter.enabled | true | Enable the flood filter |
flood-filter.max-messages-per-second | 5 | Permitted rate; the real limit is this value × window-seconds per window; zero or negative clamps to one message per window |
flood-filter.window-seconds | 3 | Sliding window size in seconds |
flood-filter.cooldown-seconds | 10 | Mute cooldown once flooding is detected |
flood-filter.notify-player | true | Notify when flood-blocked |
flood-filter.log-blocked | true | Log flood blocks |
length-filter.enabled | true | Enable the max-length filter |
length-filter.max-length | 256 | Maximum chat message length in characters |
length-filter.notify-player / .log-blocked | true | Notify / log on block |
null-byte-filter.enabled | true | Block messages containing null bytes |
alerts.broadcast | false | Broadcast violations to holders of systemproxy.alerts |
alerts.auto-clear-violations-on-quit | true | Clear violation data on disconnect; if disabled, a five-minute sweep prunes offline players instead |
restart.enabled | true | Enable the daily proxy restart |
restart.time | "04:00" | HH:mm in restart.timezone; invalid values fall back to 04:00 with a warning |
restart.timezone | "Asia/Tehran" | IANA ZoneId; invalid values fall back to UTC with a warning |
restart.warning-seconds-before | 60 | Countdown length; 0 restarts with no warnings |
restart.warning-interval-seconds | 15 | Seconds between countdown warnings; values below 1 clamp to 1 |
log-cleaner.enabled | true | Enable log management for the proxy's own logs/ directory |
log-cleaner.max-size-mb | 500 | Maximum total logs/ size; a negative value disables the size pass with a warning |
log-cleaner.keep-newest | 5 | Newest files always kept during size cleanup |
log-cleaner.retention-days | 7 | Delete log entries older than this |
log-cleaner.check-interval-minutes | 30 | Cleanup check cadence; values below 1 clamp to 1 |
The four restart.* keys define one behavior with no hidden fields: a daily restart at time interpreted in timezone, preceded by a countdown that warns every warning-interval-seconds for warning-seconds-before seconds, then broadcasts "restarting now" and shuts the proxy down two seconds later. Invalid times and timezones never take the proxy down a wrong path — they fall back to the built-in defaults with a console warning. Setting warning-seconds-before: 0 gives you an instant scheduled restart with no countdown, and reloading the config while a countdown is running reschedules everything *except* that countdown, which completes as announced.
Exactly two filters can disconnect a player, and each has its own switch and threshold: Log4Shell kicks after 3 violations with kicking enabled by default, and Unicode kicks after 5 with kicking disabled by default. Flood, length and null-byte blocks never kick regardless of configuration — they deny the message and, at most, mute a flooder for the cooldown window. Violations clear on quit when alerts.auto-clear-violations-on-quit is on; otherwise a five-minute sweep keeps only online players in the tracker, so memory stays bounded no matter how the switch is set.
All player- and console-facing text lives in messages.yml, keyed by feature. Messages use legacy & color codes, and the prefix key exists but is applied only where you put it — messages are sent as defined. Every key has a hardcoded in-code fallback, so a missing key can never produce empty output.
| Key group | Used for |
|---|---|
prefix | Optional message prefix (ships empty) |
no-permission, unknown-subcommand | Command guard rails |
reload.success | Reload confirmation |
log4shell.blocked / log4shell.kick | Block notification and kick screen for Log4Shell violations |
unicode.blocked / unicode.kick | Block notification and kick screen for Unicode violations |
flood.blocked, length.blocked | Flood mute and length-rejection messages |
alerts.broadcast-format | The staff alert — {player} and {type} placeholders |
restart.warning / restart.now | Countdown warnings ({seconds}) and the final broadcast |
help.* | Header, per-subcommand lines, footer |
status.* | Status screen: header, enabled/disabled labels ({state}), per-filter lines, restart ({time}, {TZ}), log cleaner, footer |
test.* | Self-test screen: header, per-case line ({result}, {desc}, {input}), summary ({pass}, {fail}), footer |
Note:Reloads are exception-safe by construction: config.yml and messages.yml are both parsed before either replaces the live values, so a half-edited file can never leave the plugin in a mixed state — you get the old config, a log line, and your editing session intact.
Tip:Because Persian and Arabic script, standard punctuation and emoji all pass the Unicode filter untouched, you do not need to tune anything for international chat — the filter targets genuinely malicious code points, not languages.