Skip to the content
Docs

Admin & Permissions

On this page9

The ACE gate

cfg
add_ace group.admin recognition.admin allow
add_principal identifier.license:YOUR_LICENSE_HERE group.admin

Or for a single person, without a group:

cfg
add_ace identifier.license:YOUR_LICENSE_HERE recognition.admin allow
KeyDefaultAllowedWhat it does
Config.Admin.Ace'recognition.admin'any ACE nameThe parent permission. Allowing it allows every child level.
Config.Admin.FrameworkGroups{ 'admin', 'god', 'superadmin' }your group namesFramework groups that also count as admin.
Config.Admin.TxAdmintruetrue / falsetxAdmin admins count as admin.
Config.Admin.TxAdminPerms{ 'view' }list of levelsWhat a txAdmin login may do.

The six levels

Give a staff role one child ACE instead of the parent.

LevelACEWhat it unlocks
viewrecognition.admin.viewOpen the panel: Overview, Pair (with live watch and trend chart), Lookup, Timeline, Deaths, Audit. Also recognition:status, recognition:check, recognition:verifyproofs, recognition:selftest.
editrecognition.admin.editEdit, delete and restore memories, reset familiarity, keep or wipe memories after a death, delete photos, hand out standalone virtual items.
exportrecognition.admin.exportOne-click Discord export of a pair.
classifierrecognition.admin.classifierThe Clothing page: run Auto-scan, review conflicts, answer the new-items notice, recognition:tags.
identityrecognition.admin.identityIdentity resets, free implants, implant cooldowns.
settingsrecognition.admin.settingsThe Settings page (the in-game settings editor), recognition:prune, recognition:debug.
cfg
add_ace group.mod recognition.admin.view allow
add_ace group.mod recognition.admin.export allow
KeyDefaultWhat it does
Config.Admin.Permsone ACE per level, as aboveRename 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.

PageWhat it is for
OverviewLive 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.
PairTwo players side by side: % rings, cue bars and short chips for both directions. The details sit behind the (i).
LookupFind 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.
TimelinePick 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.
DeathsNew Life Rule cases with Keep memories / Restore memories / Wipe memories buttons (the buttons need the edit level). See Death & New Life Rule.
ClothingSummary tiles, filter chips and the item table for clothing Auto-scan. Shown only with the classifier level.
AuditThe admin log.
SettingsThe in-game settings editor (below). Shown only with the settings level.

Page by page with pictures: Admin Panel.

Reasons

KeyDefaultAllowedWhat it does
Config.Admin.RequireReasontruetrue / falseEdits, 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

KeyDefaultAllowedWhat it does
BlockSelfEdittruetrue / falseNo edits of memories that involve your own character.
BlockSelfViewtruetrue / falseNo pair view, live watch or lookup of your own character.
DebugShowsModefalsetrue / falseWhether the debug view shows remember / recognise mode. Never for your own character, whatever this is set to.
LogViewstruetrue / falseLog admin views in the database, not just writes.

Panel behaviour

KeyDefaultAllowedWhat it does
ShowLicensestruetrue / falseShow license ids in the panel. Discord follows ServerConfig.Discord.IncludeLicenses separately.
WatchPushMs500msHow often a live watch updates.
MaxWatchers10countMost simultaneous live watches.
TimelineDefaultDays7daysDefault range of the Timeline page.
TimelineMaxDays60daysFurthest back the Timeline page (and the trend in a Discord export) goes.
PageSize50rowsRows 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 Settings page with an (i) tip on each setting
Settings page: groups on the left, a plain title and an (i) tip per setting.

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.

KeyDefaultAllowedWhat 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.
SettingsMaxPaths501–200Most settings one save may change at once.
SettingPermssee belowprefix → levelAn extra admin level a key needs on top of settings.
DiscordActionstruetrue · false · a list of actionsAlso 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

  1. ACE gate — the settings level, plus any extra level from SettingPerms.
  2. Schema check — the value has to be the right type and shape.
  3. Range — numbers are kept inside their allowed range on the server; the page shows "Limited to …" when a value was cut.
  4. Audit log — the old and new value, the admin, and the written reason, into the tamper-evident recognition_admin_log.
  5. Discord — per DiscordActions.
  6. Reset to file — any override can be undone, individually or all at once, back to the config.lua value.

Extra levels per area

lua
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

lua
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',
}
LockedWhy
Everything in ServerConfigWebhook URLs, the salt, photo keys, rate limits, retention. Server-only — it is never even offered in the panel.
Every integration selector and Config.MDTResolved once at boot. Changing one live would leave half the script talking to the old adapter.
The admin permission and audit settingsAdmins can never widen their own rights, or switch off their own logging, from inside the game.
Config.Memory.DisguisesA 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

ValueBehaviour
true (default)Every logged admin action goes to the Admin webhook.
falseNone do. The database still logs everything.
a listOnly those actions, e.g. { 'settings_save', 'settings_reset', 'identity_reset' }.

Boot lines

Code
[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.

Code
[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

CommandLevel
recognition:statusconsole / view
/recognition:admin [idA] [idB]view
recognition:check <idA> <idB>console / view
recognition:verifyproofs [fromId]console / view
recognition:selftestconsole / 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:pruneconsole / settings
/recognition:debugsettings

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:

lua
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.