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.

AreaActions
Authlogin, logout, login failed
Userscreated, updated, deleted, password changed
Nexuscreated, updated, deleted, member added, member removed, member role changed
Spacescreated, updated, deleted, restored, permission added, permission removed, permission updated
Pagescreated, updated, deleted, restored, moved, permission added, permission removed, version created, version restored
Labelscreated, updated, deleted, added to page, removed from page, added to space, removed from space
Templatescreated, updated, deleted
Groupscreated, updated, deleted, member added, member removed
Import and exportstarted, completed
Chatchannel 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.
Phonesphone 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.

FilterBehaviour
NexusAny combination of the logs you can read. Empty means all of them.
ActionDropdown populated from the actions that have actually occurred in the logs you can read, so it is never full of dead options.
Entity TypePages, Spaces, Users, Nexus, Labels, Templates, Groups, Chat, Emoji, Phones, Connections, Document templates.
FromDate. Inclusive.
ToDate. 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:

FieldNotes
IDThe audit record’s own id.
User EmailActor’s email, when the actor was a signed-in user.
Entity TypeRaw type, including ones absent from the filter dropdown.
Entity IDThe affected object’s id.
IP AddressTaken 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.
TimestampFull local date and time.
Additional DetailsAction-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.