Published: July 23, 2026
Last updated: August 7, 2026

Overview

v2.0.0 stores semantic activity events — downloads, uploads, share changes, logins, and similar actions — in SQLite. The Activity Viewer turns that history into a searchable table, interactive charts, and CSV exports.

This feature depends on the v2 write-through state layer and structured SQL storage introduced in v2.0.0. Events are buffered in memory and written to SQLite in batches. By default, there can be a short delay (up to 10 seconds) before a new event appears in the Activity Viewer — events sit in an in-memory buffer until the next flush. Old rows are purged automatically based on retention settings (30 days by default).

Opening the Activity Viewer

There are several ways to open the tool:

  1. Tools menu — Open Tools from the sidebar and choose Activity Viewer (/tools/activityViewer).
  2. Settings shortcuts — Admins see an activity button on:
    • Settings → Users — user create/update/delete events
    • Settings → Shares — share lifecycle and share downloads
    • Settings → API Tokens — token create/delete events
    • Settings → Access — access rule changes for the selected source
  3. Context shortcuts — While browsing or editing:
    • File info — activity for the current file or folder
    • Share editor — activity for a specific share or path
    • Access editor — access changes for the current path

Shortcuts open the viewer with filters pre-filled (scope, source, path, share hash, or event types).

Activity Viewer bar graph view by type

Who can see what

CapabilityAdminNon-admin
View all users’ activityYesNo — only their own rows
Filter by usernameYesNo
Path glob filter (pathGlob)YesNo
Share filter on others’ sharesYesOnly shares they own
Full paths in resultsYesPaths trimmed to their per-source scope
CSV details column (JSON)YesNo

Non-admin users always query with their own user ID enforced on the server. Admins can filter by any username, including the anonymous user.

Activity scopes

Scopes limit which event types appear. Use them in the viewer or in API query parameters.

ScopeIncludes
allEvery event type (default)
filesDownload, move, copy, rename, upload, delete, bulk delete, archive, unarchive
accessAccess create, update, delete
sharesShare create, update, delete, and download events tied to a share (via shareHash in details)

View types

The Activity Viewer supports five layouts:

  • Table — Paginated list with optional columns (source, path, share hash, token name, IP address). Click a row for full event details.
  • Bar chart — Counts over time, split by event type, user, or total.
  • Line chart — Same time-series data as the bar chart in line form.
  • Pie chart — Distribution of counts for the selected range and filters.
  • Summary — Aggregated totals without a time axis.
Activity bar chart split by user

Chart views support time buckets of minute (up to 48 hours), hour, or day (ranges up to 90 days). Split-by options include event type, user (admins only), or total.

What gets logged

Activity covers file operations from the Web UI, administration, authentication, and tool usage. Web UI file changes (move, copy, rename, upload, delete, archive) are fully recorded.

File and path operations

Event typeTriggered by
downloadWeb UI or API download (/api/resources/download), including share and token-based downloads
uploadNew file or folder upload (Web UI or WebDAV MKCOL)
move, copy, renameResource PATCH actions (Web UI)
delete, bulkDeleteSingle or multi-item deletion (Web UI or WebDAV delete)
archive, unarchiveArchive tool actions

Web UI operations on files and folders — including multi-select delete, drag-and-drop move/copy, and archive/unarchive — produce the corresponding activity rows with source, path, and field-level details where applicable.

Shares and access

Event typeTriggered by
shareCreate, shareUpdate, shareDeleteShare lifecycle (field-level changes on update)
accessCreate, accessUpdate, accessDeletePer-path access rules

Share downloads appear as download events with details.shareHash set. The share’s download counter and per-user limits are updated separately in share state (not duplicate audit rows).

Users, tokens, and auth

Event typeTriggered by
userCreate, userUpdate, userDeleteUser administration (scope and permission changes appear in details)
tokenCreate, tokenDeleteAPI token lifecycle
login, logout, signupAuthentication events
passkeyRegister, passkeyDeletePasskey changes

Tools

Event typeTriggered by
duplicateFinderDuplicate finder tool runs

WebDAV

WebDAV write operations are logged when performed by an authenticated user:

WebDAV operationActivity event
Create directory (MKCOL)upload
Delete (DELETE)delete
Rename / movemove

WebDAV reads (file GET) and directory listings are not logged as activity today. Use Web UI or API downloads for audited download history.

Each row stores the actor username, event type, timestamp, client IP, auth method (web session vs API key), and structured details (paths, share hash, field diffs, and so on). Admins see the richest detail in the UI and in CSV export.

What is not logged

These actions do not create activity rows:

  • Inline viewing via viewToken (GET /api/resources/view, GET /api/media/stream, and related share/public endpoints) — previewing in the UI does not count as a download and is not audited as activity. See View vs download.
  • WebDAV file reads — opening or copying file bytes over WebDAV does not create download events (WebDAV writes are logged; see above).
  • Disabled logging — When server.database.activity.disabled is true, new events are not recorded (existing rows remain until retention purge).

Ordinary downloads through the Web UI or /api/resources/download (including forced download and folder archives) are logged as download events.

Configuration

Activity settings live under server.database.activity in config.yaml. Admins can tune buffering, retention, or turn logging off entirely if audit history is not needed for your deployment.

YAML
1
2
3
4
5
6
7
8
server:
  database:
    path: "filebrowser.sqlite"
    activity:
      disabled: false              # set true to stop recording new events
      retentionDays: 30            # purge rows older than this (default 30)
      flushIntervalSeconds: 10     # background flush interval (default 10)
      maxBufferSize: 10000         # flush immediately when buffer reaches this size
SettingDefaultPurpose
disabledfalseSet to true to disable activity logging entirely. No new events are recorded; existing rows remain until retention purge. Use this if you do not want audit history stored.
retentionDays30Rows older than this many days are deleted automatically on startup and during periodic purges. Increase for longer history; decrease to limit database growth.
flushIntervalSeconds10How often buffered events are written to SQLite. Until a flush runs, new events may not appear in the Activity Viewer or API — there can be up to this many seconds of delay after an action. Lower for near-real-time visibility; raise to reduce write frequency.
maxBufferSize10000When the in-memory buffer reaches this size, a flush runs immediately regardless of the interval.

See also Server database settings and About v2.0.0 for the SQLite migration context.

CSV export

In table view, Export CSV downloads activity for the current filters.

Activity Viewer table view with filters

Exports:

  • Paginate through the result set in chunks (up to 100,000 rows total; larger exports are truncated with a TRUNCATED marker row).
  • Include optional columns you enabled in the table: source, path, shareHash, tokenName.
  • Include a details JSON column for admins only (full structured payload).

Base columns are always: id, createdAt, username, eventType, and ipAddress.

API

Authenticated users can query activity through the REST API (same filters as the UI):

EndpointPurpose
GET /api/tools/activityPaginated event list (page, limit up to 500)
GET /api/tools/activity/groupedChart buckets (interval, splitBy, groupBy)
GET /api/tools/activity/exportCSV stream (rows for optional columns)

Query parameters include from, to, scope, eventType, source, path, pathGlob (admin), shareHash, and username (admin). Non-admins cannot override the user filter.

See API reference for authentication and general API usage.