In-Game Logging
A set of Lua scripts run inside your Roblox game and talk to the dashboard: logging joins, leaves and chat, screening new accounts, and running lockdowns and events triggered from the moderator panel.
Setup
- Generate an ingest key. Settings → Game Join Logs → Generate Key. It is shown exactly once — copy it now.
- Copy the three constants the same panel shows you: the dashboard URL, your guild ID, and the key.
- Paste them into the top of each script you use, replacing the placeholders.
- Install the scripts in your admin system's script runner.
The dashboard URL must be reachable from the public internet. These scripts run on Roblox's servers, not on your machine — localhost and private network addresses will never work. If your dashboard is only reachable over a private network, in-game logging cannot reach it.
The ingest key is a credential. Anyone holding it can post fake join, leave and chat events into your logs. Never commit it to a repository, paste it in a public channel, or leave it in a screenshot. If it leaks, regenerate it and update your scripts.
The scripts
| Script | What it does |
|---|---|
join-logger | Logs joins and screens account age. Under 7 days is logged and kicked automatically; under 30 days is flagged for review; older is cleared. Both thresholds are constants at the top of the file. |
leave-logger | Logs departures. |
chat-logger | Logs in-game chat. Messages are truncated to 500 characters. |
lockdown-controller | Runs the lockdown protocols — sounds, lighting, banners and PA announcements. Each protocol is fetched whole from the dashboard, tracks and holds included, and re-read about once a minute. Also sends the session heartbeat. |
event-controller | Runs pre-made site events. Sequences are fetched from the dashboard at boot rather than living in the file. |
system-controller | Runs System Events — typed announcements and scripted sequences, from the toolbox or !sys <preset> in game. Both arrive composed from the dashboard. Separate from the event controller, so a typed announcement can talk over a running event. !sys stop, or Stop in the toolbox, cuts a sequence short and resets the lighting. |
The join logger kicks people automatically. Accounts under 7 days old are removed as they join, with no staff confirmation. This is an anti-raid measure and it will catch genuine new players. Raise or lower MINIMUM_ACCOUNT_AGE to suit your community, or set it to 0 to log without kicking.
Who can trigger what
- Lockdowns —
events.protocols, Manage Server, or staff-level access. See Lockdown Protocols. - Events —
events.trigger, Manage Server, or staff-level access. See Site Events. - Renaming either —
events.designations, the Head Event Host's grant.
The in-game chat triggers do not read your permits. Both controllers carry a hardcoded allowlist of Roblox usernames, shipped with the original author's accounts. Replace it before you install them.
Commands travel as action names, never as raw command strings. Each queued command is drained exactly once, so multiple game servers polling at the same time cannot double-run one. Anything not collected within 60 seconds expires.
Known issues
The tram controller's dashboard half does not exist. The script polls an endpoint that was never built, so it cannot be driven from the dashboard. Its in-game chat trigger and automatic shuttle still work.
The event controller ships with debug chat on. It announces its own state in chat until you set DEBUG_CHAT = false.
Paste from game-scripts/paste/, not from game-scripts/. Every addon must stay under 16 KiB — Roblox's script box truncates a longer paste silently, and the symptom is a script that loads but never polls. The files in game-scripts/ are the documented sources and run about a third comments; npm run paste writes comment-free copies of them alongside, which is where the headroom comes from. Edit the sources, rebuild, paste the copy.