BuiltByBit store

Kalkanconfig.yml reference

config.yml reference

Every key in Kalkan's config.yml, with the default, the allowed range and what it changes.

plugins/kalkan/config.yml holds every setting. The in-game menu and the commands rewrite this file when you change something, so it always matches what is running. After editing it by hand, run kalkan reload in the proxy console. If the file has an error, the old settings stay and the console says why.

The default file

This is the file Kalkan writes on first start, as generated by the plugin itself:

# ─────────────────────────────────────────────────────────────
# Kalkan — anti-VPN and anti-bot for Velocity
# Change these from the in-game /kalkan menu; the menu rewrites this file.
# After editing by hand, run in the proxy console: kalkan reload
# ─────────────────────────────────────────────────────────────

# Your Kalkan license key. The jar you download from BuiltByBit carries it and fills this in by itself.
# Without a valid key Kalkan checks nobody. To change it, run in the proxy console: kalkan license <key>
license-key: ""

# MONITOR: nobody is kicked, logins are only recorded as "would kick".  BLOCK: blocked types are kicked at login.
mode: MONITOR

# Your own countries. The home-countries switches below apply to them. Example: ["US", "CA"]
home-countries: []

# true = that type is blocked (in monitor mode: only recorded).
block:
  other-countries:
    vpn: true
    hosting: true    # datacenter / server / cloud
    tor: true
    warp: false       # Cloudflare 1.1.1.1 / WARP
  home-countries:
    vpn: false
    hosting: false
    tor: false
    warp: false

# Country rules decide by the country of the address, whatever the connection type (they follow the mode).
# blocked: nobody joins from these countries.  only: if not empty, ONLY these countries may join.
# Only the 'allow' list gets past them; an address with an unknown country is always let in. Example: blocked: ["CN", "RU"]
country-rules:
  blocked: []
  only: []

# An account that joined on at least 'min-days' different days in the last 'window-days' from a clean
# (home / mobile) address may also join through a VPN. It still has to pass your login plugin.
trusted-players:
  enabled: true
  min-days: 3
  window-days: 60

# Check Bedrock (Floodgate) players too. Floodgate names start with this prefix.
bedrock-check: true
floodgate-prefix: "."

# Tell players with the kalkan.alerts permission in chat (once per IP every 10 minutes).
staff-alerts: false

# If enabled: when 'threshold-per-minute' blocked-type logins arrive within one minute, they are
# blocked for 'duration-minutes', even in monitor mode.
attack-mode:
  enabled: false
  threshold-per-minute: 30
  duration-minutes: 15

# Experimental, log only: the difference between the in-game ping and the TCP round trip
# (a hint for rented home proxies). It never kicks anyone.
ping-probe: true

# Where the data file (kalkan.db) is downloaded from. It needs an active license.
data:
  url: "https://kalkan.teamatlantis.xyz/data/kalkan.db"
  refresh-minutes: 10

# Always allowed: player names (lower case), IPs / CIDRs, ASNs.
allow:
  players: []
  ips: []
  asns: []

# Your own infrastructure (proxies, backends, VPS): never flagged.
infrastructure-ips: []

# If set, an hourly summary and attack alerts go to this Discord webhook.
discord-webhook: ""

# How many days the decision and ping logs (plugins/kalkan/logs) are kept.
log-days: 30

# What a blocked player sees (MiniMessage). Placeholders:
# <type> <fix> <ip> <country> <country_name> <asn> <org> <name>
kick-message:
  - "<#38c1fc>⛨ Kalkan</#38c1fc>"
  - ""
  - "<gray>Your connection was detected as a <#ff0000><type></#ff0000> connection.</gray>"
  - "<gray>Please <#00ff00><fix></#00ff00> and reconnect.</gray>"
  - ""
  - "<gray>If you think this is a mistake, contact the server staff.</gray>"
  - "<dark_gray><ip> • <country> • AS<asn></dark_gray>"

# What a player stopped by a country rule sees. Placeholders: <ip> <country> <country_name> <asn> <org> <name>
country-kick-message:
  - "<#38c1fc>⛨ Kalkan</#38c1fc>"
  - ""
  - "<gray>Joining from <#ff0000><country_name></#ff0000> is closed on this server.</gray>"
  - ""
  - "<gray>If you think this is a mistake, contact the server staff.</gray>"
  - "<dark_gray><ip> • <country> • AS<asn></dark_gray>"

Mode and countries

KeyDefaultMeaning
modeMONITORMONITOR: nobody is kicked, matching logins are recorded as would kick. BLOCK: matching logins are kicked.
home-countries[]Your own countries (two-letter codes). The home-countries switches apply to them; everyone else is “other countries”.
block.other-countries.vpn / hosting / tor / warptrue / true / true / falseWhich connection types are blocked from other countries
block.home-countries.vpn / hosting / tor / warpall falseWhich connection types are blocked from your countries
country-rules.blocked[]Nobody joins from these countries
country-rules.only[]If not empty, only these countries may join

Exceptions

KeyDefaultMeaning
trusted-players.enabledtrueRegulars may join through a VPN or hosting address
trusted-players.min-days3Clean days needed (1 to 30)
trusted-players.window-days60Within this many days (at least min-days, at most 365)
allow.players[]Player names, lower case. Always let in, past country rules too.
allow.ips[]IPs or CIDR ranges. Always let in.
allow.asns[]Network numbers (16509 or AS16509). Always let in.
infrastructure-ips[]Your own proxies, backends and servers: never flagged
bedrock-checktrueCheck Floodgate players too. false lets every Bedrock player in.
floodgate-prefix"."How Floodgate player names start

Attack mode and alerts

KeyDefaultMeaning
attack-mode.enabledfalseTurn attack mode on
attack-mode.threshold-per-minute30Blocked logins within one minute that start an attack (at least 5)
attack-mode.duration-minutes15How long blocked types are kicked, even in monitor mode (1 to 240)
staff-alertsfalseChat lines for players with kalkan.alerts, once per IP every 10 minutes
discord-webhook""Attack alerts and an hourly summary go here

License, data, logs and the probe

KeyDefaultMeaning
license-keyfilled in from your downloadYour license key. Change it with kalkan license <key>.
data.urlTeam Atlantis’s data serverWhere kalkan.db is downloaded from
data.refresh-minutes10How often Kalkan checks for a new data file (2 to 720)
log-days30How long the decision and ping logs are kept (3 to 365)
ping-probetrueExperimental, log only: in-game ping vs TCP round trip. Never kicks anyone.

Kick messages

kick-message is what a player stopped by a connection type sees; country-kick-message is for country rules. Both are lists of MiniMessage lines.

PlaceholderBecomesIn
<type>The connection type, for example datacenter or VPNkick-message
<fix>What to do, for example turn off your VPNkick-message
<ip>The player’s addressboth
<country>The country code, for example CNboth
<country_name>The country’s English name, for example Chinaboth
<asn>The network numberboth
<org>The network’s nameboth
<name>The player nameboth