Administration
Audit Log
Audit Log
Open Admin, then Audit Logs. Owners and admins only. Non-admins get a permission error.
The list holds every nexus you administer, and the line under the heading names what it covers: one nexus by name, or how many. An instance administrator also sees the instance’s own entries, which belong to no nexus and read as Instance; the heading says the whole instance only when that person also administers every nexus on it. The Nexus column says which log each row came from, and the Nexus filter narrows to any of them.
Deleting a nexus does not delete its log. Its entries move to the instance log, which an instance administrator reads by choosing Instance in the Nexus filter, and each one’s details carry deletedNexusId and deletedNexusName, so it can still be told which nexus it came from.
What gets recorded
Every entry carries the actor, the action, the entity it touched, the IP address, a timestamp, and a JSON detail blob.
| Area | Actions |
|---|---|
| Auth | login, logout, login failed |
| Users | created, updated, deleted, password changed |
| Nexus | created, updated, deleted, member added, member removed, member role changed |
| Spaces | created, updated, deleted, restored, permission added, permission removed, permission updated |
| Pages | created, updated, deleted, restored, moved, permission added, permission removed, version created, version restored |
| Labels | created, updated, deleted, added to page, removed from page, added to space, removed from space |
| Templates | created, updated, deleted |
| Groups | created, updated, deleted, member added, member removed |
| Import and export | started, completed |
| Chat | channel created, when someone makes a channel for the whole instance or a nexus (a channel in the page tree is recorded as a page); channel updated, when a manager changes a channel’s name, topic, who may post or whether it joins new readers (the entry names the settings that changed, never the words); channel archived and channel unarchived; message removed, when an instance administrator deletes somebody else’s message (the entry names its author and never its words); thread resolved and thread reopened, in a page’s chat; agent added and agent removed, when a manager of a channel lets Otis or outside agents read and post in it, or stops them; emoji deleted, when an instance administrator removes somebody else’s custom emoji. Emoji entries belong to no nexus: choose Instance in the Nexus filter to see them. So do agent entries for #general, other channels made for the whole instance, and direct messages. Ordinary messages, edits and reactions are not recorded. |
| Phones | phone added, when someone signs in to the Otis app and allows notifications (or a phone moves to their account); phone removed, when they sign out of the app, or when the push relay reports the phone gone or it stops answering; push settings changed, when an instance administrator changes Phones in Admin -> Chat (the entry names the settings that changed and whether the relay key was replaced, never the key). A phone that leaves because its session was revoked is not recorded separately. These entries belong to no nexus: choose Instance in the Nexus filter to see them. |
Entity types you can filter on: page, space, user, nexus, label, template, group, chat, emoji, phones. The API also records import_job, settings, and ldap_config.
Filtering
Click Filters. A badge marked Active appears whenever a filter is set.
| Filter | Behaviour |
|---|---|
| Nexus | Any combination of the logs you can read. Empty means all of them. |
| Action | Dropdown populated from the actions that have actually occurred in the logs you can read, so it is never full of dead options. |
| Entity Type | Pages, Spaces, Users, Nexus, Labels, Templates, Groups, Chat, Emoji, Phones, Connections, Document templates. |
| From | Date. Inclusive. |
| To | Date. Extended to end of day, so picking today includes today. |
Clear resets everything. Refresh re-runs the query.
Results are paged 50 at a time, with a running “Showing 50 of 1,284 entries” count and Previous / Next controls.
Reading an entry
Each row shows an icon coloured by action type, the action, who did it, what it was done to, and a relative timestamp. Hover the timestamp for the exact date and time.
Click a row to expand it:
| Field | Notes |
|---|---|
| ID | The audit record’s own id. |
| User Email | Actor’s email, when the actor was a signed-in user. |
| Entity Type | Raw type, including ones absent from the filter dropdown. |
| Entity ID | The affected object’s id. |
| IP Address | Taken from X-Forwarded-For, then X-Real-IP. Put a correct proxy header config in front of the app or this will show your reverse proxy. |
| Timestamp | Full local date and time. |
| Additional Details | Action-specific JSON, shown only when present. |
Entity history
The API can return the full history of one object rather than a filtered stream:
GET /api/audit/:nexusId/entity/:entityType/:entityId
There is also a per-user activity rollup at GET /api/audit/:nexusId/user/:userId/activity?days=30, which returns action counts. A user can call that one for themselves.
Retention
There is no retention setting and no automatic pruning. Audit records accumulate until you delete them. If you need a retention policy, enforce it against the audit_logs table in Postgres on a schedule, and back it up first.