Skip to content

Commit 14d1910

Browse files
committed
docs: fill long-tail admin gaps — localization, notifications, audit logs
New pages for Setup admin surfaces that had no documentation, verified against the live Setup console: Localization settings, admin-side Notifications (the emit → event → route → inbox pipeline and its three system-managed objects), and the immutable Audit Logs trail. Adds an Operate section landing page and expands System Settings with Branding and Feature Flags subsections. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0145MY7RdJr8KuRMyn5oKAR6
1 parent 7bf5e5b commit 14d1910

20 files changed

Lines changed: 399 additions & 9 deletions
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
---
2+
title: Localization
3+
description: Set the tenant-wide timezone, language, country, and date, time, and number formats that every rendered value inherits.
4+
---
5+
6+
# Localization
7+
8+
Localization sets the **tenant-level defaults** for how ObjectOS interprets
9+
time, chooses a message catalog, and renders dates, numbers, and currency.
10+
These values are the fallback for the whole workspace — individual users can
11+
override their own language in their [Account](/docs/use/profile), but the
12+
defaults you set here apply to everyone who has not.
13+
14+
Open **Setup → Configuration → Localization**. The page is split into two
15+
sections: **Region** and **Formats**.
16+
17+
## Region
18+
19+
Region controls how ObjectOS resolves *meaning* — which timezone anchors
20+
relative-time calculations, which locale drives formatting, and which country
21+
the deployment reports as its home.
22+
23+
| Setting | Default | Drives |
24+
|---|---|---|
25+
| `Default timezone` | `UTC` | IANA zone for `today()` / `daysFromNow`, analytics date buckets, and rendered datetimes |
26+
| `Default language` | `English (US)` | BCP-47 locale for message catalogs and number/date formatting |
27+
| `Default country` | `US` | ISO 3166-1 alpha-2 code (e.g. `US`, `GB`, `CN`) |
28+
29+
> **Timezone is not cosmetic.** It is the anchor for every relative-time
30+
> expression and for the buckets analytics rolls records into. Changing it
31+
> shifts what "today" means across the tenant — set it once, deliberately.
32+
33+
`Default timezone` is a dropdown of IANA zones (`UTC`, `America/New_York`,
34+
`Asia/Shanghai`, and so on). `Default language` selects the locale whose
35+
message catalog and formatting rules the UI falls back to. `Default country`
36+
is a free-text field that expects a two-letter ISO code.
37+
38+
## Formats
39+
40+
Formats control *presentation* — how an already-resolved value is written out.
41+
They do not change stored data, only how it is displayed.
42+
43+
| Setting | Default | Example |
44+
|---|---|---|
45+
| `Date format` | ISO | `2026-06-17` |
46+
| `Time format` | 24-hour | `14:30` |
47+
| `Number format` | comma / dot | `1,234.56` |
48+
| `Currency` || Currency symbol and placement for money fields |
49+
50+
Each is a dropdown. Pick the presentation your users expect; the underlying
51+
timestamps and numbers are stored in a canonical form and only formatted at
52+
render time.
53+
54+
## Tenant defaults vs. user overrides
55+
56+
Everything on this page is a **tenant default**. When a user sets their own
57+
language in **Account**, that choice wins for that user's session and rendered
58+
UI; users who leave their preference unset inherit the `Default language` you
59+
configure here. Timezone, country, and format defaults apply tenant-wide.
60+
61+
## Where to go next
62+
63+
| Task | Page |
64+
|---|---|
65+
| Change branding, feature flags, and other tenant settings | [System Settings](/docs/configure/system-settings) |
66+
| Configure a user's personal language override | [Your profile](/docs/use/profile) |
67+
| Set up transactional email delivery | [Email](/docs/configure/email) |
68+
| Return to the administration overview | [Configure](/docs/configure) |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "Konfigurieren",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "Configurar",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "Configurer",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "設定",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}

content/docs/configure/meta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "Configure",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "설정",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"title": "配置",
33
"defaultOpen": false,
4-
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "api-access", "webhooks", "email"]
4+
"pages": ["index", "users", "runtime", "data-sources", "authentication", "permissions", "storage", "ai", "mcp", "system-settings", "localization", "notifications", "api-access", "webhooks", "email"]
55
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
title: Notifications
3+
description: Configure how ObjectOS routes events into user inboxes — subscriptions, per-user preferences, and render templates.
4+
---
5+
6+
# Notifications
7+
8+
This page covers the **administrator side** of notifications: how events become
9+
messages, and the three system-managed objects you use to route and render
10+
them. For the recipient's view of the inbox — reading and muting notifications —
11+
see [Notifications](/docs/use/notifications) under *Use*.
12+
13+
## The notification pipeline
14+
15+
A notification is not a single record. It flows through four stages:
16+
17+
```text
18+
emit() → Notification Event → routed by Subscription + Preference + Template → Inbox Message
19+
```
20+
21+
1. **`emit()`** — Application code raises an event (an approval submitted, a
22+
record shared, an invitation sent).
23+
2. **Notification Event** (`sys_notification`) — Each `emit()` writes one
24+
ingress row. This is the diagnostic log of *what happened*, before any
25+
delivery decision. See [Audit Logs](/docs/operate/audit-logs) for how to
26+
read it.
27+
3. **Routing** — For each event, ObjectOS resolves who should be notified
28+
(**Subscriptions**), whether each recipient allows that topic on that channel
29+
(**Preferences**), and how the message should be rendered (**Templates**).
30+
4. **Inbox Message** (`sys_inbox_message`) — The materialized, per-user result
31+
the recipient actually sees in their inbox.
32+
33+
Preferences, Subscriptions, and Templates are the admin/system-side
34+
configuration. Inbox Messages are the user-side output.
35+
36+
### How routing resolves
37+
38+
For a single event, the three objects each answer one question:
39+
40+
| Object | Question it answers |
41+
|---|---|
42+
| Notification Subscription | *Who is interested?* — which principals stand subscribed to the topic |
43+
| Notification Preference | *Does this recipient allow it here?* — the per-user mute/allow for the topic and channel |
44+
| Notification Template | *How is it written?* — the subject and body to render for the recipient's channel and locale |
45+
46+
Only when a recipient is subscribed **and** their preference for the
47+
topic/channel is enabled does a template render and an inbox message
48+
materialize. All three objects are seeded and maintained by the platform, so
49+
the list views mostly show system-generated rows.
50+
51+
## Notification Preferences
52+
53+
At **Setup → Configuration → Notification Preferences** (`sys_notification_preference`).
54+
55+
Per-user × topic × channel toggle (mute/allow), with admin-global defaults. A
56+
preference decides whether a given recipient receives a given topic on a given
57+
channel.
58+
59+
| Field | Purpose |
60+
|---|---|
61+
| `user_id` | The principal the preference belongs to |
62+
| `topic` | Notification topic (e.g. `project.digest`) |
63+
| `channel` | Delivery channel (in-app, email, …) |
64+
| `enabled` | Boolean — allow or mute this topic/channel for the user |
65+
| `digest` | Batching cadence for the topic |
66+
| `quiet_hours` | JSON window during which delivery is suppressed |
67+
| `created_at` / `updated_at` | Audit timestamps |
68+
69+
> Entries appear automatically when their source action first runs (for
70+
> example *Submit for Approval*, *Share*, or *Invite*) — you rarely create
71+
> preference rows by hand. Use the list to adjust admin defaults or mute a
72+
> noisy topic.
73+
74+
## Notification Subscriptions
75+
76+
At **Setup → Configuration → Notification Subscriptions** (`sys_notification_subscription`).
77+
78+
A **standing subscription** of a principal (role, team, or user) to a
79+
notification topic. Subscriptions answer *who is interested* in a topic before
80+
per-user preferences filter delivery.
81+
82+
| Field | Purpose |
83+
|---|---|
84+
| `topic` | The topic being subscribed to |
85+
| `principal` | Role, team, or user that receives the topic |
86+
| `enabled` | Boolean — activate or pause the subscription |
87+
88+
## Notification Templates
89+
90+
At **Setup → Configuration → Notification Templates** (`sys_notification_template`).
91+
92+
A per **(topic × channel × locale)** render template. Templates turn an event
93+
payload into the subject and body a recipient reads, in their locale and for
94+
their channel.
95+
96+
| Field | Purpose |
97+
|---|---|
98+
| `topic` | Topic this template renders |
99+
| `channel` | Channel the rendered output targets |
100+
| `locale` | Locale of this rendering (matched to the recipient) |
101+
| `version` | Template version number |
102+
| `subject` | Rendered title |
103+
| `body` | Message body (markdown) |
104+
| `format` | Output format for the body |
105+
| `is_active` | Boolean — whether this template is used for rendering |
106+
107+
These objects are **system-managed**: rows are seeded by the platform and the
108+
capabilities you run, so most of your work is editing template content or
109+
toggling `is_active`, `enabled`, and preference defaults rather than creating
110+
records from scratch.
111+
112+
## Where to go next
113+
114+
| Task | Page |
115+
|---|---|
116+
| Configure the email channel used for delivery | [Email](/docs/configure/email) |
117+
| Diagnose events with the ingress log and audit trail | [Audit Logs](/docs/operate/audit-logs) |
118+
| See the recipient's inbox experience | [Notifications](/docs/use/notifications) |
119+
| Set locale defaults that templates match against | [Localization](/docs/configure/localization) |
120+
| Return to the administration overview | [Configure](/docs/configure) |

content/docs/configure/system-settings.mdx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,31 @@ Customer-facing settings usually include:
5656
| AI providers | Model provider, API key, budget limits |
5757
| SSO | OIDC provider settings and test connection |
5858

59+
## Branding
60+
61+
At **Setup → Configuration → Branding**. These settings control the workspace's
62+
display identity — its name, logo, and colours.
63+
64+
| Setting | Notes |
65+
|---|---|
66+
| `Workspace name` | Required. The name shown across the UI (default `ObjectStack`) |
67+
| `Support email` | Address surfaced to users for help (e.g. `support@example.com`) |
68+
| `Default theme` | `Match system`, `light`, or `dark` |
69+
| `Accent colour` | Hex colour with a picker (default `#6366f1`) |
70+
| `Logo URL` | URL of the workspace logo |
71+
72+
## Feature flags
73+
74+
At **Setup → Configuration → Feature Flags** `[Beta]`. Toggle experimental and
75+
beta features for this workspace — grouped as **Productivity** (AI Assistant,
76+
Kanban swimlanes) and **Collaboration** (Realtime cursors, Inline comments).
77+
Each is a tenant-level UI switch.
78+
79+
> **Beta features may change without notice.** Pin a flag with an environment
80+
> variable (e.g. `OS_FEATURE_FLAGS_AI_ENABLED=true`) to lock it for the whole
81+
> deployment. Because environment overrides are locked, the `OS_FEATURE_FLAGS_*`
82+
> vars take precedence over the UI toggles.
83+
5984
## Secrets
6085

6186
Password and credential fields should be encrypted by the settings

0 commit comments

Comments
 (0)