ReboFilesDocs
Start3
What is ReboFiles
Getting started
Demos to run
Put it in your app6
React component
Headless: your own UI
Without a framework
Styling and themes
Keyboard and accessibility
Languages
Files9
Uploads
Previews and the viewer
Search
Live changes and large folders
Comments
Starred and fields
Versions, trash and space
Download as .zip
Word documents
The server14
The route
Frameworks and sign-in
Who may do what
Storage: S3, GCS, Azure and disk
Checking uploads
Metadata: SQLite and Postgres
Database schema
Sharing and links
Activity and notifications
Hooks, logs and limits
Retention, holds and export
Desktop and other origins
Sync a folder
Going to production
Together1
AI assistants (MCP)
Reference5
Packages
Components and hooks
Client API
HTTP routes
Status and roadmap
↑↓ to move↵ to openEsc to close38 pages

The server Activity and notifications

Activity and notifications

Every change is kept as activity, whatever made it: a route, an assistant, the trash emptying itself. It is told from the drive before and after the change, so nothing is left out.
Activity

What is kept

Made, uploaded, a new version, renamed, moved, put in the trash and back, deleted, shared and no longer, a link made and taken back, a colour given; who, and when.

The details of a file have its Activity, and of a folder what was done right inside it too (GET /entries/:id/activity, client.activity); an assistant reads it with get_activity.

Core

In code

import { activityOf } from '@rebofiles/core';

activityOf(before, after, 'ana', new Date().toISOString());
// [{ action: 'renamed', name: 'final.docx', was: 'draft.docx', by: 'ana', at, entry, parent }]
onShare

Telling people

Beside Shared with me the drive counts what is new. To tell the person yourself, give the server onShare.

createDriveHandler({
  ...options,
  // Once the share is kept; a failure here is not the request's.
  onShare: async ({ entry, with: who, role, by, first }) => {
    if (first) await mail(who, `${by.id} shared “${entry.name}” with you as ${role}`);
  },
});
Bell

Told in the drive

What is shared with a person, or with a group they are in, and a comment that names them: in the bell over the drive, how many are new beside it, each opening where it is.

const { notifications, unseen } = await client.notifications();
// [{ kind: 'shared', entry, name: 'Budget', by: 'ana', role: 'editor', at }, { kind: 'mentioned', text, … }]
await client.sawNotifications();   // none is new any more

Kept for each person and each group (inbox:<who>), the last two hundred; looked at, none is new (POST /notifications/seen). What one did oneself is not told. A mail is still yours to send, with onShare and onComment.

People

The whole drive

For who may configure the drive, Settings → People: the files, folders and space of each person and of the whole drive, and the latest activity anywhere in it.

// For who may 'configure': what each keeps, and what was done anywhere.
const { people, total, quota } = await client.adminUsage();   // GET /admin/usage
const latest = await client.adminActivity(100);                // GET /admin/activity

The space of each is reckoned from the whole drive, read once each time it is asked: for who looks after it, now and then, not for every page.

Know

What to know

A change is kept without its line if the store fails to write the activity: the change is the drive, the line is beside it.