Skip to content
BlazeZDocs

Kratos

A simulation-based anti-cheat that predicts every movement tick and combat hit server-side, with Bedrock support.

Version
1.9.4
Runs on
Paper, Purpur, Folia, Velocity
Minecraft
1.21+
Java
17+
Works with
ViaVersion, ViaBackwards, ViaRewind, Geyser, Floodgate, PlaceholderAPI, WorldGuard, Spartan
On this page

Kratos predicts each player's movement tick by tick on the server and flags the difference when legitimate physics can't explain it. Latency, low TPS, knockback, riptide, elytra, vehicles, cobwebs and slime are part of the prediction, so a player on high ping isn't punished for lag. Combat hits are measured against the victim's real interpolated position at the time of the hit.

Staff get clickable chat alerts, an in-game flag log, a checks editor, freezes, replays of what a player did, and a client fingerprint that catches cheat clients on join. Bedrock players who join through Geyser are judged by a separate engine built for their protocol, and never by the Java checks.

Features#

Movement simulation

Every player's movement is predicted tick by tick on the server. Lag, low TPS, knockback, elytra and riptide are part of the prediction, so high ping doesn't flag. Movement

Lag-compensated combat

Reach, hitboxes, aim, killaura, triggerbot and auto-clicker checks, with each hit measured against where the victim really was. Combat

Clickable alerts

Staff see every flag in chat. Hover for the check's detail, click to spectate the player. Alerts

Kratos flag log

Flag log

/kratosflags shows the last 200 flags as one head per player, filtered by Cheating or Suspicious. Flag log

Kratos checks catalog

Live checks editor

/kratoschecks switches any check on or off and changes its thresholds in game, saved to checks.yml. Checks catalog

Frozen player

Freeze

A player who piles up violations is held in place for 30 seconds, which stops cheats a check can detect but can't cancel. Freeze

Cheat clients blocked on join

Client brand, plugin channels, mod loaders and a sign probe identify cheat clients before they play. Client fingerprint

Join alert hover card

Join insight

When a player joins, staff see their client, version, flag count, country and whether they're on a VPN. Alerts

Replays

Rewind what any player did with a body only you can see, with nearby players, projectiles, block edits and chat played back. Replay

Bedrock engine

Geyser players are judged by a separate engine built for their protocol, never by the Java checks, including when Geyser runs on Velocity. Bedrock players

Web panel

A live flag feed, per-server analytics and a settings editor for every server on your license. Web panel

Anti-ESP

Players behind solid blocks are removed from the viewer's client, so ESP and tracers have nothing to draw. Needs the Nemesis Hide Entity add-on. Anti-ESP

Permissions#

PermissionLets a playerDefault
kratos.*Use every staff command and GUI listed below.OP
kratos.reloadRun /kratos reload.OP
kratos.alertsReceive flag alerts and toggle them with /kratos alerts.OP
kratos.alerts.enable-on-joinHave alerts switched on automatically on join, unless they turned them off themselves.OP
kratos.alerts.enable-on-join.silentGet alerts switched on at join without the confirmation message.OP
kratos.spectateSpectate a player with /kratos spectate.OP
kratos.spectate.clickalertSee the click-to-spectate shortcut on alerts, when alerts.click-to-spectate.require-permission is true.OP
kratos.freezeFreeze a player with /kratos freeze.OP
kratos.unfreezeRelease a frozen player with /kratos unfreeze.OP
kratos.flagsOpen the flag log with /kratosflags or /sus.OP
kratos.reportReport false flags from the flag log.OP
kratos.guiOpen and edit the checks catalog with /kratoschecks.OP
kratos.replayBrowse and watch replays with /kratosreplay.OP
kratos.replay.saveKeep a player's recent window with /kratosreplay <player> start.OP
kratos.replay.reloadRun /kratosreplay reload.OP
kratos.fingerprint.commandRun /checkforhacks.OP
kratos.fingerprint.bypassJoin with a flagged client without being punished. Staff still get a warning.OP
kratos.antiesp.bypassSee every player, even ones Anti-ESP would hide behind walls. The node is set by anti-esp.bypass-permission.OP
kratos.exemptSkip every check.Nobody
kratos.nosetbackNever be set back.Nobody
kratos.nomodifypacketNever have packets cancelled or modified.Nobody
kratos.exempt.<check>Skip one check. Only read when bypass.exempt-permissions is true.Nobody
kratos.nosetback.<check>Skip setbacks from one check. Only read when bypass.exempt-permissions is true.Nobody
kratos.nomodifypacket.<check>Skip packet changes from one check. Only read when bypass.exempt-permissions is true.Nobody

Warning

Operators match any permission node that isn't registered, so every op would match every kratos.exempt.<check> node. That's why bypass.exempt-permissions is false by default and ops are checked like everyone else. Turn it on only if you grant per-check exemptions on purpose.

Commands#

CommandWhat it doesPermission
/kratos or /kratos helpLists the Kratos commands you have permission to use.None
/kratos reloadReloads every Kratos config file.kratos.reload
/kratos alertsToggles flag alerts for yourself. Your choice is kept across rejoins. From console it toggles console alerts until the next reload or restart.kratos.alerts
/kratos spectate [player]Spectates a player. Without a player, returns you to where you were.kratos.spectate
/kratos freeze <player> [seconds]Freezes a player in place. Default length is freeze.seconds (30).kratos.freeze
/kratos unfreeze <player>Releases a frozen player early.kratos.unfreeze
/kratosflags (aliases /kflags, /klog)Opens the flag log GUI.kratos.flags
/susOpens the same flag log GUI.kratos.flags
/kratoschecks (alias /kchecks)Opens the checks catalog GUI.kratos.gui
/kratosreplay (alias /kreplay)Opens the replay browser.kratos.replay
/kratosreplay <player>Opens the replay setup screen for one player.kratos.replay
/kratosreplay <player> start [seconds]Keeps that player's last seconds as a saved replay. Works from console.kratos.replay.save
/kratosreplay savedBrowses saved replays.kratos.replay
/kratosreplay play <id>Plays one saved replay.kratos.replay
/kratosreplay stopEnds the replay you're watching.kratos.replay
/kratosreplay reloadReloads the replay settings.kratos.replay.reload
/checkforhacks <player>Probes a player's client and prints their brand, channels and strikes.kratos.fingerprint.command
Kratos command list in chat
The command list from /kratos.

/sus is registered only while features.sus-command is true (the default) and Spartan's own /sus isn't running. On a server that also runs Spartan, Kratos sends its flags into Spartan's /sus instead.

Configuration#

Kratos splits its settings across several files in plugins/Kratos/. The panel and the in-game checks editor write to the same files.

FileControls
config.ymlLanguage, bypass lists, ignored zones, alerts, Discord webhook, freeze, replay, web panel link, flag history, join notifier.
checks.ymlOne section per check, named after the check: thresholds, violations-to-flag, window-ms, setback-violations, decay, freeze-violations. Also disabled-checks. See Check list.
ai.ymlThe optional AI analyst and the tuning for aim, clicker, reach, hitbox, crystal and mace smash analysis.
fingerprint.ymlClient fingerprint detections, cheat client signatures and the actions they trigger.
messages.ymlEvery player and staff message, in MiniMessage format.
license.ymlYour license key, and hide-entity-license-key for Anti-ESP. Kept apart so you can share config.yml without the keys.

The options most servers change:

KeyDefaultWhat it does
languageENLanguage messages.yml is written in on a fresh install.
bypass.players[]Names or UUIDs that Kratos ignores completely.
bypass.worlds[]Worlds where nobody is flagged, set back, frozen or has packets cancelled.
experimental-checksfalseTurns on checks still marked experimental.
disabled-checks[]Checks to switch off by name (in checks.yml).
alerts.print-to-consolefalseAlso prints every alert to the console.
alerts.default-violations-to-flag5Violations before a check alerts, for checks without their own value.
alerts.default-window-seconds300Window those violations are counted in.
alerts.command-on-flag.enabledfalseRuns alerts.command-on-flag.command from console on every flag.
features.exempt-creativetrueSkips players in creative mode.
features.exempt-elytrafalseSkips players while gliding.
features.sus-commandtrueRegisters /sus as a shortcut to the flag log.
custom-command.enabledfalseAdds a second command name for every /kratos subcommand.
custom-command.nameanticheatThe extra command name, for example /anticheat alerts. Usage and help text follow the name used. Needs a restart.
custom-command.hide-kratos-commandfalseHides /kratos from players' tab completion, so only the custom name shows.

Apply changes with /kratos reload. Replay settings reload with /kratosreplay reload.

Install#

  1. Put Kratos-<version>.jar in your server's plugins folder. The Developer API folder in the download is for plugin developers only. Don't install that jar.
  2. Start the server once. Kratos creates config.yml, checks.yml, ai.yml, fingerprint.yml, messages.yml and license.yml.
  3. Put your license key in license.yml under license-key. Your key is under My Licenses on the BlazeZ portal.
  4. Set language in config.yml if you want messages in another language, then delete messages.yml so it's written again in that language.
  5. Restart the server.
  6. Join as an op and run /kratos. You should see the command list, and alerts are on for you by default.

If Geyser runs on your Velocity proxy instead of on the backend, also follow Bedrock players.

Movement#

The simulation engine predicts where each player should be every tick and flags the difference. Small offsets add up as violations, and a large offset sets the player back to their last valid position straight away.

Setbacks come from Simulation.setback-violation-threshold (2) and Simulation.immediate-setback-threshold (0.18). The simulation check alerts at Simulation.violations-to-flag (100), higher than most checks because tiny offsets are common. Lag allowance widens by Simulation.lag-leniency-multiplier (3.0) whenever TPS drops under Simulation.lag-tps-threshold (19.3).

Separate checks cover phasing through blocks, NoSlow, timer abuse, knockback and explosion velocity, ground spoofing, NoFall, vehicle movement and Baritone pathing. Each has its own section in checks.yml, and Check list names every one.

On 26.2 and newer clients, the prediction also covers potent sulfur geysers, shelf mushroom bounces, and the air drag, friction and bounciness attributes.

NoFall#

NoFall flags a player who claims to be on the ground with nothing under them, and ignores the claim so fall damage still applies. In open air it flags on the first claim. Next to a block edge it waits NoFall.confirm-ticks (4) ticks and only flags if the claim repeats, so clipping a block corner while falling doesn't flag. The edge area is NoFall.edge-horizontal (0.6) blocks sideways and NoFall.edge-below (1.5) blocks down.

Spear lunge#

The spear's Lunge dash is applied by the client. Kratos counts the spear's attack charge in the client's own ticks and flags a stab taken before the weapon's attack delay has passed. The delay comes from the player's attack-speed attribute, so haste and weapon modifiers count, and a hotbar swap restarts the full delay. Legitimate lunges are part of the movement prediction, so they don't flag. Tune it under SpearLunge in checks.yml.

Combat#

Combat checks cover reach, hitboxes, aim, anti-knockback, killaura, triggerbot, shield breaking, auto-clicker patterns and hit timing. Each hit is lag-compensated against where the victim really was. Verdicts are graded as legitimate, suspicious or cheating, and only strong evidence escalates, with extra allowance for high ping and low TPS.

Reach is measured against the weapon in hand, including weapons with more than 3 blocks of reach such as the spear. A hit made within a couple of ticks of a hotbar swap is measured against whichever of the two weapons allows it, so swapping off a spear mid-fight doesn't flag.

Aim#

Aim tracking flags a crosshair that stays locked on a moving target while the player turns. It looks at the last ai.aim.tracking.samples (30) aim samples and alerts when ai.aim.tracking.locked-samples (14) of them sit within ai.aim.tracking.max-error-degrees (1.0) of the target, at any height on the body. A second alert within a minute, or ai.aim.tracking.instant-freeze-locks (16) locked samples at once, freezes the player. These settings are in ai.yml.

Bow aim#

Silent bow aim turns the player's view onto the target only for the tick the arrow is released. Kratos flags a shot where the view jumps onto the target for that one tick and straight back off it, and freezes after ai.aim.bow.revert-shots (3) such shots within ai.aim.bow.revert-window-seconds (20). Flick shots and turning away after a shot don't count.

Triggerbot#

Once a player has landed Triggerbot.combat-hits (3) hits within Triggerbot.combat-window-ms (8000), Kratos waits for a second with no swings, then shows a fake player in their crosshair that only they can see. Hitting it within Triggerbot.probe-window-ms (150) of it appearing, or before their client even received it, counts as a confirmation. Two confirmations within two minutes freeze the player. A new probe can appear every Triggerbot.probe-cooldown-ms (8000), and none is placed while a real player is near the crosshair. Triggerbot.entry logs how fast hits follow a target entering the crosshair when debug is on, and never flags while Triggerbot.entry.flag is false.

Mace smash timing#

A mace smash landed by a routine is made of ordinary packets, so Kratos judges timing instead. It measures how quickly a smash follows the victim raising a shield, how little that delay varies over a session, and how long the crosshair was on the victim before the swing. Hits where the target was already lined up well before the swing are discarded. It alerts staff but doesn't freeze or ban, because ai.smash.escalate is false by default.

Automation checks#

AutoTotem, AutoArmor, AutoPearl and AutoAnchor look for inventory and item actions no human can do. AutoArmor, for example, flags an armor swap while the camera is turning or movement keys are held, which is impossible with the inventory open, and a piece re-worn faster than a human could react after it broke. It never touches the player's inventory and never flags on equip speed alone.

AutoWeb flags cobwebs placed on an enemy by a routine: swapping to the web, placing it and swapping away in the same tick, or snapping the view onto the enemy's block and straight back. Two in AutoWeb.window-seconds (60) alert and AutoWeb.events-to-freeze (3) freeze.

AutoDrain flags a player who picks up or covers water or lava an enemy placed near them within AutoDrain.fast-ticks (3) ticks of their client receiving it. Two fast drains within AutoDrain.window-seconds (60) alert and AutoDrain.events-to-freeze (3) freeze.

Anti-ESP#

Anti-ESP hides each player from anyone who can't actually see them. Every few ticks Kratos traces lines of sight from the viewer's eyes, and from where the third-person camera would be, to the other player. If solid blocks cover every line, that player is removed from the viewer's client, so ESP and tracers have nothing to draw. As soon as a line of sight opens, the player is shown again. Glass, ice, leaves and barriers don't hide anyone.

Anti-ESP needs a Nemesis license that includes the Hide Entity add-on. Put that key in license.yml under hide-entity-license-key. If Nemesis is installed on the same server, Kratos reads its key automatically. Without a valid key, Anti-ESP stays off and the console says why. Hidden players stay in the tab list.

KeyDefaultWhat it does
anti-esp.enabledtrueTurns Anti-ESP on when the Hide Entity key is valid.
anti-esp.interval-ticks4How often lines of sight are checked.
anti-esp.min-distance8.0Players closer than this are always shown.
anti-esp.max-distance80.0Players further than this keep their current state.
anti-esp.reveal-margin0.6Extra blocks around a player that count as visible, so they appear just before they round a corner.
anti-esp.lookahead-ticks3.0How far ahead a moving player's position is predicted.
anti-esp.third-persontrueAlso checks from the front and back third-person camera.
anti-esp.combat-grace-ms5000Players who attacked recently stay visible within 24 blocks.
anti-esp.bypass-permissionkratos.antiesp.bypassViewers with this permission see everyone.

Players in spectator mode and Bedrock players always see everyone.

Alerts#

A flag shows up in chat for every staff member with alerts on. Hover an alert to see the check's detail, and click it to spectate the player.

Recorded in game: a test client hitting from 4.4 blocks at 23 CPS. Staff see each failed check in chat, and the flagged player gets a warning tag above their head.

Alerts are on at join for anyone with kratos.alerts.enable-on-join and kratos.alerts. A staff member who turns them off with /kratos alerts stays off across rejoins and restarts. Console alerts are off by default. Run /kratos alerts from console to see them there, or set alerts.print-to-console to true to keep them on.

KeyDefaultWhat it does
alerts.alert-on-setbacktrueAlso alerts when a check sets a player back.
alerts.proxy-alertsfalseSends alerts across your proxy network.
alerts.click-to-spectate.enabledtrueAdds the click-to-spectate action to alerts.
alerts.click-to-spectate.require-permissionfalseShows the shortcut only to staff with kratos.spectate.clickalert.
discord-webhook.webhookemptyDiscord webhook URL for flag embeds.
discord-webhook.embeds.flag.enabledfalsePosts each flag as a Discord embed.

When a player joins, alert-enabled staff get a line with a hover card showing the player's client brand, version, Kratos flag count, whether it's their first join, their country and whether they're on a VPN or proxy. Turn it off with JoinNotifier.enabled.

Flag log#

/kratosflags (or /sus) opens the last 200 flags as one head per flagged player. Filter by All, Cheating or Suspicious at the bottom of the menu.

Kratos flag log menu
/kratosflags: every flagged player on one page, newest first.

Click a head to see that player's flags. Each entry shows the check, the verdict and the violation level. Click an entry to teleport to the player if they're online.

Kratos flag log entry
One flag in the log. Hover for the check, violation level and details, click to teleport to where it happened.

Staff with kratos.report see a Report False Flags button. Pick the flags that fired wrongly, add a note, and they go to the BlazeZ developers with the check's full detail. The flag log is kept in memory and clears on restart. For long-term history, turn on history.enabled or use the web panel.

Checks catalog#

/kratoschecks opens every check grouped by category. Click a category to see its checks, then click a check to edit its settings live.

Kratos checks catalog
/kratoschecks: one book per check category, showing how many of its checks are on.

Every check can be switched on or off and has violations-to-flag, decay, setback-violations, display name and description, plus whatever keys its own section in checks.yml holds. Numbers have a plus and minus stepper (shift for 10 at a time) and a type-an-exact-value option in chat. Changes are written to checks.yml.

Check list#

Checks sit in 14 categories: Combat, Aim, Movement, Elytra, Vehicle, Timer, Placement, Breaking, Inventory, Automation, Protocol, Exploit, Chat and AI. A check's name is what alerts show, the name of its section in checks.yml, and the <check> part of kratos.exempt.<check>. Experimental checks only run while experimental-checks is true.

Configs from older Kratos versions are updated on startup and keep their values.

Combat (20)
CheckWhat it catches
AntiExplosionTook less explosion knockback than the prediction allows.
AntiKnockbackTook less knockback than the prediction allows.
AttackUseOrderUsed an item right after attacking in the same tick (experimental).
AttackWhileUsingAttacked while using an item (experimental).
DualInteractInteracted with a block and an entity in the same tick (experimental).
HandOrderInteracted with the off hand before the main hand (experimental).
HitboxHit an entity outside its hitbox.
InteractOrderSent entity interactions in the wrong order (off by default).
InvalidHitVectorInteracted with a point outside the target's hitbox.
KillAuraAttacked a bait entity no legit crosshair could hit.
MultiHitVectorInteracted with different points of an entity in the same tick (experimental).
MultiTargetInteracted with multiple entities in the same tick (experimental).
NoSwingAttacked an entity without swinging.
ReachHit an entity from farther away than possible.
SelfInteractInteracted with self.
SwingOrderSent the attack and arm swing in the wrong order.
SwingWhileUsingSwung while using an item (experimental).
TriggerbotHit a probe target the moment it entered the crosshair.
UnknownEntityInteracted with an entity that does not exist (experimental).
WallHitAttacked an entity through a solid wall (off by default).
Aim (5)
CheckWhat it catches
DuplicateRotationSent the same rotation twice in a row.
IgnoredRotationIgnored a rotation the server set.
InvalidPitchSent a pitch past straight up or down.
SilentRotationUsed an item with a rotation the camera never had.
YawWrapWrapped the yaw a full turn in one tick.
Movement (11)
CheckWhat it catches
AbilitySpoofClaimed to be flying while unable to fly.
BlinkKept answering the server while holding back movement (experimental).
DuplicateInputSent movement input twice in one tick (experimental).
GroundSpoofSent an on-ground state the prediction disagrees with.
MicroMovementSent a position update without moving far enough (experimental).
MissingPositionUpdateWent too long without sending a position update.
NoFallClaimed ground contact with nothing below to dodge fall damage.
NoSlowWas not slowed while using an item.
PhaseMoved through a solid block.
SimulationMoved differently than the movement prediction allows.
SpearLungeLunged before the spear was charged.
Elytra (9)
CheckWhat it catches
DoubleGlideStarted gliding while already gliding.
GlideInVehicleStarted gliding in a vehicle (experimental).
GlideInWaterStarted gliding in water (experimental).
GlideOnGroundStarted gliding while on the ground.
GlideSpamStarted gliding too frequently.
GlideWhileFlyingStarted gliding while flying (experimental).
GlideWithLevitationStarted gliding with levitation (experimental).
GlideWithoutElytraStarted gliding without an elytra (experimental).
GlideWithoutJumpStarted gliding without jumping.
Vehicle (7)
CheckWhat it catches
InteractWhileRowingAttacked or used an item while rowing a boat (experimental).
InvalidPaddleSent incorrect boat paddle states (experimental).
InvalidVehicleInputSent impossible vehicle input values.
InvalidVehicleJumpJumped in a vehicle that cannot jump (experimental).
PaddleWithoutBoatSent boat paddle states while not in a boat (experimental).
SteerWithoutItemSteered a pig or strider without the item on a stick.
VehicleSpoofClaimed to be in a vehicle while not in a vehicle.
Timer (5)
CheckWhat it catches
BurstTimerCaught up on lagged movement faster than allowed.
SlowTimerSent movement slower than the game runs (experimental).
TickTimerSent more than one movement per client tick.
TimerSent movement faster than the game runs.
VehicleTimerSent vehicle movement faster than the game runs.
Placement (12)
CheckWhat it catches
AirPlacePlaced a block against air or liquid.
FarPlacePlaced a block from too far away.
FastPlacePlaced blocks on every tick for longer than a player can click.
GhostHandInteracted with a block through a wall.
HiddenFacePlacePlaced a block against a face hidden from view.
InvalidCursorPlaced with a cursor position outside the block.
InvalidPlaceFacePlaced against an impossible block face.
MultiPlacePlaced multiple blocks in a tick (experimental).
NonFiniteCursorPlaced with a non-finite cursor position.
PlaceWithoutLookingPlaced a block while not looking at it.
ScaffoldRotationRepeated the exact same turn between block placements (experimental).
UsePlaceOrderUsed an item before placing the block in the same tick (experimental).
Breaking (11)
CheckWhat it catches
AirBreakBroke air, liquid or another block that cannot be broken.
BreakWhileUsingBroke a block while using an item (experimental).
BreakWithoutLookingBroke a block while not looking at it (experimental).
DigFaceMismatchDug a different face than the one it cancelled.
FarBreakBroke a block from too far away (experimental).
FastBreakBroke a block too quickly.
HiddenFaceBreakDug a block face hidden from view.
InvalidBreakFaceDug an impossible block face.
InvalidDigCancelCancelled digging a block it was not digging.
MultiBreakBroke multiple blocks in a tick.
NoSwingBreakBroke a block without swinging (experimental).
Inventory (11)
CheckWhat it catches
ClickTypeOrderMixed inventory click types in one tick (experimental).
ClickWhileMovingClicked in the inventory while moving.
CloseWhileMovingClosed the inventory while moving.
DropOrderOpened the inventory or swapped hands while dropping an item (experimental).
DropSwapOrderDropped or swapped items in the middle of another action (experimental).
DuplicateSlotSelected the hotbar slot it already held.
InvalidClickSent an inventory click with an impossible button (experimental).
InvalidSlotSelected a hotbar slot that does not exist.
InventoryMoveMoved while a container GUI was open.
InventoryOrderOpened, clicked or closed the inventory in the wrong order (experimental).
SlotSwitchOrderSwitched hotbar slot in the middle of another action (experimental).
Automation (5)
CheckWhat it catches
AutoAnchorPlaced, charged and detonated respawn anchors faster than a player can switch items.
AutoArmorEquipped armor in a way a player operating the inventory GUI could not.
AutoTotemMoved a totem in a way a player operating the inventory GUI could not.
AutoWebPlaced cobwebs on an enemy faster or more precisely than hands can.
BaritoneMoved and turned like a pathfinding bot.
Protocol (15)
CheckWhat it catches
ActionAfterMoveSent an action after its movement packet in the same tick.
ActionOrderCombined actions in one tick that a client sends apart (experimental).
ChunkBatchOrderAcknowledged chunk batches out of order (experimental).
InvalidEntityActionSent an entity action with impossible values.
InvalidItemActionSent a drop, swap or release action carrying block data.
InvalidKeepAliveAnswered a keep-alive the server never sent.
InvalidSequenceSent an out of order block action sequence number (experimental).
InvalidSpectateSent spectate packets while not in spectator mode.
InvalidTransactionRejected a server transaction.
InvalidUseItemSent an impossible use item packet.
RespawnWhileAliveTried to respawn while alive (experimental).
SkippedTransactionSkipped a transaction the server sent.
SprintSneakOrderActed in the same tick it toggled sprint or sneak (experimental).
TickEndOrderSent a packet after its movement and before the tick ended (experimental).
UseInteractOrderUsed an item before interacting with an entity in the same tick (experimental).
Exploit (11)
CheckWhat it catches
CreativeClickSent creative mode inventory clicks while not in creative mode.
InvalidBookEditSent an invalid book edit.
InvalidBundleSlotSelected a bundle slot that does not exist.
InvalidViewDistanceSent a view distance below the minimum.
LecternClickClicked slots in a lectern.
LongAnvilNameRenamed an item past the anvil name limit.
NegativeClickSent an inventory click with a negative slot or button.
NegativeSequenceSent a negative sequence number.
NonFiniteMovementSent a non-finite position or rotation.
OutOfBoundsPositionSent a position outside the world.
OversizedTabCompleteSent an oversized tab completion request.
Chat (4)
CheckWhat it catches
ChatWhileHiddenChatted while chat is hidden (experimental).
ChatWhileMovingChatted while moving (experimental).
EmptyTabCompleteSent an empty tab completion request (experimental).
InvalidChatSent an invalid chat message or command.
AI (8)
CheckWhat it catches
AimAIAimed in a pattern the aim model rates as assisted.
ClickerAIClicked in a pattern the click model rates as automated.
CombatAIFought in a pattern the combat model rates as cheating.
CrystalAIPlaced and broke crystals like a crystal aura.
HitboxAILanded hits outside the visible hitbox too consistently.
MovementAIMoved in a pattern the movement model rates as cheating.
ReachAIHit distances piled up against a reach limit.
SmashAITimed mace smashes like a routine.

Freeze#

When a check piles up enough violations inside its window, Kratos freezes the player in place for freeze.seconds (30). The player is dropped to solid ground first, sees a title, and a hologram floats over their head. Freezing stops cheats a check can detect but can't cancel on its own.

Freezing a player
/kratos freeze Cheat3r 30 holds the player in place for 30 seconds.

The global threshold is freeze.violation-threshold (30). A check with its own freeze-violations in checks.yml uses that instead, and 0 turns freezing off for that check. Without a per-check value, Kratos never freezes below the check's own violations-to-flag, so noisy checks don't freeze a player before staff ever saw an alert.

KeyDefaultWhat it does
freeze.enabledtrueMaster switch for automatic freezes.
freeze.teleport-to-groundtrueDrops the player to solid ground before freezing.
freeze.disabled-checks[]Checks that still flag but never freeze.
freeze.block-commands.enabledtrueBlocks commands while frozen. With an empty blacklist, all commands are blocked.
freeze.on-freeze.commands[]Console commands run when a player is frozen.
freeze.on-logout.enabledfalseRuns freeze.on-logout.commands (a ban by default) when a frozen player logs out.
freeze.ban-on-repeat.enabledfalseBans a player frozen freezes (3) times within within-hours (24).
freeze.hologram.enabledtrueShows the hologram over a frozen player.

freeze.ban-on-repeat also counts freezes that would have happened while freeze.enabled is false. Checks in freeze.disabled-checks never count toward it.

Client fingerprint#

Fingerprint identifies cheat clients and mods when a player joins, from the client brand, registered plugin channels, mod loaders and a sign translation probe. All of it is set in fingerprint.yml. Bedrock players are skipped by default (skip-bedrock).

Kratos join fingerprint tooltip
Hover the join alert to see the client brand, version, flag count, first join, country and VPN check.
DetectionDefaultWhat it catches
brandOnClient brands on the signatures.brands list, and brand spoofing.
channelOnPlugin channels on the signatures.channels list.
vanilla-spoofOnClients claiming a vanilla brand while showing modded traits.
loaderOnFabric, Forge, NeoForge or Quilt, only for the loaders you set to true (all false by default).
sign-probeOnMods from the signatures.sign-probes list, such as Meteor, freecam mods, X-ray mods and Baritone.
fast-rotationOnRotation faster than max-degrees-per-tick (180) for streak (5) ticks.
radarOffMinimap mods on the signatures.radar-channels list.
freecam-behaviorOffFreecam-style behavior while the player's body stays still.

Each detection has an action. ALERT tells staff only. PUNISH also runs the enforcement tiers: enforcement.first-strike on the first offence (a kick by default) and enforcement.repeat-strike on the next (a ban by default). Strikes survive a kick and reset on restart.

The kick screen is a multi-line message built from enforcement.kick-message.

Recorded in game: a cheat client is refused at login.

Use warn-only for mods that should never be punished, and whitelist to allow a mod for specific players. Players with kratos.fingerprint.bypass aren't punished, and staff are warned when they join with a flagged client. While a sign probe runs, the player can't open inventories (sign-probe.block-inventory).

Replay#

Kratos keeps a rolling recording of every player so staff can watch what happened. /kratosreplay opens a picker of everyone with footage. Picking a player opens a setup screen for the rewind window, playback speed, follow distance and what the replay shows.

Starting a replay spawns a body only you can see, controlled from a hotbar: rewind 10 seconds, slow down, pause, speed up, skip 10 seconds, open the subject's inventory as it was at that moment, teleport to them, and stop. Your own items come back when it ends, and you take no damage while watching.

Players within nearby-player-radius (48) of the subject appear too. Pearls, arrows, tridents and potions fly again, block edits show as ghost blocks, and attacks, deaths, chat, commands, pickups, drops and inventory clicks print as a timestamped log.

KeyDefaultWhat it does
Replay.enabledtrueTurns recording on.
Replay.recording.max-history-seconds900How far back the rolling recording goes.
Replay.recording.ignored-worlds[]Worlds that aren't recorded.
Replay.flag-capture.enabledtrueSaves a replay automatically when a check flags.
Replay.flag-capture.min-violations10Violations before a flag capture is saved.
Replay.flag-capture.max-saved200Saved flag replays kept before the oldest are deleted.
Replay.manual-capture.max-seconds120Longest window /kratosreplay <player> start can keep.
Replay.web-viewer.enabledtrueUploads saved replays to the web panel for 3D playback in the browser.
Replay.web-viewer.terrain-radius32Blocks of terrain around the player sent with a web replay (8 to 80).

Nobody but the viewer sees a replay. When Spartan's replay module is running on the same server, Kratos doesn't record and points staff to Spartan's /replay.

Web panel#

Kratos links your server to the Kratos panel on its own, using your license key. Open it from the BlazeZ portal and every server running on your key is listed with live player counts, the flag feed, per-server analytics and a settings editor. Starting another server on the same key adds it within seconds.

Settings saved in the panel are pushed to the server and applied with a live reload. Keys that run console commands are refused, so the panel can change thresholds and toggles but can't make a server run a command.

The panel's Freeze page lists every check that can freeze, grouped by category, with a switch per check and per category. A check switched off still flags and alerts but never freezes, and anyone frozen by it is released. Changes land within a second and are stored in freeze.disabled-checks.

The panel's Replays page plays every uploaded replay in 3D, with POV, follow, orbit and free cameras, a timeline marked with flags, hitboxes and the reach line on each hit. The MP4 button saves a replay as a video file: pick the whole replay or from the playhead, a speed of 0.25x to 2x and 720p or 1080p. The video uses the current camera, hitbox and aim line settings and can show the player, flags and time on screen. It renders in your browser and needs Chrome, Edge or Safari.

cloud.enabled turns the panel link off, and cloud.server-name sets the name the server shows under.

AI analyst#

The AI analyst gives a second opinion on a flag before any automatic ban. It reads the check, violation level, check detail and client brand, then returns a verdict, a confidence score and a plain-English case file for staff. It's off by default.

Set it up in ai.yml under ai.analyst: enabled, api-key, model and base-url. It works with Anthropic and with any OpenAI-compatible provider through base-url. When confidence reaches auto-ban-confidence (90), it runs ban-command. Below that, it posts the verdict to staff (post-to-staff). If api-key holds your Kratos license key instead of an AI provider key, Kratos warns in console and keeps verdicts off until a real provider key is set.

Bedrock players#

Bedrock players are detected through Floodgate or Geyser. Any name starting with bedrock-username-prefix (.) is also treated as Bedrock, which covers servers where Geyser runs somewhere else. Bedrock players skip every Java check and are judged by a separate Bedrock engine (bedrock-checks-enabled, default true).

Floodgate or Geyser sometimes report a player as Bedrock only after login. Kratos looks again 1 and 5 seconds after join and takes such a player off the Java checks.

The Bedrock engine needs a live Geyser session. If Geyser runs on your Velocity proxy, install the same Kratos jar on the proxy too, where it loads as a Velocity plugin:

  1. Copy the Kratos jar into the proxy's plugins folder.
  2. Make sure Geyser-Velocity is installed on the proxy, and Floodgate on every backend Bedrock players can join.
  3. Restart the proxy, then every backend running Kratos.
  4. Check the proxy console for [bedrock] Bedrock protection active on the proxy. and the backend console for a relay connected line once a Bedrock player joins.

Flags from the proxy are handed to the backend the player is on, so alerts, freezes and the flag log work the same as for Java players. bedrock-relay-enabled turns the backend's relay listener off. Servers with Geyser installed locally don't need this.

The Bedrock boat check (BedrockVehicle in checks.yml, off by default) only runs where Geyser is installed on the backend. On a Geyser-on-proxy network it stays inactive.

Other options#

Ignored zones make whole worlds or WorldGuard regions check-free: no flags, alerts, setbacks or freezes. Checks keep running inside so they're ready when the player walks out. Set ignored-zones.enabled, worlds and regions. With keep-setbacks: true the zone stays enforced but silent.

Flag history stores every flag in a database when history.enabled is true. history.database.type is SQLITE, MYSQL or POSTGRESQL, and history.server-name tags rows so several servers can share one database.

Cheat review posts a daily, weekly and monthly summary of flags to the console, with totals per check and per player and the busiest hour. It needs history.enabled. Turn it on with cheat-review.enabled and pick the hour with run-hour (4).

Menu titles can be changed with gui.custom-screen-titles. Set enabled: true and edit the title of each menu: flag-log, checks, check-settings, report, replay-picker, replay-setup and replay-saved. {name} is the check or player shown in that menu.

Player messages ship in 26 languages: EN, ES, RU, DE, FR, PT, PL, TR, ZH, ID, IT, VI, NL, KO, CS, TH, HU, AR, JA, UK, SV, DA, RO, SK, HE and LT.

On Folia, lag is measured per region, and combat verdicts stop at suspicious instead of freezing or banning, because region lag is only partly observable. Staff still get every alert.

Placeholders#

PlaceholderReturns
%kratos_version%Running Kratos version.
%kratos_prefix%The message prefix.
%kratos_player%Player name.
%kratos_player_uuid%Player UUID.
%kratos_player_ping%Ping measured by Kratos.
%kratos_player_brand%Client brand.
%kratos_player_version%Client version.
%kratos_player_h_sensitivity%Detected horizontal mouse sensitivity, in percent.
%kratos_player_v_sensitivity%Detected vertical mouse sensitivity, in percent.
%kratos_player_fast_math%true when the client uses fast math.
%kratos_player_tps%Server TPS.

Developer API#

The download has a KratosAPI jar in the Developer API folder. Add it as a compile-only dependency and never shade it. PlayerFlagEvent fires after Kratos has decided how to respond and can't be cancelled. PlayerPreFlagEvent fires before the violation is counted, and cancelling it makes Kratos act as if the check never triggered.

@EventHandler
public void onPreFlag(PlayerPreFlagEvent event) {
    if (isInMyMinigame(event.getPlayer())) {
        event.setCancelled(true);
    }
}

KratosAPI.get() gives you tracked players, check info and per-player check state, alert toggles, read-only config and the flag history. Keep PlayerPreFlagEvent listeners fast, because they run on the path that decides a flag.

Troubleshooting#

Players get kicked with a timeout moments after joining when Vulcan also runs. Set connection.other-anticheat-support to true in plugins/Vulcan/config.yml. Vulcan treats replies to Kratos's lag-compensation packets as invalid otherwise. Kratos prints this fix to the console on startup when the setting is off.

An op is never flagged. Check bypass.players and bypass.worlds, and whether bypass.exempt-permissions is true. With it on, every op matches every kratos.exempt.<check> node.

Bedrock players on a Velocity network aren't checked. Geyser runs on the proxy, so install Kratos there as described in Bedrock players.