Everything we’ve shipped, newest first.

  1. One translations map for every label around your content. The map has the shape { "<locale>": { … } }. A reader sees an entry when the page's language or their interface language matches it. A missing language or field shows the original. See Translated labels. Collections: trans…

    Read release
  2. Every language has its own address

    2026.10.14-language-paths

    A translation used to be the page address plus ?locale=es. Search engines may ignore a query parameter, a CDN may drop it, and you cannot point a search console at it as "the Spanish section". Now every language has its own path, right after the space's address: numestri.com/docs…

    Read release
  3. Breaking

    Public status routes below sit under /public/orgs/{orgId}/spaces/{spaceId}/status. A status page also serves each one at its own address (/st/{org}/{space}/… or your domain), with CORS and Cross-Origin-Resource-Policy: cross-origin, so a tool on another origin can read them. summ…

    Read release
  4. PATCH /orgs/{orgId}/spaces/{spaceId}/docs/locales/{code} with { "label": "…" } renames a language in the reader's switcher. {code} may be default, which relabels the source language — "Original" until now, with no way to change it. Answers the full locales list, like POST and DEL…

    Read release
  5. Every space type has official templates. GET /orgs/{orgId}/space-templates now lists official templates for all 13 space types: 80 templates, up from 30. Status, events, roadmap, courses, careers, contact, FAQ, legal and custom spaces join docs, blog, forum and changelog. POST /o…

    Read release
  6. PATCH …/reader-auth. On the org (/orgs/{orgId}/reader-auth) and on a space override. A deep merge: absent keeps, null deletes, providers are matched by method (plus order when there are two of one method), unmatched providers are added, remove: true drops one, and a provider's co…

    Read release
  7. Breaking

    Public events routes now check that the space is public. Before this release, every route under /public/orgs/{orgId}/spaces/{spaceId}/events returned events from any EVENTS space, even a private one. That covered the list, a single event, calendar.ics, the per-event .ics and the…

    Read release
  8. One feed writer, more feeds. RSS, Atom and JSON Feed now come from one writer, so the three formats always agree. Space. Feeds. Narrow with. Changelog. …/changelog/atom.xml (beside rss.xml). ?tag=, ?type=. Status. …/status/atom.xml, …/status/feed.json, …/status/maintenance.ics. ?…

    Read release
  9. Connect your org's Stripe. Use GET, PUT and DELETE on /orgs/{orgId}/payments/stripe, and POST …/stripe/test to check the keys. Keys are stored encrypted and are write-only: the API never returns them. Each org has one connection, and both event tickets and paid courses use it. Mo…

    Read release
  10. Publishing a translation updates its address immediately. Publishing a page's locale twin now drops every address a reader can ask for it at — ?locale=<code> on the original page's address and the /<code>/<page> path form — from both our web tier and the edge, on your own domains…

    Read release
  11. Filtering the public archive. The public changelog list takes these filters: ?type=: the release's declared type (New, Improved, Fixed, Deprecated, Retired, Security). ?channel= and ?breaking=true. ?tag=a,b with ?match=any|all. ?month=YYYY-MM, which wins over ?year. ?family=, and…

    Read release
  12. Breaking

    2026-12-01 is the newest API version. It groups three breaking changes under one date, so you move once. Nothing changes for you until you send the header: Forumulate-Version: 2026-12-01. On 2026-11-01, 2026-09-01, or with no version, every behaviour below stays as it was. 2026-1…

    Read release
  13. PATCH /orgs/{orgId}/sites/{siteId} deep-merges config, so a key you delete from your own copy stays live until you send null for it. A publisher that keeps its site in a repository had to diff against what we stored to work out the nulls. PUT /orgs/{orgId}/sites/{siteId} stores c…

    Read release
  14. pat.secret. POST /pats, POST /pats/{id}/rotate and device-key creation now return the secret on the token object as well as in the top-level token — the same string, on the object you are likely to keep. It is still shown once and never again. description on every space type. GET…

    Read release
  15. Each collection names its rows after what they are: a forum answers topics, a blog articles, a status page monitors, documentation pages. That is clear for one endpoint and a guessing game for a client that reads them all — a publisher that read topics off a blog saw an empty lis…

    Read release
  16. New endpoints and parameters. All of them are additive and work on every API version. GET /docs/markdown-dialect — the Markdown dialect the importer understands, as data: every directive, its attributes, and the block each one becomes. Every markdown field in the API reference li…

    Read release
  17. Breaking

    2026-11-01 has been live since 7 October. It makes one change, and nothing changes for you until you send the header: Forumulate-Version: 2026-11-01. On 2026-09-01, or with no version, the paging envelope stays as it was. Paging speaks one spelling. page carries hasMore and nextC…

    Read release
  18. Moving an address you already serve onto Forumulate no longer has a moment where neither side answers it. Verification and activation are separate steps. POST …/domains/{domainId}/verify with {"activate": false} proves you own the address without moving any traffic: the domain re…

    Read release

One email per release. Unsubscribe from any of them.