Admin & Permissions
On this page9
The ACE gate
add_ace group.admin recognition.admin allow
add_principal identifier.license:YOUR_LICENSE_HERE group.adminOr for a single person, without a group:
add_ace identifier.license:YOUR_LICENSE_HERE recognition.admin allow| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Admin.Ace | 'recognition.admin' | any ACE name | The parent permission. Allowing it allows every child level. |
Config.Admin.FrameworkGroups | { 'admin', 'god', 'superadmin' } | your group names | Framework groups that also count as admin. |
Config.Admin.TxAdmin | true | true / false | txAdmin admins count as admin. |
Config.Admin.TxAdminPerms | { 'view' } | list of levels | What a txAdmin login may do. |
The six levels
Give a staff role one child ACE instead of the parent.
| Level | ACE | What it unlocks |
|---|---|---|
view | recognition.admin.view | Open the panel: Overview, Pair (with live watch and trend chart), Lookup, Timeline, Deaths, Audit. Also recognition:status, recognition:check, recognition:verifyproofs, recognition:selftest. |
edit | recognition.admin.edit | Edit, delete and restore memories, reset familiarity, keep or wipe memories after a death, delete photos, hand out standalone virtual items. |
export | recognition.admin.export | One-click Discord export of a pair. |
classifier | recognition.admin.classifier | The Clothing page: run Auto-scan, review conflicts, answer the new-items notice, recognition:tags. |
identity | recognition.admin.identity | Identity resets, free implants, implant cooldowns. |
settings | recognition.admin.settings | The Settings page (the in-game settings editor), recognition:prune, recognition:debug. |
add_ace group.mod recognition.admin.view allow
add_ace group.mod recognition.admin.export allow| Key | Default | What it does |
|---|---|---|
Config.Admin.Perms | one ACE per level, as above | Rename the child ACEs if your permission scheme needs different names. |
Config.Admin.GroupPerms | {} | Optional framework-group mapping: { mod = { 'view' }, admin = 'all' }. |
The admin panel
/recognition:admin opens the panel: a tablet with an icon sidebar on the left. A
page or button you have no level for stays hidden or read-only.
| Page | What it is for |
|---|---|
| Overview | Live numbers (players online, scanning, live results), counts for the last 24 hours, a to-do list and the integrity check of the proof and admin logs. |
| Pair | Two players side by side: % rings, cue bars and short chips for both directions. The details sit behind the (i). |
| Lookup | Find a player with live suggestions. Search by name, server id, character key, device serial (HC-, VC-, MS-) or report id (RC-, WS-, DS-); the "Search by" hint shows what you can type. |
| Timeline | Pick a player first, then read a day-by-day list with one short line per event. Click a line for the details. Filters for 24 h / 7 d / 30 d and for scans, proofs, papers, deaths and admin actions. |
| Deaths | New Life Rule cases with Keep memories / Restore memories / Wipe memories buttons (the buttons need the edit level). See Death & New Life Rule. |
| Clothing | Summary tiles, filter chips and the item table for clothing Auto-scan. Shown only with the classifier level. |
| Audit | The admin log. |
| Settings | The in-game settings editor (below). Shown only with the settings level. |
Page by page with pictures: Admin Panel.
Reasons
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Admin.RequireReason | true | true / false | Edits, deletes, resets and death decisions need a written reason, which is logged. |
Every reason ends up in recognition_admin_log, which is tamper-evident like the
proof log (recognition:verifyproofs checks both), and in the Admin webhook when one
is set.
Self-protection
| Key | Default | Allowed | What it does |
|---|---|---|---|
BlockSelfEdit | true | true / false | No edits of memories that involve your own character. |
BlockSelfView | true | true / false | No pair view, live watch or lookup of your own character. |
DebugShowsMode | false | true / false | Whether the debug view shows remember / recognise mode. Never for your own character, whatever this is set to. |
LogViews | true | true / false | Log admin views in the database, not just writes. |
Panel behaviour
| Key | Default | Allowed | What it does |
|---|---|---|---|
ShowLicenses | true | true / false | Show license ids in the panel. Discord follows ServerConfig.Discord.IncludeLicenses separately. |
WatchPushMs | 500 | ms | How often a live watch updates. |
MaxWatchers | 10 | count | Most simultaneous live watches. |
TimelineDefaultDays | 7 | days | Default range of the Timeline page. |
TimelineMaxDays | 60 | days | Furthest back the Timeline page (and the trend in a Discord export) goes. |
PageSize | 50 | rows | Rows per page in lists. |
The in-game settings editor
Admins with the settings level can change most of config.lua from the panel,
without a restart. Changes are stored in recognition_settings and survive restarts.
Every setting has a plain title and an (i) tip that says what it does in one or two sentences; the settings are sorted into groups with friendly names (Memory, Scan and quick look, Face implant, ...). Search the list, or use the All / Changed / File only chips. A lock shows why a row cannot be changed here: Only in config.lua, Needs the … admin level, or Edit this one in config.lua (lists and tables).

The titles and tips come from locales/en_settings.lua. To translate them, copy it to
locales/xx_settings.lua (your language code) and translate the values.
| Key | Default | Allowed | What it does |
|---|---|---|---|
LiveSettings | 'all' | 'all' · a list of key paths · {} | What may be changed in game. all = every key that is not in FileOnly. {} = the page is read-only. |
SettingsMaxPaths | 50 | 1–200 | Most settings one save may change at once. |
SettingPerms | see below | prefix → level | An extra admin level a key needs on top of settings. |
DiscordActions | true | true · false · a list of actions | Also post logged admin actions to the Admin webhook. |
With LiveSettings = 'all' that includes the implant price and wait, the police and
description caps, the lab settings and the death radius.
What every change goes through
- ACE gate — the
settingslevel, plus any extra level fromSettingPerms. - Schema check — the value has to be the right type and shape.
- Range — numbers are kept inside their allowed range on the server; the page shows "Limited to …" when a value was cut.
- Audit log — the old and new value, the admin, and the written reason, into the tamper-evident
recognition_admin_log. - Discord — per
DiscordActions. - Reset to file — any override can be undone, individually or all at once, back to the
config.luavalue.
Extra levels per area
SettingPerms = {
['Implant.'] = 'identity', -- free implants are an identity reset
['Report.'] = 'edit',
['Lab.'] = 'edit',
['Death.'] = 'edit',
}An admin with settings alone sees those rows read-only. {} means settings
is always enough.
What can never be changed in game
FileOnly = {
'ServerConfig.*',
'*System', 'Framework', 'MulticharSystem', 'MDT',
'Admin.Ace', 'Admin.FrameworkGroups', 'Admin.TxAdmin', 'Admin.TxAdminPerms', 'Admin.Perms',
'Admin.GroupPerms', 'Admin.LiveSettings', 'Admin.FileOnly',
'Admin.SettingPerms',
'Admin.BlockSelfEdit', 'Admin.BlockSelfView', 'Admin.RequireReason',
'Admin.LogViews', 'Admin.DiscordActions',
'Memory.Disguises',
}| Locked | Why |
|---|---|
Everything in ServerConfig | Webhook URLs, the salt, photo keys, rate limits, retention. Server-only — it is never even offered in the panel. |
Every integration selector and Config.MDT | Resolved once at boot. Changing one live would leave half the script talking to the old adapter. |
| The admin permission and audit settings | Admins can never widen their own rights, or switch off their own logging, from inside the game. |
Config.Memory.Disguises | A boot-shape switch: flipping it live has no defined transition for disguise rows that already exist. |
'<Table>.*' locks a whole table and '*System' locks every integration selector.
Add your own paths to this list to lock more — entries are added to the built-in
list, never replace it.
Discord for admin actions
| Value | Behaviour |
|---|---|
true (default) | Every logged admin action goes to the Admin webhook. |
false | None do. The database still logs everything. |
| a list | Only those actions, e.g. { 'settings_save', 'settings_reset', 'identity_reset' }. |
Boot lines
[5code-recognition] Admin settings overrides active: 7 (see the admin panel > Settings, or reset them to the file defaults).Printed only when there are any. Nothing is printed when there are none.
[5code-recognition] Ignored 1 stored setting override (Config.Foo.Bar): unknown or invalid. The config.lua value is used.An override whose key no longer exists — usually after an update that renamed something — is dropped with that one warning and the file value is used.
Commands and the level each needs
| Command | Level |
|---|---|
recognition:status | console / view |
/recognition:admin [idA] [idB] | view |
recognition:check <idA> <idB> | console / view |
recognition:verifyproofs [fromId] | console / view |
recognition:selftest | console / view |
recognition:export <idA> <idB> [note] | console / export |
/recognition:tags [id] | classifier |
/recognition:giveitem <id> <item> [count] | edit |
recognition:resetidentity <id|charKey> <reason> | console / identity |
/recognition:freeimplant <id> <reason> | identity |
recognition:implantcooldown <id|charKey> <days> <reason> | console / identity |
recognition:prune | console / settings |
/recognition:debug | settings |
Rename any command, or set it to false to turn it off, in Config.Commands.
Admin menu buttons
Any admin menu can open the panel with one server-side call:
exports['5code-recognition']:OpenAdminPanel(source, targetA, targetB)The permission check happens on our side, so the button is safe to add anywhere. See Admin Menus.