feat(threads): ship threads and the Plutonium page to everyone (#3277)

This commit is contained in:
Hampus authored and GitHub committed 2026-10-08 16:30:39 +02:00
1 parent 1515a8487f
commit f8505d19f7
53 files changed
+296 -2008

No files matched your search

@@ -6,7 +6,7 @@ description: The experiment assignments envelope, the revalidation and polling c
import RouteHeader from '@/components/RouteHeader.astro';
An experiment is an instance-wide rollout that an operator configures. For each account, Fluxer works out from that configuration whether the account is in the rollout and which settings the account receives. The single route on this page resolves every experiment the server defines and returns them in one envelope, together with the polling cadence they share. This server defines `domain_migration` and `plutonium_page`.
An experiment is an instance-wide rollout. For each account, Fluxer works out whether the account is in the rollout and which settings the account receives. The single route on this page resolves every experiment the server defines and returns them in one envelope, together with the polling cadence they share. This server defines `domain_migration` and `plutonium_page`. Only `domain_migration` is configured by an operator. `plutonium_page` is on for every account.
Every assignment is advice. A client that ignores one behaves as it does with the rollout off, and no route and no Gateway event reports what a client actually ran.
@@ -53,17 +53,17 @@ Only the official web client acts on this assignment, and only on its legacy ori
## Plutonium page assignment object
One resolution of the instance Plutonium page rollout against one account. This server version writes the key on every response.
The Plutonium page state for one account. This server version writes the key on every response, always with `enabled` true.
### Structure
| Field | Type | Description |
| --- | --- | --- |
| enabled | boolean | Whether the caller's client shows the full Plutonium page in place of the Plutonium settings tab |
| enabled | boolean | Whether the caller's client shows the full Plutonium page in place of the Plutonium settings tab, always true |
A caller is drawn by the operator's account or guild allowlist, by having premium when the operator includes premium users, or by the sampled share of the account population. `enabled` is false in every other case, the rollout being off included.
The rollout is complete and has no operator setting. The key stays for clients that still read it.
The assignment only changes what the client shows. A selected client replaces the Plutonium settings tab with a full Plutonium page, makes app pages linkable in chat, and uses a minimal gift purchase modal. The server applies no part of it on its own.
The assignment only changes what the client shows. An enabled client replaces the Plutonium settings tab with a full Plutonium page, makes app pages linkable in chat, and uses a minimal gift purchase modal. The server applies no part of it on its own.
## Get experiment assignments
@@ -9,8 +9,8 @@ import RouteHeader from '@/components/RouteHeader.astro';
A forum channel holds posts, and every post is a public [thread](/http-api/threads/) with its own first message. A media channel is a forum channel whose posts center on attachments. Neither accepts a message of its own.
:::note[Every route needs the `channel_threads` experiment]
A route on this page answers 404 `NOT_FOUND` unless the experiment is active for the guild and the caller. A user session also declares `channel_threads` in the `X-Fluxer-Features` header, and a bot needs no declaration.
:::note[Every route needs the `channel_threads` client capability]
A route on this page answers 404 `NOT_FOUND` to a user session that does not declare `channel_threads` in the `X-Fluxer-Features` header. A bot needs no declaration.
:::
## Forum channel fields
@@ -9,8 +9,8 @@ import RouteHeader from '@/components/RouteHeader.astro';
A thread member records that a user joined a [thread](/http-api/threads/). A thread holds at most 1,000 members, and adding one more returns 400 `MAX_THREAD_MEMBERS`.
:::note[Every route needs the `channel_threads` experiment]
A route on this page answers 404 `NOT_FOUND` unless the experiment is active for the guild and the caller. A user session also declares `channel_threads` in the `X-Fluxer-Features` header, and a bot needs no declaration.
:::note[Every route needs the `channel_threads` client capability]
A route on this page answers 404 `NOT_FOUND` to a user session that does not declare `channel_threads` in the `X-Fluxer-Features` header. A bot needs no declaration.
:::
## Thread member object
@@ -11,8 +11,8 @@ A thread is a channel inside a guild text, announcement, forum, or media channel
[Thread members](/http-api/thread-members/) defines joining, leaving, and member lists. [Forums](/http-api/forums/) defines forum and media channels, where every thread is a post.
:::note[Every route needs the `channel_threads` experiment]
A route on this page answers 404 `NOT_FOUND` unless the experiment is active for the guild and the caller. A user session also declares `channel_threads` in the `X-Fluxer-Features` header, and a bot needs no declaration.
:::note[Every route needs the `channel_threads` client capability]
A route on this page answers 404 `NOT_FOUND` to a user session that does not declare `channel_threads` in the `X-Fluxer-Features` header. A bot needs no declaration.
:::
## Thread object
@@ -539,7 +539,7 @@ Sending a message in a thread adds a user sender who is not a member. A mentione
| Message search result | threads | The threads that contain a returned message |
| Message search result | members | A thread member object for each of those threads the caller joined |
| Audit log | threads | The threads referenced by the returned entries |
| Experiment assignments | channel_threads | `active` and `config_version`, present only for an account in the rollout |
| Experiment assignments | channel_threads | `active` and `config_version`, present for every account |
The guild audit log records thread creation, update, and deletion as action types 110, 111, and 112.