Sentinel Enforcer: The Full Description
(the Workshop page is the executive summary; this is the complete picture)
Sentinel Enforcer is a server-side DayZ mod that reports what happens on your server - sessions, combat, chat, items, vehicles, building, server health - into the dayz.fyi platform as structured, authenticated events. Players who join a server running it see nothing new; it adds no content, no UI, no client download. This page is written for the person who runs the server and wants to know exactly what the mod does, what it costs, what it hooks, and how to turn any part of it off.
If you only want to install it, the short version on the Workshop page is enough. If you are evaluating it for a community that asks hard questions about mods - read on.
What it captures
Everything below is captured on the server and shipped in HMAC-signed batches over HTTPS to the dayz.fyi ingest endpoint. Nothing is read from or sent to players' machines.
| Category | What you get on the dashboard |
|---|---|
| Sessions | who connected and disconnected, and when |
| Combat | kills, deaths, hits and shots - with weapon, distance and hit zone where the engine provides them |
| Chat | in-game chat messages |
| Items | item pickups and hand/inventory interactions, by item type |
| Vehicles | who drove what, vehicle destruction and despawn |
| Building and raids | base parts placed, dismantled, damaged, destroyed; flags; code-lock access; base part positions |
| Server health | frame time, freezes, restart-cycle trends and the mod's own footprint, every 30 seconds |
| Server lifecycle | boots, the mod set you run, and a previous-session report (crashes, script errors) where your host allows it |
Anything the platform does not recognise is stored as an unknown event rather than dropped, so a newer mod never loses data to an older platform.
Optional anti-cheat signals. The mod can contribute observe-only inputs to the dashboard's review tools. It never acts on its own: verdicts, thresholds and review stay with your staff on the dashboard, and take-action (kick / message) is opt-in and human-initiated. The detection methods themselves are deliberately not documented on any public page - see the last section.
Optional add-ons
The core mod captures what vanilla DayZ exposes. Coverage for community mods ships as separate Workshop items so a server never sees an "addon X required" warning for a mod it does not run:
| Workshop add-on | Adds |
|---|---|
| Sentinel Enforcer - Expansion | DayZ-Expansion Market, Groups, Hardline, Quests events |
| Sentinel Enforcer - VPPAdminTools | VPP admin command logging |
| Sentinel Enforcer - CodeLock | Code Lock access logging |
| Sentinel Enforcer - BreachingCharge | breaching charge placed / detonated / defused |
Subscribe only to the ones matching the mods your server runs.
Installation
- Add the server on dayz.fyi: open your community page, hit Add
server, and copy the
sntl_v1...token it gives you. - Subscribe to the Workshop item on your server's Steam account.
- Copy
@SentinelEnforcer/from the Workshop folder into your server root. - Drop
keys/sentinel_enforcer.bikeyinto your server'skeys/directory. - Launch parameters:
-serverMod=@SentinelEnforcer. (Add-doLogs -adminLogif you also want DayZ's own admin log files - not required by Sentinel.) - Paste the token into
<server profile>/SentinelEnforcer/config.json'sBootstrapTokenfield, then start the server. It connects already linked to your account a minute or two after the server finishes booting - no claim code needed.
Server already running the mod? Booting with no token configured is the fallback path: the mod
self-registers and writes a one-time claim code to
<server profile>/SentinelEnforcer/claim.txt (also printed in the server log). Paste the
clm_... code at dayz.fyi/claim and events start flowing. Both paths
end in the same place.
Tip - server name and map on the dashboard: set steamQueryPort in serverDZ.cfg (DayZ's
default is 27016) so the platform can query your server and fill in its real name and map. Without
it you set the name yourself under Edit settings. Multi-server box: give each instance its own port.
The mod's settings live in <server profile>/SentinelEnforcer/config.json (in mod terms,
$profile:SentinelEnforcer\config.json) - in your profile directory, not inside the mod - so
moving or re-declaring the mod never loses them.
What it costs your server
These are measured numbers, not estimates, taken on populated production servers and cross-checked against the engine's own frame-rate log:
- Total main-thread cost at 100 players: 0.2-0.6% of wall clock. Nearly all of it is the upload pipeline (serialising and signing batches); the mod's per-frame work is about 0.02% of a frame.
- Uploads are sliced across ticks in bounded pieces so a flush cannot stall the simulation; the in-memory event queue is bounded (10,000 events) and has not dropped an event in weeks of fleet telemetry.
- The mod measures its own footprint on every server and reports it alongside your server's frame health, so the numbers above are visible on your dashboard rather than taken on faith. If you want to understand what "server FPS" and frame time mean for players, start with how DayZ multiplayer actually works.
Every hook the mod owns - and how to switch it off
A DayZ mod works by attaching small pieces of code to engine events ("hooks"). This is what the mod is, so it should be fully visible. Three places carry the same list:
- Your server's script log, at every boot: one
[Sentinel] chain-link ...line per hook family stating what it is for, what it cannot do, and how to switch it off - so if you are ever investigating a problem and searching your log, the first-party answer is already there. - Your dashboard: the same list with each family's live on/off state.
- This table.
Every hook calls the original engine code and passes control through; no vanilla gameplay
behaviour is overridden. The kind tells you what class of thing each one is: counter means
it adds one to a number and returns; observe means it reads or reports and never alters an
outcome; seam marks the single hook that touches shared state, which is off by default.
| what the mod hooks | what it is for | what it cannot do | how to switch it off | cost |
|---|---|---|---|---|
| frame stats (counter) | measures how long each server frame takes - the smoothness numbers on your dashboard | alter frame pacing, tick order, or any game logic; it reads the clock, updates a histogram, and returns | core (Enabled=false in config.json disables Sentinel entirely) | about 0.02% of a frame, every frame |
| mission lifecycle (observe) | starts Sentinel with the mission and notes player join, ready, respawn, leave and chat for the session record | block a login, change a spawn, or alter what the engine does with any event; it observes and passes through | core (Enabled=false in config.json disables Sentinel entirely) | negligible (runs only when the event happens) |
| player events (observe) | records hits, deaths, connections, vehicle seat changes and certain server-rejected requests for the kill feed and session history | change damage, deaths, or connection outcomes; every override calls the original and returns its result unchanged | dashboard toggle | negligible (runs only when the event happens) |
| input seam (seam) | an optional, off-by-default capture of some item moves | alter the move itself; off by default, auto-disabled when a known conflicting mod is present, and the only hook that reads shared engine state | config.json HookInputSeam=false | nothing while off (the default) |
| inventory command (observe) | records server-rejected inventory actions for staff review | accept or reject an action; it reads the engine verdict after the engine has made it | config.json HookInventoryCommand=false | negligible (runs only when the event happens) |
| item moved (observe) | records completed item relocations (player, container, ground, vehicle) for the item history | move, block, or alter items; it fires after the engine completed the move | config.json HookItemMoved=false | a cached check per item move when armed; nothing measurable when not |
| ce sweep counter (counter) | counts Central Economy item visits per heartbeat - a world-size and server-health number, not player data | change loot spawning, despawn timers, or any economy decision; one counter increment, then the original runs | config.json HookCESweepCounter=false | one counter increment per loot-economy visit (about 0.03 ms per second on an idle Chernarus) |
| activation counters (counter) | counts how often infected AI, wildlife and vehicle physics tick per second - server-health numbers, not player data | change AI behavior, animal behavior, or vehicle physics; one counter increment, then the original runs | config.json HookActivationCounters=false | one counter increment per AI / vehicle tick (about 0.1 ms per second at 100 active infected) |
| event rate counters (counter) | counts how often the server handles item moves, hits, deaths and remote calls - rate numbers used to size server load, with no detail about who or what; apart from the cargo check listed here it adds no new hooks, it only counts inside hooks listed under item_moved and player_events | change any of those outcomes; each is one counter increment and then the original runs, and the cargo check returns the engine's own answer unaltered | config.json HookEventRateCounters=false | one counter increment each time a counted event happens |
| entity census (counter) | counts how many items, players, infected, vehicles and triggers get created and destroyed - a world-size and churn number, not player data | prevent, delay, or alter any creation or destruction; it adds one counter increment to constructors and destructors that were already running | config.json HookEntityCensus=false | one counter increment when an entity is created or destroyed |
| structure sweep (observe) | records base part positions over time | move or alter structures; it checks positions periodically and reports | config.json HookStructureSweep=false | a short periodic position check of registered base parts |
| building events (observe) | records base parts placed, dismantled, damaged and destroyed, and flags destroyed, for base logs | change building rules, damage, or raid outcomes; it records what the engine already did | dashboard toggle | negligible (runs only when the event happens) |
| codelock (observe) | records code-lock access attempts for base security logs | change whether a lock opens or what the code is | dashboard toggle | negligible (runs only when the event happens) |
| weapon fire (observe) | records shots fired for combat analysis | alter ballistics, ammunition, or hit results | dashboard toggle | negligible (runs only when the event happens) |
| pickup (observe) | records item pickups for the item history | block or alter a pickup; it fires after the pickup completed | dashboard toggle | negligible (runs only when the event happens) |
| magazine (observe) | records certain inventory-action anomalies for staff review | change the action outcome; it reads the engine result and passes it through | dashboard toggle | negligible (runs only when the event happens) |
| admin log (observe) | forwards the server admin-log lines so they also appear on the dashboard | suppress or alter admin-log lines; the engine still writes them exactly as before | dashboard toggle | negligible (runs only when the event happens) |
| vehicle events (observe) | records vehicle destruction and despawn for vehicle history | change vehicle damage, despawn, or physics | dashboard toggle | negligible (runs only when the event happens) |
Owner switches (config.json, default on unless noted): HookActivationCounters,
HookCESweepCounter, HookEventRateCounters, HookEntityCensus, HookItemMoved,
HookInventoryCommand, HookStructureSweep, and
HookInputSeam (an owner veto over a hook that is off by default anyway). Setting one to false
turns that family into a pure pass-through for the whole session and stops its fields from being
sent at all. A false in your config.json cannot be re-enabled from the dashboard - the switch
is yours. Enabled=false turns the whole mod off without uninstalling it.
Privacy and data flow
- Server-side only. The mod runs on the server; players' machines are never touched and nothing is downloaded to clients.
- Same identifiers vanilla already gives admins. Steam ID and DayZ ID - what the server's own admin log exposes. No extra personal information.
- Item types, not inventories. "Player picked up an SKS", never what a player owns.
- Authenticated. Every batch is HMAC-SHA-256 signed with a per-server secret; the platform rejects anything it cannot verify.
- Your data, your org. Events are stored under your organisation on dayz.fyi, where your staff access tiers decide who sees what.
Compatibility and coexistence
- DayZ 1.29, Windows and Linux servers - pure Enforce Script, no native DLL, identical on both.
- Validated against every DayZ game update before the Workshop item is refreshed (the validation badge in the dayz.fyi footer is written by that run).
- Vanilla vehicle classes: the vehicle-activity health counter hooks the eight vanilla car classes directly (count-only, always calls the original) because of how those classes are built. A future DayZ update that changes them can require a Sentinel hotfix; that is exactly what the per-update validation exists to catch, and the Workshop update is the fix.
- Conflicts: none known. The one hook that reads shared engine state is off by default and
switches itself off when a known conflicting mod is present. If you ever suspect an
interaction with another mod, flip the relevant family off in
config.json(you do not need to uninstall anything) and tell us which mod - that report is how the conflict list grows.
What this page deliberately does not document
The anti-cheat review tools on the dashboard use observations the mod can contribute. How those observations are interpreted - signals, thresholds, methods - is not described here or on any public page, for the same reason this site's cheating guide does not publish detection recipes: a public, machine-complete description is a gift to exactly the people it targets. What you get instead is the contract above: every hook is named, what it cannot do is stated, and every family can be switched off by you. Staff who need operating detail get it inside the platform, not from a page anyone can read.
Support
- Platform: dayz.fyi
- Discord: link in the dayz.fyi footer - bug reports and integration questions go there.
- Workshop: the item page carries the executive summary and links back here.