Skip to content

v1.2.0

Choose a tag to compare

@LucaGiardi20 LucaGiardi20 released this 18 Oct 19:08
· 106 commits to main since this release
651157d

Released 2026-10-18 from develop (PR #176). Milestone 1.2.0: 29 closed items.

Features

  • Editorial approvals for versioned collections: approvals_required, submit/approve/reject, promotion gate, a review-list filter, webhook events item.submitted / item.approved / item.rejected, and the permissions can-submit-collections / can-approve-collections (#48)
  • Translation helpers on the item form: a locale switcher showing per-locale completeness (filled/total), "Apply to all locales" / "Apply to empty locales", and per-field "Copy from {locale}" (#49). Corrected 2026-10-21: an earlier version of these notes described a side-by-side source/target workspace that was replaced before this release.
  • AI field translation on the item form (ContentTranslator plus a translate endpoint) (#193)
  • Collection layouts: optional kanban (select/radio) and calendar (date) views; table stays the default (#47). Kanban columns lazy-load and drag-and-drop order persists via board_sort; the calendar has multiple views and drag-to-reschedule; items-list toolbar filters (#193)
  • Slack and Telegram notifiers on the domain event bus. Messages include title, actor, status and an admin link, and each project can mute event types (notifier_event_types) (#39, #199)
  • Collaborative presence and soft lock via Echo: avatars, whisper lock, stale-save protection with expected_updated_at (#50)
  • Optional Meilisearch sync of published items, using queue jobs and the Compose profile meilisearch (#40)
  • Optional git export of published items to a remote: JSON/Markdown, deploy-key SSH, dry-run (#41)
  • CMS import profiles directus and wordpress for ImportRemoteJson (#30)
  • Optional OIDC/SSO login (Socialite plus issuer discovery). Accounts link by verified email; JIT provisioning is off by default (#29). A Keycloak QA profile ships in compose.oidc.yaml
  • Official Nuxt headless starter, qiick-io/externa-nuxt-starter, plus starter conventions in docs/starters.md (#152, #156)

Fixes

  • Meilisearch: the index is now created with primaryKey=id. Before this fix, documents were silently not indexed (#179)
  • Git export: clones use --template= so they work on sandboxed filesystems, and empty bare remotes are bootstrapped (#179, #182)
  • OIDC: callback validation errors now redirect to login instead of looping back to the IdP, and SSO rejection errors show on the login page
  • AI translate now updates React-controlled TipTap/markdown fields (#193)
  • Telegram test in Project settings runs synchronously and shows Bot API errors; tokens are validated against the BotFather format (#183)

Security

  • The OIDC client secret and the Telegram bot token are stored encrypted (#29, #39)
  • npm lockfile bumps (concurrently/shell-quote, source-map-js) so npm audit --omit=dev --audit-level=high passes (#182)

Breaking changes

  • None expected. All new integrations (SSO, Meilisearch, git export, notifiers, approvals) are opt-in.

Upgrade notes

  1. Back up the database.
  2. Run composer install (this adds laravel/socialite ^5.31), then npm ci && npm run build.
  3. Run php artisan migrate. This adds the approvals, board_sort, notifier_event_types and OIDC/notifier settings columns.
  4. Restart the queue workers (Horizon) and Reverb. Presence and the Meilisearch/git-export jobs depend on them.
  5. Optional: enable the Compose profiles meilisearch and/or compose.oidc.yaml (QA only), and configure SSO, notifiers and approvals in Project settings.
  6. Docker: pull ghcr.io/qiick-io/externa-core:1.2.0 once the v1.2.0 tag publishes.

Docs: https://docs.externa.qiick.io (companion release externa-docs 1.1.16)