Skip to content
Fermium

Changelog

What shipped in Fermium, newest first.

Dates are when the change reached the main branch.

2026-10-08

  • Brains are now Agents. Navigation, setup and help use Agent terminology. Existing app and documentation links redirect to the new addresses. MCP discovery advertises list_agents, load_agent, agent_read and the other Agent tools; previous tool names remain callable. REST paths, response fields and stored BRAIN.md files remain compatible. See Agent tool names.

2026-09-22: People & teams, directory sync and MCP session duration

  • People & teams now provides searchable members, groups, bulk membership changes, pending group assignments, source ownership and resource access inspection. Group management and group grants are available on Team and above.
  • Invitations activate group assignments only when the intended account accepts. Email uses a durable retry queue; resend rotates the token, and normal listings do not expose invitation secrets.
  • Google Workspace groups can be imported once or kept synced on Team and above, after operator OAuth setup and Google administrator approval. Direct active members only; failed snapshots preserve membership and stale Google group grants pause after an hour. Enterprise can enforce Google-only group authority.
  • MCP OAuth connections default to 30 days, with a duration selector up to one year and Enterprise maximum-duration policy. Refreshes and remembered consent cannot extend the original deadline.
  • Activity addresses use a trusted proxy chain. New visits from 192.168.1.0/24 are excluded from activity counts, their addresses are redacted in logs, and cleanup removes historical stored addresses. Mutation audits remain.

2026-09-22: File activity and plan retention

  • File Activity tabs, folder Activity panels and a Traffic dashboard show audience views, downloads, edits and permission activity. Internal opens and detected bots are separate.
  • Daily totals outlive detailed viewer/IP history according to the workspace plan, with bounded cleanup every 15 minutes. Queries enforce current file permissions and retention.
  • Five activity MCP tools and REST endpoints support charts, rankings, event catch-up and lightweight polling. Form progress activity stays on the response database.

2026-09-17: Roots, the fused navigator, and brains as agent memory

  • Roots. Every document now lives in one root. My documents is each member's private tree (root: "~", the default everywhere). General is one root per workspace that every member reads and writes. Shared roots are created by workspace owners and admins, up to 200 per workspace, each with an access list of people, groups or the whole workspace at view, comment or edit. Folders inherit the list; a folder with a list of its own replaces what it would inherit, so it can narrow or widen. A document published or moved into General or a shared root belongs to the root: its editors run it, it counts against the workspace's storage, and it stays when its author is removed from the workspace (their My documents still travel with them). MCP: list_roots, create_root, and root on publish_html, publish_markdown, publish_snippet, publish_file, move_doc, list_docs, list_folders, create_folder, list_tree, download_bundle, search_docs and list_changes. REST: /api/roots, /api/roots/{root}/access, and root on the document, folder, star, tree, bundle, search and change-feed endpoints. The document object gains root_id, root and doc_type. Audit: root.create, root.update, root.delete. See Roots and folders.
  • The fused navigator. One view is file browser and wiki. The sidebar has two sections, My documents and Shared; the folder pane has a Grid | List | Page switch, index pages that render on top of a folder, a manual order of a folder's children, shortcuts that show a document in a second folder without copying it, folder descriptions, and Root settings for details, access and deletion. MCP: get_folder_view, set_folder_meta, create_shortcut. REST: /api/folder-view, /api/folder-meta, /api/shortcuts.
  • Publish a folder as a site. Any root or folder can be published: the folder tree is the navigation in its manual order and index pages are landing pages. Served at /w/@<workspace>/r/<root-slug>/<path>/ on the content host and /w/r/<root-slug>/<path>/ on a custom domain, for everyone, signed-in readers or one group. Only documents inside published folders are served, document visibility still applies, and search engines can index a published folder only on an active custom domain with indexing turned on. Audit: folder.publish, folder.unpublish. Publishing a folder is now the primary way to build a wiki; the brain-tree wiki keeps working.
  • Brains as agent memory. A brain is now a set of typed markdown files that any harness loads over MCP: BRAIN.md, INDEX.md, skills/*.md, workflows/*.md and memory/**/*.md, plus a journal, sources (roots, folders, tags and documents it reads through to, which only ever narrow to what the caller may open) and includes (other brains whose skills and workflows apply). Every member has a private personal brain. Agent changes to BRAIN.md, skills and workflows become proposals that a person with write access approves in whole or hunk by hunk, or rejects; a proposal whose file has moved on is marked stale. The journal is short-term memory with a budget (40,000 characters by default); when it is passed, load_brain asks the agent to consolidate notes into memory files. MCP: list_brains, load_brain, brain_read, brain_write, brain_remember, brain_search, brain_log, brain_consolidate_mark, brain_export, propose_change, list_proposals, create_brain, add_brain_source. REST under /api/brain-roots and /api/brain-proposals. App: a brain viewer with Files, Sources, Includes, Activity, Review, Agent view, Access and Export tabs. Audit: brain.create, brain.write, brain.propose, brain.decide, brain.source, brain.includes, brain.access, brain.delete. See Brains, Skills and Workflows.
  • Renamed tools. The names list_brains, brain_search and create_brain now belong to brains as agent memory. Their counterparts for brains of the earlier form are list_legacy_brains, legacy_brain_search and create_legacy_brain; use_brain, set_brain_instructions, attach_skill, detach_skill, the navigation tools and the workflow tools are unchanged. An earlier brain converts into the new form with its instructions as BRAIN.md, its skills and workflows as files, and its document, folder and tag members as sources.
  • Notifications. A bell in the top bar, with GET /api/notifications and POST /api/notifications/read. It carries proposals that need your review and the outcome of your own proposals.
  • Diagram viewer. Every rendered Mermaid diagram has an Expand diagram button that opens a viewer with zoom, pan and reset, on published pages, wiki pages, the editor preview and inside the app. See Kinds and formats.
  • Custom domains. The first domain to go live becomes the workspace's link host on its own; Use shared host instead switches back. See Custom domains.
  • Plans for roots, access lists, brains and folder sites. Creating a shared root beyond General needs Team or above. Changing an access list on a root, on a folder inside a root or on a brain needs Business or above; reading a list stays open. Workspace brains are limited to 1 on Free and 5 on Team, with no limit on Business and above; personal brains are extra. Publishing a folder as a site needs Team or above, and unpublishing always works. Each refusal is a 402 that names the plan, over REST and MCP alike. Only new changes are checked, so roots, entries, brains and published folders that already exist keep working. GET /api/roots/{root}/access and GET /api/brain-roots/{slug}/access gain access_blocked; GET /api/brain-roots gains limit and count. See Plans and limits.
  • Publishing policy. The workspace policy gains publishing: public (the default), signed_in or off. signed_in refuses public folder sites and serves folders already set to public to signed-in readers only; off refuses publishing and answers not found for every folder site. GET /api/folder-meta and GET /api/folder-view gain publishing_policy and publish_blocked (null, "plan" or "policy"). In the app: Publishing folders as sites under Settings, Access policy. See Workspace policy.
  • robots.txt for published folders. On an active custom domain with Allow search engines on, /robots.txt allows /w/ and lists a Sitemap: line for each root with a published folder (/w/r/<root-slug>/sitemap.xml), next to the sitemap of the earlier brain wiki when that is on. Before, a workspace that published folders without the earlier wiki got Disallow: /.
  • Change feed. root on GET /api/changes and list_changes: ~ for personal documents only, a shared root's slug for that root; rows carry root. See Building a sync client.

2026-09-16: Workflows and one file browser

  • Workflows. A recipe for one recurring job, next to skills, which say how anything should look. A workflow is a WORKFLOW.md steps document (folder Workflows/<slug>, alias <slug>-workflow, team-listed, kept forever) plus trigger phrases, inputs to ask for ({name, description, required, example}), templates to duplicate with a role each, skills applied on top of the brain's, and output rules (kind, folder, title_pattern, tags, brain, listing, visibility). Brains hand out every workflow by default or a picked, ordered set; use_brain lists them so an agent can recognise a job, use_workflow returns the full recipe and counts a use, duplicate_doc copies a template into a new document the user owns. Per plan: Free 3, Team 25, Business and above unlimited. App: a Workflows section in the sidebar and a Workflows page with cards, a New workflow form (name, triggers, inputs, templates, skills, output), Read, Edit and Usage tabs, Run with an agent, Duplicate on templates, Use as template in… on a document's menu, and a Workflows tab in the brain's Manage view. MCP: list_workflows, use_workflow, create_workflow, set_workflow_templates, set_workflow_skills, duplicate_doc; workflows in the use_brain payload. REST under /api/workflows, /api/brains/{ref}/workflows and POST /api/docs/{id}/duplicate. Audit: workflow.created, workflow.changed, workflow.deleted, workflow.used, doc.duplicated. See Workflows.
  • One file browser. Home is the entry and the Documents rail item is gone. All documents shows everything you may open in one tree and one grid: your own documents, team-listed documents and documents shared with you through a grant. Documents and folders owned by someone else are tinted and carry the owner; an All / Mine / Shared with me filter narrows the view and is kept in the URL. Bulk actions stay owner-only. REST: view=all on GET /api/docs, include_team=1 on GET /api/folders and GET /api/tags, all behind the one access rule that governs opening a document.

2026-09-16

  • Wiki. A workspace can publish a curated navigation over its documents as a read-oriented site at /w/@<workspace>/ on the content host or at the root of a custom domain. Entry kinds: group, document (by id or by alias, so re-pointing an alias moves the entry), dynamic folder and tag sections that list live documents, external link, divider. Per-entry visibility public, signed_in or group (Business), with Sign in to see more for anonymous readers. Only documents the navigation reaches are served, searched or listed; document visibility applies as on a direct link; HTML documents render in a sandboxed frame, never inlined. Pages have breadcrumbs, a table of contents, last-edited, backlinks, Edit this page, History and Copy link. Ranked full-text search within the wiki. Opt-in search-engine indexing on an active custom domain (Team and above): canonical links, Open Graph tags, /robots.txt and /w/sitemap.xml; the shared host stays noindex. Navigations per plan: Free 1, Team 5, Business unlimited. App: a Navigation section in the sidebar, a drag-and-drop navigation editor with a Not in navigation pane, Add to navigation on documents and folders, and Settings, Wiki. MCP: list_navigations, get_navigation, create_navigation, delete_navigation, set_navigation, add_nav_entry, update_nav_entry, move_nav_entry, remove_nav_entry, publish_home, get_wiki_site, and nav on the publish_* tools. REST under /api/navigations and /api/wiki-site. See Wiki.
  • Icons. One grammar for documents, folders, tags, navigation entries and navigations: lucide:<name>[/<colour>] from a curated set with twelve named colours, emoji:U+1F680 or a literal emoji, and svg:<id> from an uploaded SVG library (Team and above; 32 KiB, validated on upload, served from the content host under /icons/). A picker in the inspector, folder menu, tag view and navigation editor; icons render on tiles, in the sidebar, the command palette and the wiki. MCP: set_icon, clear_icon, upload_icon, list_icons. REST under /api/icons. The document object gains icon. See Icons.
  • Editing in the browser. One editor route for every editable file in a document: markdown with a toolbar, [[ autocomplete over aliases, titles and tags, and a server-rendered live preview; HTML, CSS and JavaScript with a live preview of the draft; JSON and YAML with syntax checks; snippet source with a language picker; raster images with crop, rotate and resize saved as a new version. Saves carry base_version; a conflict shows who saved, their diff, and Reload or Overwrite. Edit leases (at most ten minutes, renewed while the editor is open) make a document read-only for others while someone types; agents see the same lease. Compare in the Versions tab with side-by-side or unified diffs, image before/after and Restore. Ask an agent posts an instruction as a comment with a file and location for an agent to pick up with list_comments. Edit and Add to navigation buttons, alias and links in the inspector. See Editing in the browser.
  • Editing API. GET /api/docs/{id}/files/{path} with ETag, If-None-Match and ?version=; GET /api/docs/{id}/manifest; PUT and PATCH /api/docs/{id}/files/{path} with base_version (409 with current_version, changed_by and a unified diff) and lock_token (423 with the holder); lease endpoints under /api/docs/{id}/lock; POST /api/render/markdown; a cursor-based change feed at GET /api/changes that folds metadata changes into changed_at and keeps deleted documents for 30 days; GET /api/search/ranked. MCP: write_file, lock_doc, renew_lock, unlock_doc, list_changes. A recipe for mirrors is in Building a sync client.
  • App: a working Audit page, a Developers area (Overview, Events, API keys, Logs, Webhooks), and a Members settings page with roles and invites.

2026-09-15

  • Links between documents. One human alias per document (q3-roadmap), unique within the workspace and re-pointable with force. Markdown [[alias]], [[alias|text]], [[alias/path]], [[#tag]], [[doc:id]] and [[@workspace/alias]] render as links; unresolved references render visibly broken. The /x/<ref>[/<path>] resolver on the content host and custom domains 302s to the canonical URL with the target's visibility applied. Backlinks are indexed. MCP: set_alias, clear_alias, resolve_link, list_links. REST: PUT and DELETE /api/docs/{id}/alias, GET /api/docs/{id}/links, GET /api/resolve. See Links between documents.
  • Search and edit. search_docs greps every text file of your documents and team-listed ones, with folder, tag, kind and path-glob scoping, regex and case flags; grep_doc inside one document; get_file by line range; edit_file exact find-and-replace with a uniqueness check; apply_patch for a unified diff exactly as git diff prints it; list_versions and restore_version (a restore is a new version). Edits to source.md, source.<ext> and index.html re-render the page. REST under /api/search and /api/docs/{id}/{grep,text,edit,patch,versions}. See Search and edit.
  • Expiry warning and keep. An email three days before expiry with a one-click keep link; POST /api/docs/{id}/keep. Keep respects the workspace's maximum retention.
  • Workspace policy (Business): allowed visibilities, minimum and maximum retention (implicit defaults clamped, explicit values rejected), secret scanning in warn or block mode. GET and PUT /api/policy, get_policy. Legal hold (Enterprise): set_legal_hold, POST /api/docs/{id}/legal-hold; held documents never expire and cannot be deleted or purged. IP allowlist (Enterprise) for the app, the API and workspace-gated documents.
  • Audit log (Business): append-only, filterable by action, actor, target and time, CSV export, list_audit. Members see events about their own documents.
  • Webhooks (Business): per-URL secret shown once, event filters with family.* prefixes, X-Fermium-Signature HMAC-SHA256 over t.body, retries at 1 m, 5 m, 30 m, 2 h and 12 h, deliveries log, test ping, non-public URLs refused. See Webhooks.
  • Members, roles and invites. Roles owner, admin, member; GET /api/members; email invites valid 14 days that reserve a seat; removal moves the person to a personal workspace with their documents; ownership transfer. Groups and access levels (Business): view, comment, edit per document or per folder, for a user, a group or the workspace; grants narrow workspace-gated documents; editors update content, rename and tag, owners keep move, listing, visibility, retention, alias and delete. MCP: list_access, share_doc, unshare_doc, list_groups. Comments (paid plans) with path and anchor; MCP list_comments, add_comment, resolve_comment.
  • SSO (Business): OpenID Connect with your own provider (Microsoft Entra ID, Okta, others), PKCE and nonce, ID token verified against JWKS, per-domain routing, enforced mode, public GET /auth/sso/lookup. SCIM 2.0 (Enterprise): Users and Groups at /scim/v2, eq filters, PATCH, deactivation frees the seat and keeps documents, tokens minted in settings. See SSO and SCIM and the SCIM reference.
  • Account export and deletion. GET /api/export zips every document you own with meta.json and index.json; DELETE /api/account with a typed email confirmation, 7-day grace, owners transfer first.
  • App: multi-select in the Documents view with Move to, Keep forever, List for team and Delete.
  • Security: /.well-known/security.txt and a responsible disclosure page.
  • Folders, tags, and stars as three separate things. A folder is where a document lives: one path like Customers/Acme, nested up to 8 levels, created on the fly, case preserved. A tag is a topic that cuts across folders (customer-facing, runbook); a tag view lists every document carrying it wherever it lives. A star is a personal shortcut to a document or a folder. Tags no longer stand in for folders. See Folders, tags, and stars and Moving and organizing.
  • Moving never changes a link. A document's URL is built from its immutable slug and never contains a folder, so moving a document or renaming or deleting its folder keeps every link, embed and bookmark working. Moving does not create a version or reset retention.
  • MCP: folder on publish_html, publish_markdown, publish_snippet and publish_file; new tools move_doc, list_folders, create_folder, rename_folder and delete_folder (force moves contents to the parent; documents are never deleted); list_docs takes folder and recursive alongside tag. Server instructions and usage_guide explain the model to the agent. The document object gains folder.
  • REST: GET, POST, PATCH and DELETE /api/folders; GET, POST and DELETE /api/stars; folder and tags on POST /api/docs; folder on PATCH /api/docs/{id}; folder and recursive on GET /api/docs.
  • App: folder tree in the sidebar with breadcrumbs and folder tiles, move by drag or from a Move dialog, Starred and Tags sections in the sidebar, and a tag view that shows each document's folder.

2026-09-15

  • New app shell at fermium.app/app: rail, context sidebar with tags and the Team view, top bar with search and a command palette (Ctrl or Cmd plus K), inspector with Access, Files and History tabs, mobile tab bar. Settings index: General, Domains, Billing, API keys and tokens, Members, Sign-in, Policy, Webhooks, Data, with unshipped features labelled by plan.
  • Custom domains end to end: add a hostname, CNAME to cname.fermium.app plus a _fermium TXT record, verify, certificate issued by Let's Encrypt, active status, "Use for links" to make it the link host. Custom domains serve only the owning workspace's documents, and the workspace sign-in handoff returns readers to the custom host.
  • OAuth consent moved to account creation: new accounts accept the Terms and Privacy Policy on the sign-in page; existing accounts see an interstitial when the version changes.
  • Auth-aware marketing header: GET /api/me and Open app / Sign out versus Sign in / Create account.
  • Admin area for operators: set plans without Stripe, pre-create company workspaces and claim viewer domains, move and disable users, support tooling.
  • Personal workspace names from the email local part ("Ada's workspace").
  • Legal pages, brand and fonts, formats section on the home page.
  • Secrets manager for production credentials, loaded at boot.
  • Fermium reshape: workspaces, plans (Free, Team, Business, Enterprise), Stripe Checkout, Customer Portal and webhook, storage caps and add-ons by plan, visibility: workspace gated to paid plans with viewer domains, open Google sign-in for any account, the /app UI prefix.

2026-09-08

  • Monorepo bootstrap: marketing site, API, and deployment automation for custom-domain provisioning.

Earlier, before the rename

The service ran under a working name before it became Fermium. The features below carried over unchanged.

  • Link previews and video posters: Open Graph tags on generated pages, a poster frame grabbed after each video upload, generate_poster to backfill. Unlisted documents unfurl in Discord and Slack.
  • Streaming uploads: create_upload mints a signed one-time PUT /u/<ticket> URL for files up to 2 GiB; PUT /api/upload does the same with a bearer token. Video and audio get a player page with a markdown description; set_description edits it in place. HTTP range serving for seeking.
  • MCP OAuth 2.1: RFC 9728 discovery from the 401 challenge, RFC 8414 metadata, RFC 7591 dynamic client registration, authorization code with mandatory PKCE, 7-day access tokens, rotating refresh tokens, RFC 7009 revocation, one-time consent per client. Replaced pasted tokens for interactive clients; static dsk_ tokens kept for headless use.
  • Tags: up to 10 normalized tags per document, tags on every publish tool, set_tags, list_docs(tag=), GET /api/tags. The browser UI of the time showed each tag as a folder; real folders replaced that on 2026-09-15.
  • Markdown fixes: .md uploads render as documents, BOM and CRLF normalization, contrast-checked palettes, mermaid diagram fences.
  • Markdown documents (publish_markdown, update_markdown) with source.md kept as raw.
  • Snippets (publish_snippet, update_snippet) with server-side highlighting and language detection.
  • File shares (publish_file) with image viewer, direct PDF serving and download pages.
  • Password visibility with HTTP Basic and argon2id hashes; per-IP failure limits.
  • Immutable versions with per-file hashes and shared objects across versions; no-op on identical content.
  • Retention with a 30-day default, keep-forever, expires_at on every response, soft delete with a 7-day grace period and a daily purge.
  • Two-origin model: app on one host, content only on another, CSP sandbox on every document, neutral not-found page, per-IP 404 limits.