# Change log (/docs/change-log)

Notable changes to Obelism Content, newest first. Changes to the SDK packages (`@obelism/content`, `@obelism/content-react`) have their own release notes in the [SDK repository](https://github.com/Obelism/sdk/blob/main/packages/content/CHANGELOG.md), one changelog per package.

## 2026-10-31 [#2026-10-31]

- **Every list drags into order.** A list field that holds several items — assets, references, Shopify products or collections — and a select field's options move by a row's grip, or with Space and the arrow keys. Blocks and a content model's fields already did. See [fields](/docs/guides/content-model#fields).
- **Every section of the entry editor folds.** The chevron on **Search and sharing** never closed its fields; now every group on the entry page folds, and a check's **Fix** opens the section it points into.
- **Export and import, side by side.** **Settings → Export and import** is two cards now: **Export** (the JSON an import reads back, and plain SQL for other tools) and **Import**, which lists what it reads (one Obelism JSON export, not SQL or a zip) and offers **Download a template**: this environment's content model with one example entry. See [export and import](/docs/guides/environments#export-and-import).
- **A Space name can't run as SQL.** The SQL export writes the Space's name into a comment at the top of each file; a name with a newline ended that comment, so the rest of the name ran as SQL when someone loaded the files. Newlines are collapsed now, and the README and header are tested against a loaded database.

## 2026-10-30 [#2026-10-30]

- **Export and import moved to Settings.** Admins and developers find the environment's JSON and SQL downloads and importing a file under **Settings → Export and import**, instead of on Promote.
- **Your content as plain SQL.** **Settings → Export and import → Download … as SQL** gives a zip with a schema, one file of `INSERT`s per table (the content model, entries, paths and redirects), an `import.sql` that loads them in order and a README. It is for taking your content to another tool, not a backup Obelism imports back; asset files stay in Media. The agent API's `GET …/export/sql` answers the same files as `{ name, content }`. See [taking your content elsewhere](/docs/guides/environments#taking-your-content-elsewhere).
- **Signed uploads keep an image's dimensions.** A file `PUT` to `POST …/uploads/assets` now records its width and height from the image header, so `from-upload` makes a complete asset. Files uploaded before this fill theirs in the first time they are served. See [Assets](/docs/guides/assets).
- **Image URLs ask quality 80.** Delivery URLs name `q=80` instead of `q=100`: re-encoding at 100 could make a resized copy several times the original's bytes. The edge cache is unchanged; `X-Cache` says whether it answered. See [Images](/docs/api/images).
- **Content type saves merge.** On the agent API and MCP, saving an existing type keeps the fields the call leaves out and changes the ones it sends; `removeFields` removes explicitly. Fields can also change type (`text`, `textarea`, `number`, `boolean`, `datetime`, `select` to `json`, `json` to text, `text`↔`textarea`) with their values converted, and localization can switch on those and `json`. See [the content model](/docs/guides/content-model#changing-the-model).
- **A reference cycle larger than 100 publishes across calls.** A stalled bulk publish finds the whole cycle from the entries the call names and takes it live in one transaction, up to 500 entries. See [publishing several entries at once](/docs/guides/publishing#several-entries-at-once).
- **A false image is refused.** Inline, multipart and signed uploads refuse a file claiming a browser-renderable image type whose bytes prove nothing image-like, and multipart's `filename` field now names the asset over the part's name.
- **A wrong host says where to go.** A Content agent path called on `www.obelism.studio` answers problem JSON with the `content.obelism.studio` address, and the errors page explains Cloudflare's plain-text `403` for Python's default User-Agent. See [Errors](/docs/api/errors).

## 2026-10-29 [#2026-10-29]

- **Blocks shared across pages.** A block type can now have entries, **shared blocks**, placed in a page's blocks list as `{ "_type": "_shared", "entry": "entry_…" }`. Delivery expands one inline with `_sharedFrom`, publishing it updates every live page it shows (or leaves the pages you untick on what they show now), and **Detach** turns a use back into a local block. Pages held on an older version catch up on their next publish. A block publish sends `block.published`. See [shared blocks](/docs/guides/content-model#shared-blocks), [publishing](/docs/guides/publishing#shared-blocks) and [delivery](/docs/api/delivery#entries).

## 2026-10-28 [#2026-10-28]

- **Shopify Oxygen.** A guide for a React Router site on Shopify's host: the delivery token in the storefront's variables (Oxygen issues no OIDC token, so a connected deployment can't cover it), the public environment the canvas needs, the headers the editor needs, and caching with a TTL where Oxygen can't purge by tag. See [Shopify Oxygen](/docs/getting-started/oxygen).
- **React Router, end to end.** The [React Router quick start](/docs/getting-started/react-router) now covers editing on the site (`/cms/login`) and the CSP both the canvas and the prompt bar need, not just the canvas. See [editing on your site](/docs/guides/site-editing).
- **Files up to 50 MB.** Uploads from Content, the agent API and replacing a file in Media take files up to 50 MB (videos stay at 100 MB). Over 25 MB, the upload warns that the file adds to your storage quota. See [Assets](/docs/guides/assets).
- **One toolbar over the content list.** The views are **All**, **Changed**, **Drafts** and the ones you save, no longer one per content type: content types are in a **Type** filter that takes several at once, statuses and **Created by me** in **Filter**. **Show as** adds **By content type**, every entry under a heading per type. **Save as view** appears when a filter matches none of your views. Old links with one `type` keep working; several are a `type` each. See [the content list](/docs/guides/entries#the-content-list).
- **Plugins.** Your Organization's own web pages in Content, in a sandboxed frame: as the input of a field (a brand colour, a map pin, a PIM product) or as a dashboard page. An admin registers one from its manifest under **Plugins**, a developer turns it on per environment under **Settings → Preview and site** and picks it as a field's **Input**. A plugin gets only what its manifest's permissions say, sets the field's value as an unsaved change, and can get a five-minute token for its backend. See [Plugins](/docs/guides/plugins).

## 2026-10-27 [#2026-10-27]

- **Fields shown only sometimes.** A field can have **Show only when** another, earlier field is on, has an option or text, or has a value, so one block type covers a hero with and without a call to action. Hidden fields keep their values, are delivered as `null`, and are only required while shown. In model files and the APIs it is `when`. See [fields shown only sometimes](/docs/guides/content-model#fields-shown-only-sometimes).
- **Preview images for blocks.** A block type can show a picture of itself where editors add a block: upload a screenshot under **Preview image** in its settings, or give an `https://` URL. In model files and the APIs it is `previewImage`, a URL or a media asset id. See [preview images](/docs/guides/content-model#preview-images).

## 2026-10-25 [#2026-10-25]

- **Image URLs without `w` or `q` work.** `/assets` no longer refuses an image URL that leaves them out: it serves the image at its own width (up to 3840 pixels) and quality 80, still optimized. AVIF uploads load again: they are served as they are, since Cloudflare can't transform them. See [Images](/docs/api/images).
- **Store changes reach your site.** With a Shopify store connected, webhooks can select `product.updated`, `product.deleted`, `collection.updated` and `collection.deleted`: a product's price, stock, images or title changing, a collection changing, or either being deleted. Each names the item, a product's collections, the published pages that show them with their paths, and cache tags, so your site revalidates exactly those pages and its feeds. See [Webhooks](/docs/guides/webhooks#shopify-changes).
- **Shoppable images.** Files in Media can be tagged with the products of the space's Shopify store, each on its point in the picture. Turn on **Show its products** for one use of a file (in **For this use**, or 🛍 on a file in rich text, or `products: true` in the value), and delivery adds the file's products to that asset: `products: [{ id, handle, position }]`. Draw hotspots or list the products next to the image; prices and stock come from the Storefront API. See [Assets](/docs/guides/assets#products-in-a-file).
- **Product and collection pages take their title from Shopify.** The `productPage` and `collectionPage` types Settings offer have no Title field anymore, so a new page no longer needs one filled in before it can be published: read the product's or collection's title from the Storefront API, as its price and images. A page's name, which delivery's links show as its title, starts as the item's title. Types added before keep their Title field; delete it in the content model to do the same.
- **Drafts only for the space you name.** The delivery API answers `401` when a token's space or environment differs from the request's `Obelism-Space` or `Obelism-Environment`, for every kind of token. Pass `space` and `environment` to the `ContentClient` you read `cms_token` with, so a `cms_token` made for someone else's space can't put its drafts on your site. See the [visual editor](/docs/guides/canvas).

## 2026-10-24 [#2026-10-24]

- **JSON body limits.** The dashboard, agent, management and site APIs refuse a JSON body over its limit with `413`: 1 MB, 4 MB for entry content or a model file, 32 MB for an import file. See [Errors](/docs/api/errors#payload_too_large).

## 2026-10-23 [#2026-10-23]

- **Transfer a space** to another organization you're an admin of, from Settings. Everything in it moves along, in Content, Improve and numbers, and its tokens, webhooks and Shopify store stay connected. See [Spaces](/docs/guides/spaces#transferring-a-space).

## 2026-10-22 [#2026-10-22]

- **Docs.** The guides are grouped (modelling, editing, publishing, integrations, administration), with new pages on [editing entries](/docs/guides/entries), [spaces and settings](/docs/guides/spaces) and [API tokens](/docs/guides/api-tokens), and the [agent API](/docs/api/agents) lists every area it covers.

## 2026-10-21 [#2026-10-21]

- **The canvas.** Every page of an environment side by side on one board, your site in each frame: a column per page type, panned and zoomed, at desktop or mobile width. Click a page to edit it with its form or by prompt, keep unsaved changes on several pages at once, and **Save all**. It replaces the visual editor: **Open in the canvas** on an entry's page opens it with that page selected, and links to the visual editor go there. With a Shopify store, a **Products** column holds the product pages and any product of the store at your site's product route, where **Add a product page** gives it one. Frames are as tall as their pages with `@obelism/content` 0.20 or later. See [Canvas](/docs/guides/canvas).
- **Variants side by side.** On the canvas, a page with an A/B test or flag block shows its options next to each other, a frame per option, following your edits. See [Canvas](/docs/guides/canvas#variants-side-by-side).
- **Change the whole site by prompt.** On the canvas, with no page selected, **Change the site** plans a request across the pages on the board and runs it as a prompt on each page it is about, unsaved until Save all. See [Canvas](/docs/guides/canvas#changing-the-whole-site).
- **Collection pages.** With a Shopify store, collections get pages like products do: a page type with a unique Collection field (Settings offer `collectionPage`) holds the page of one collection, in a `collections` folder, started from the collection under New entry. Settings → Preview URL sets where your site shows a collection (`/collections/{handle}` by default), the canvas has a **Collections** column, and the prompt bar on your site offers **Add a collection page** on a collection the site marks with `editableCollection` (`@obelism/content` 0.20). The agent API's settings take `collectionPath`. See [Shopify](/docs/guides/shopify#collection-pages).
- **A calmer media page.** Media shows files as tiles, cropped around their focal point; drop files on it to upload. Clicking one opens its details: the focal point on a large preview with how common crops keep it, its title and alt text in every language, tags, and replacing, privacy and deleting. The same details open from a picked file in the entry form, the visual editor and the site's prompt bar form.

## 2026-10-20 [#2026-10-20]

- **Links to products.** With a Shopify store connected, a link field that allows **Shopify products** can go to a product of the store, picked like a Shopify field's, without making a page for it. Delivery answers `type: "product"` with the product's id and handle, and its product page when it has one. A page type with a unique Product field is a product page type: one published page per product, for what the store doesn't hold. Settings offer a ready `productPage` type, a new product page starts from a product (its handle is the slug), and delivery filters Shopify fields by id (`fields.product=gid://shopify/Product/42`). On the site, the prompt bar offers **Add a product page** on a product the site marks with `editableProduct`, and opens product pages at the site's product route (`@obelism/content` 0.18). Product pages go in a `products` folder, and Settings → Preview URL sets where the site shows a product (`/products/{handle}` by default), where the visual editor opens product pages. See [Shopify](/docs/guides/shopify#product-pages).

## 2026-10-19 [#2026-10-19]

- **Shopify.** Connect a space's Shopify store (Settings → Shopify, or the Obelism app in Shopify) and pick its collections and products in a new `shopify` field type, with a picker that searches the store, in the editor, the visual editor and the site's prompt bar. Settings offer a ready product grid block, and Copy as .env adds the store and a Storefront token; the SDK's `fetchShopifyCollection` and `fetchShopifyProducts` read live prices and stock. See [Shopify](/docs/guides/shopify).
- **Link fields.** A new `link` field type for buttons, cards and menus: to a page of the space, picked like a reference and following it when it moves, or to any address, each with an optional query and anchor. Delivery answers it with the page's id, title, slug and path (`null` while the page isn't published). The website starter's button uses one. See [links](/docs/guides/content-model#links).
- **Settings.** Space settings is called Settings now, at `/settings` (old links still work), as in Improve, and the organization, space and environment are picked with the same switcher in every Obelism product.
- **Every organization has a space.** A new organization starts with a space called Default, in English, so there is somewhere to start; rename it or change its locales under Settings. An organization's last space can't be deleted. Spaces are becoming shared by every Obelism product, so Improve's tests and the numbers will belong to one too.

## 2026-10-18 [#2026-10-18]

- **AI translation for the whole space.** Settings → AI translation: turn it on or off, choose the languages, give the model instructions, and translate automatically when the default language is saved. Translate many entries at once from the content list, in the background, saved as drafts; agents translate and queue through the API. See [translating](/docs/guides/locales#translating).
- **Ask the docs.** ⌘K in the docs searches them and answers questions from them with AI, as Improve's docs do. Plus a [React Router](/docs/getting-started/react-router) guide, and breadcrumbs in search results.
- **Comments and presence.** Comment on an entry or one of its fields, reply and resolve threads, in the entry editor's sidebar; the toolbar shows who else has the entry open, and warns when they have unsaved changes. See [comments and presence](/docs/guides/comments).
- **Delivery usage and rate limits.** Settings → Usage shows the delivery API requests per environment this month and per day, cache hits included; each token can make 1,000 requests per 10 seconds. See [rate limits and usage](/docs/api/delivery#rate-limits-and-usage).
- **Content types need a description.** Every content type says what it is for, in a sentence: editors see it, and prompts use it to pick the block type for a new section. The model can't change until types without one are given one. See [the content model](/docs/guides/content-model#content-types).
- **Publishing some languages.** Publish only the languages that are ready; the others keep what was published, or fall back. See [publishing](/docs/guides/publishing#publishing-some-languages).
- **Translating entries.** The language switch shows how far each locale is translated, and **Translate from …** fills in a locale's missing texts by machine translation, to check and save. See [locales](/docs/guides/locales#translating).
- **Private files.** A file can be made private: it is then only served with a signed URL that delivery hands out and that lasts a day, and its links can be revoked. See [assets](/docs/guides/assets#private-files).
- **Tags and replacing files.** Tag files under Media and filter the library by tag; replace an asset's file while keeping its id, so content using it shows the new file. See [assets](/docs/guides/assets#tags).
- **More validations.** Text fields take a `format` (URL, email, hex color or slug) and textareas a `pattern`; text and number fields can be `unique` among published entries; `multiple` assets and references take `min` and `max`; and most fields a `defaultValue` for new entries and blocks. See [the content model](/docs/guides/content-model#fields).
- **Access per product.** Admins can keep a member out of Content or Improve on www (Organization → Product access); for that product they are then no member. See [roles](/docs/guides/roles#access-per-product).

## 2026-10-17 [#2026-10-17]

- **Roles per space.** Admins can give a member a role in some spaces only (Settings → Members): they then see just those spaces, with that role in each. See [roles](/docs/guides/roles#roles-per-space).
- **Removing a locale.** A saved locale (not the default) can be removed under Settings, deleting its values, asset text, slugs, paths and redirects in every environment after you confirm with its code. See [locales](/docs/guides/locales#removing-a-locale).
- **Models locked to code.** An environment's content model can be marked as managed in code (Settings → Content model, or `model apply --lock`): read-only in the dashboard, the agent API and MCP, changed only by applying the model file. See [the model in Git](/docs/guides/model-in-git#locking-the-model-to-code).
- **Review before publishing.** An environment's publishing can be reviewed: only admins publish there, and editors and developers ask for review, which an admin approves or sends back. See [publishing](/docs/guides/publishing#review-before-publishing).
- **Activity.** An audit log per space: who published, moved, deleted or restored what, changed the model, promoted or imported content, and changed tokens, webhooks or settings, and whether they used the dashboard, an agent, a token or a schedule. See [Activity](/docs/guides/activity).
- **Export and import.** Download an environment's content and model as one file, and import it like a promotion: as a backup, or to move content between environments. See [environments](/docs/guides/environments#export-and-import).
- **Content tokens.** Management tokens get scopes: `model` (as before) and `content`, which writes content through the agent API without a person's session, for migrations and imports. See [the management API](/docs/api/management#content-with-a-management-token).
- **Bulk actions.** Tick entries in the Content list to publish, unpublish, move or delete them together, or use `POST …/entries/bulk`. See [publishing](/docs/guides/publishing#several-entries-at-once).
- **Starter models.** A new space can start with a blog, marketing site or docs model. See [the content model](/docs/guides/content-model#starting-a-space-from-a-model).
- **Focal points.** Click an image under Media to set where crops keep it. The delivery API answers `focalPoint` on assets, and `focus=x,y` on a file URL crops around it. See [images](/docs/api/images).
- **Promotion cleans up.** The plan lists entries only the target has; tick them to move them to the target's trash in the same promotion.
- Deleted organizations' spaces, content and files are removed 30 days after the deletion.
- **URLs per locale.** Pages and folders have a slug per locale (**Move** in the sidebar), falling back along the locale chain. The delivery API looks `/pages?path=…&locale=nl` up in that locale and answers `paths` on every entry; redirects and webhooks are per locale too. With `{locale}` in the preview URL, the visual editor opens each language's own page. See [Locales](/docs/guides/locales#urls-per-locale).
- **Scheduled publishing.** An entry can publish and/or unpublish at a set time: **Schedule…** under Status in its sidebar, or the agent API. A scheduled run acts like the person who scheduled it pressing the button, with the same checks, webhooks and history; a refused run shows why in the sidebar. See [Publishing and scheduling](/docs/guides/publishing).
- **Filter and order entries.** The delivery API's entry list filters on a content type's fields (`fields.<apiId>`, with `ne`, `in`, `gt`, `gte`, `lt`, `lte` and `exists`) and orders by date, name, path or a field. That also finds settings, navigation and other single entries without hard-coding their ids. See the [delivery API](/docs/api/delivery) and the SDK's `getFirstEntry`.
- **Templates for new content types.** A new page type starts with a title, a body and SEO fields, a data type with a title, a block type with a heading and an anchor. The agent API and MCP add the same fields unless you send your own.
- **Duplicate an entry** from its sidebar or the agent API: a draft next to it, named " (copy)".
- **Rename and delete spaces** in Settings. Deleting a space (admins only) removes its content and files.
- Asset and entry pickers and the media page search and page through the server, so large spaces stay fast. Each entry keeps its newest 100 versions.
- **Drafts need a token.** The visual editor gives the site a short-lived, read-only token (`cms_token`, 8 hours) to read drafts with; `?cms_preview=1` on its own no longer shows anything. Tokens that see drafts are refused from a browser on any origin but the environment's preview URL. See the [visual editor](/docs/guides/canvas).
- **Asset changes reach sites.** Changing an asset's alt text or title updates every environment whose content uses it and sends the new `asset.updated` [webhook](/docs/guides/webhooks).
- **Publishing checks references.** Published content only points at published entries: publishing refuses a reference or embed to a draft.
- **Limits.** Files over 25 MB are refused (413). The agent API and MCP (300 calls a minute) and prompts (20 a minute) are limited per person and answer 429 with `Retry-After`.
- These docs, at content.obelism.studio/docs, with search and `/llms.txt`.

## 2026-10-16 [#2026-10-16]

- **The bridge script has the prompt box.** `https://content.obelism.studio/bridge.js` is now the SDK's bridge, so sites without a bundler get prompt editing too.
- **Agents set up a site.** The `getProjectSetup` MCP tool tells an agent how to start a site's repository with `npx @obelism/content init`, which writes the model file and an example per content type. See [Agents](/docs/getting-started/agents).
- **A/B tests and feature flags as a block.** Every blocks field takes the built-in improve block: a list of blocks per option of an improve test or flag. See [A/B tests and feature flags](/docs/guides/ab-tests).
- **Entries are edited in a form.** One input per field, blocks as cards that nest and move, asset and entry pickers, a language switch for translated fields, and Save draft / Publish in a sticky bar (Cmd/Ctrl+S saves). The content model editor groups types as pages, data and blocks.
- **New pages by prompt.** On your own site, the prompt box can also write a new page from a path and a description, stored as a draft.
- Organizations have a plan per product; an admin can turn Content off for an Organization on www. The delivery API keeps serving.
- Fixed: signing in from a dashboard link no longer ends on a 404.

## 2026-10-15 [#2026-10-15]

- **One sign-in for every Obelism product**, on www.obelism.studio. Organizations, members and invites are managed there too.
- **Edit on your own site.** Editors sign in from the site itself and edit with drafts and prompts, outside the visual editor. See [Editing on your site](/docs/guides/site-editing).
- **Edit by prompt** in the visual editor: describe a change and it shows on the page, unsaved, with undo. See [Prompt editing](/docs/guides/prompt-editing).
- API tokens, webhooks and space settings can be managed from the [agent API](/docs/api/agents) and MCP.

## 2026-10-14 [#2026-10-14]

- A getting-started guide and a dashboard prompt for setting up your agent.
- Fixed: asset fields that allow `image/*` accept images.

## 2026-10-13 [#2026-10-13]

- **Images resized on the fly** with width, height, fit, format and quality parameters. See [Images](/docs/api/images).
- **Promote content between environments**, with a plan of what will change first. See [Environments](/docs/guides/environments).
- **The content model in Git**: management tokens, the management API and the `content model pull | plan | apply` CLI. See [The model in Git](/docs/guides/model-in-git).
- **Version history and rollback** for entries.
- **Rich text** edited with a toolbar in the visual editor.
- **Webhooks**, signed and retried for about 11 hours. See [Webhooks](/docs/guides/webhooks).
- The entries list pages, searches and filters.
- Admins can rename the Organization.
- Validation messages are written for people.
- Uploaded files are served so they can't run as pages.
- Model changes and usage checks stay fast on large spaces.

## 2026-10-12 [#2026-10-12]

- The first version: content models per space and environment (pages, data and blocks), the entry editor, media, the [delivery API](/docs/api/delivery) with API tokens, the visual editor, the agent API and an MCP server. Rich text is stored as JSON and accepts Markdown.
