Changelog

[1.7.0]

  • Add user roles and permission policies. Permissions can now be scoped by workspace, root, type, field, entry id and locale, and cover actions such as create, read, update, delete, reorder, move, publish, archive, upload and explore. The dashboard and backend now enforce these policies.
  • Add configurable rich text toolbars and custom Tiptap extension support.
  • Improve the Next.js integration. withAlinea now uses the CLI-provided admin path, proxies the dashboard in development, rewrites to the generated dashboard in production and supports custom dashboardFile values.
  • Allow baseUrl to be configured per environment.
  • Add workspace and root information to EntryUrlMeta.
  • Return CORS headers for local uploads.
  • Improve OAuth and JWT handling with explicit SameSite cookies, access-token refresh without treating refresh tokens as JWTs, stricter JWKS key selection and optional extra claim validation.
  • Fix rich text HTML parsing so marks are applied across nested content and root-level whitespace is ignored.
  • Filter unresolved entry links from multi-link query results.
  • Add llms-full.txt to the published package.

[1.6.4]

  • Don't use Y.js for preview deltas, but a more predictable diff

[1.6.3]

  • Fix link order in rich text fields

[1.6.2]

  • Fix search results turning up empty
  • Show children indicator in tree even if all children are untranslated

[1.6.1]

  • Previous release mistakenly included features that were not ready for release.

[1.6.0]

  • Refactor how we build the internal index of all entries. This is now done immutably so that any problems during mutations to entries do not corrupt the index.

[1.5.4]

  • Add more richtext table options (mergeCells, splitCell, toggleHeaderCell and toggleHeaderColumn)

[1.5.3]

  • Fix Query.next and Query.previous which were not sorted correctly

[1.5.2]

  • Set access token at the root so cms.user() calls work in preview environments

[1.5.1]

  • Prefix upload locations with media dir for self-hosted backends
  • Handle logout endpoint for OAuth backends

[1.5.0]

  • Handle authentication with Alinea Cloud using OAuth 2.0
  • Enable ctrl and middle mouse clicks in the entry tree to open in new tab
  • Use a shared EventSource in dev mode to avoid the browser maximum of 6 connections per origin
  • Check workspace and root properties during entry creation

[1.4.9]

  • Fix: handle missing blobs in local IndexedDB store

[1.4.8]

  • Fix: data coming from Alinea Cloud was not handled correctly

[1.4.7]

  • Fix: previous release was published with extraneous dependencies

[1.4.6]

  • Disabled arrow up/down when on first/last row in lists (#450)
  • Keep copy icon visible during drag state; disable icons while dragging (#451)
  • SelectField: responsive layout improvements (#448)
  • ImageView: show cursor crosshair (#449)
  • Collapsible list rows (#444)
  • IconButton: focus layout change (#447)
  • TextField: added placeholder support (#442) and type email, tel, text, or url (#445)
  • Remove web workspace; move website to alineacms/alineacms.com

[1.4.5]

  • Fix: don't bundle contents in edge functions
  • Fix: order results of Query.parents by level
  • Fix: respect parent insert order on create
  • Fix: internal links to image and file entries from the link preview

[1.4.4]

  • Fix: publishing changes to file details no longer removes the associated file
  • Fix: don't use transparency in averageColor property for images

[1.4.3]

  • The previous release mistakenly added next as a direct dependency to the alinea package. While we're currently focused on providing a clean Next.js integration, Alinea is not tied to Next.js and should not depend on it.

[1.4.2]

  • Using the alinea init command for a Next.js website will now auto-create the handler route in app/(alinea)/api/cms/route.ts. The generated cms.ts config file also includes more default options such as the baseUrl and handlerUrl.

[1.4.1]

  • Restore drag-drop behavior in entry tree. The drag and drop functionality was broken in the previous release due to a change in the way entries are rendered in the sidebar.

[1.4.0]

  • Better support for drafts in Alinea. Drafts can be enabled using the config option enableDrafts: true. Drafts and archived entries will now show their status in the sidebar as well. Workflows are adjusted to be able to create a draft entry, including draft children. These will show up as "unpublished" and can be published in one go. Further stability improvements were made to updating entry statuses.

[1.3.1]

  • Fix usage of cms.user() in api routes

[1.3.0]

  • Stability improvements.

[1.2.2]

  • Fix use of the readOnly field property which was overwritten from context
  • Minor fixes to path field
  • Make sure the editor widget doesn't interfere with pointer events of underlying elements

[1.2.1]

  • Added a preview property to TypeConfig to disable the preview on Type level (#407)
  • UI tweaks

[1.2.0]

  • Archiving an entry results in archived children entries as well.

[1.1.2]

  • Adjust the inferred results of cms.find and cms.get so they work reliable in non-strict Typescript codebases as well.

[1.1.1]

  • Fix the query result type of Query.parent, Query.next and Query.previous which were incorrectly typed as an Array.

[1.1.0]

  • Add a copy and paste button to List field blocks
  • Update link properties condition and location to be dynamic. The contents can be set by using a function.

[1.0.11]

  • Fix navigation tree in link picker
  • Set the default depth of querying children to 1

[1.0.10]

  • Fix handling mutation retries based on the http status code received.

[1.0.9]

  • Fix skip/take for queries which were not used
  • Disable navigation in the internal link picker if a condition is used

[1.0.8]

  • Fix live previews for translated entries

[1.0.7]

  • Fix querying linked entries without locale

[1.0.6]

  • Fix querying linked entries - the requested locale was not passed

[1.0.5]

  • Alinea will now fail if linked entries cannot be resolved during querying. Before it would log the error but continue - but this is rarely desired.

[1.0.4]

  • Fix removing field contents in Edit.update. Pass an undefined value to remove field contents:

    await cms.commit(
      Edit.update({
        id: '...',
        set: {removeMe: undefined}
      })
    )
    
  • Fix processing link data correctly even it contains legacy data

[1.0.3]

  • Only access normalized config in next cms adapter. This fixes an error in production builds which would prevent you from querying media files.

[1.0.2]

  • Tweak the withAlinea config function to work in all environments including Next 14.

[1.0.1]

  • Add the Infer.Entry and Infer.ListItem types which can be used to infer the type of an entry or list item from a query.

    type Entry = Infer.Entry<typeof EntryType>
    const entry: Entry = await cms.get({type: MyType})
    type ListItem = Infer.ListItem<typeof ListType>
    const list: Array<ListItem> = await cms.get({select: MyType.list})
    

[1.0.0]

  • Add support for Next.js 15 and Turbopack.
  • Removed all previously deprecated options.
  • Next.js config changes are now bundled in a withAlinea export found in 'alinea/next'.
  • Querying via cms.find/get is rewritten to take a single query object. Have a look at the docs to see how to use the new query api.
  • Creating custom fields can now be done through Field.create.
  • Entries now have a single id. If you are upgrading and were using i18n you can stabilize your ids by running npx alinea build --fix.