Changelog
Release notes and version history for the Dyrected platform.
Release notes and version history across all Dyrected packages.
v2.10.0
-
-
Aggregate Engine Expansion (
countDistinct,distinct,groupBy): -
Added support for
countDistinct({ countDistinct: "fieldName" }) to count unique non-null values in a single database query. -
Added support for
distinct({ distinct: "fieldName" }) to extract unique non-null values without loading full documents. -
Added grouped aggregation support via
groupByparameter (?groupBy=<field>or{ groupBy: "field", aggregates: { ... } }) returning per-group metric breakdowns with automatic"__unassigned__"sentinel handling for missing/null values. -
Implemented cross-adapter parity for all aggregation operations across PostgreSQL, SQLite, MySQL, and MongoDB.
-
Updated live OpenAPI specification (
/api/openapi.json) and Swagger documentation with complete aggregate schemas and response types. -
Grouped Views & Admin UI Performance Optimization:
- Replaced client-side document group extraction with native single-query database aggregations in grouped Table, Kanban, and Spreadsheet views, eliminating $N+1$ query waterfalls and reducing database roundtrips.
- Deduplicated schema queries across
AdminShell,OperationalViewRoute, and dashboard pages by utilizing cached context schemas. - Added
defaultViewcollection configuration support with automated route redirection and clean sidebar submenu rendering.
-
-
- Filter Join Operator: Support
AND/ORtoggle in toolbar and URL parameters (joinOperator=and|or) for inter-column filter combinations in operational views. - Action Dialog Document Context: Pass target document/row context (
doc,docs,record,row,data,formData) into action form dialogs,FieldRenderer, and custom field components. - View Features & Action Ordering: Properly serialize and respect
view.features(edit,delete,duplicate) and customactionOrderin operational view action menus and table columns. (@dyrected/admin,@dyrected/core)
- Filter Join Operator: Support
v2.9.0
-
Promote operational table to canonical list view:
- Default view synthesis in
getSchemas:resolveSchemas(DyrectedProvider) now synthesizes alistview (layout: table, columns fromadmin.defaultColumnsor first 5 display fields) for collections without explicitviews, so every collection has a table workspace andCollectionRoutecan render without redirect. - Standardized preference keys: Column, view-mode, and toolbar keys now use
layout:collections:${slug}:listfor the default view andlayout:collections:${slug}:view:${viewSlug}[:variant|:mode|:toolbar]for named views (variant suffix forcards/kanban). Reads fall back to legacy keys (view-pref:,view-mode:,view-columns:,view-toolbar:) and migrate on next save. - CollectionRoute (Option B):
/collections/:slugnow rendersOperationalViewPagedirectly with the first (synthesized) view instead ofCollectionListPage(list-view-v1).list-view-v1.tsxis deprecated (kept for reference). Media collections still renderMediaPage. - URL compat shim: Legacy
?where=<json>(FilterBuilder) and?search=<term>params are merged into the view'sfilter(mergeFilters/containson first searchable field) so old shared links keep working. - Slot aliasing:
admin.components.beforeList→beforeViewHeader,beforeListTable→beforeViewContent,afterListTable/afterList→afterViewContentare now rendered viaAdminComponentSlotwith a stubbedCollectionListSlotPropsso existingcollectionListslot consumers continue to mount inside operational views.collectionViewslots remain primary.
list-view-v1.tsxis marked@deprecatedand will be removed in a future minor. (@dyrected/admin) - Default view synthesis in
-
Operational Views:
defineView/defineActionconfiguration helpers, view-aware admin sidebar and routing, table, kanban, calendar, cards (with multi-image carousels and edge-to-edge covers), and spreadsheet layouts, summary metric stat cards backed by the aggregation engine, an actions runner that resolves declarative mutations (now(),input.*,doc.*) or self-hosted handlers through the lifecycle-hook pipeline, and 4 new recipes in@dyrected/knowledge. (@dyrected/admin,@dyrected/core,@dyrected/sdk) -
- Where Operator Aliases (
greater_than,less_than, etc.): Added support for verbose operator names inparseSqlWhereandparseMongoWhere(greater_than,less_than,greater_than_equal,greater_than_or_equal,less_than_equal,less_than_or_equal,like), resolving HTTP 500 errors on Detail View adjacent record navigation queries (Previous / Next document buttons). - Core Jexl Pre-bundling: Pre-bundled
jexlinto@dyrected/coreto prevent Vite and browser runtime CJS default export errors across consumer applications. - Public/Default Preferences Read: Allowed
GET /api/preferences/:keyto useoptionalAuth, enabling unauthenticated clients (e.g. login screen, theme initialization) to retrieve global preferences and default fallback values without throwing 401 Unauthorized errors. Mutations (PUT,DELETE) remain protected. - Media Library Clipboard Paste & Progress Indication: Added global clipboard paste support (
⌘V/Ctrl+V) toMediaLibraryDialogwith auto-switch to the Upload tab, live upload progress display, toast feedback notifications, and discoverability shortcut badges. (@dyrected/admin,@dyrected/core)
- Where Operator Aliases (
v2.8.3
-
- Lazy Database Connections: Removed eager initialization in constructors for
@dyrected/db-postgres,@dyrected/db-mysql, and@dyrected/db-mongodb. Network sockets, connection pools, and database creation queries are now deferred until the first actual query or explicit lifecycle call, preventing hanging sockets and timers when loadingdyrected.config.tsduring static builds (nuxt build,next build, type-generation, or CI pipelines). - Graceful Disconnect & Teardown: Added
disconnect(): Promise<void>toDatabaseAdapterinterface across all database adapters (@dyrected/db-postgres,@dyrected/db-mysql,@dyrected/db-mongodb,@dyrected/db-sqlite) and exportedcloseAllPostgresClients()from@dyrected/db-postgres. - Nuxt Lifecycle Teardown: Added a
closehook in@dyrected/nuxtto automatically calldisconnect()on active database adapters and flush cached client connection pools when Nuxt finishes building or shuts down.
- Lazy Database Connections: Removed eager initialization in constructors for
v2.8.2
-
Enhance Detail Views with inline editing, custom component resolution, and dynamic presentation options:
- Custom Component Resolution: Resolve custom Detail View components directly from runtime
DyrectedContextand<DyrectedAdmin :components="..." />in Vue/Nuxt and React/Next.js. - Inline Field Editing: Support
editable: trueondisplayField()with interactive inputs, immediate SDK mutations, and save/cancel micro-interactions. - Dynamic Badge Presentation: Support
badgeColorswith named palettes, hex codes, Tailwind classes, and wildcards ondisplayFieldanddisplaySection. - Media Previews: Render uploads and media relationships seamlessly in Detail Views using
DyrectedMediawith aspect ratio, alignment, and object-fit constraints. - Adjacent Record Stepper: Add header and footer stepper controls to navigate smoothly between previous and next records in the active collection.
- JEXL Visibility Context: Pass full document properties to visibility evaluation context for robust conditional rendering. (
@dyrected/admin,@dyrected/core,@dyrected/nuxt,@dyrected/vue)
- Custom Component Resolution: Resolve custom Detail View components directly from runtime
v2.8.1
-
- Detail View Inline Editing (
editable: true): Added interactive inline editing directly within the Detail View screen. Editors can toggle simple fields (such as internal notes, tags, status choices, quantities, and dates) into editable form inputs with single-click save and cancel controls, updating records immediately via the client SDK without navigating away from the detail screen. - Dynamic Badge & Tag Color Palettes (
badgeColors): Introduced thebadgeColorsresolution engine in Admin Detail Views. Supports 20+ named color palettes (emerald,amber,rose,sky,indigo,purple,violet,zinc, etc.), custom hex codes with automated background tints, raw Tailwind classes, and wildcard (*) fallback mappings. - Section Badges and Palette Styling: Added
badgeandbadgeColorconfiguration options todisplaySection(), allowing section headers to display contextual status or count badges. - Human-Readable Option Resolution: Enhanced select and radio field presentation in Detail Views to resolve raw value identifiers to their human-readable schema option labels.
- Rich Media & Thumbnail Previews: Upload fields and media relationship documents in Detail Views now render responsive image cards, video players, and file download links instead of raw relationship identifiers.
- Star Rating & Color Swatch Displays: Added visual star rating scales and interactive color swatch previews with hex copy utilities to Detail Views.
- Auth Bootstrap & External Token Resolution: Fixed an issue where incoming redirect tokens (
dyrectedExternalToken) caused the admin loading splash to hang indefinitely when external auth was not explicitly configured in the schema. Added cookie session support (__dyrected_token/dyrected_token) and optimistic JWT payload decoding so authenticated dashboards mount instantly without redundant roundtrips. - Detail View Adjacent Record Navigation: Added subtle Previous and Next record traversal in the Detail View. Includes a top-header stepper (
</>), a responsive bottom footer bar with previous/next document titles and directional arrows, and keyboard shortcuts (Jfor next,Kfor previous). - Direct Media URL Resolution & Unified
DyrectedMedia: Standardized media URL handling across@dyrected/adminso that media objects with a populatedurlproperty use the target URL directly rather than reconstructing fallback paths. Centralized avatar, image, HTML5 video, YouTube/Vimeo embed, audio, and file download renderers into a universal<DyrectedMedia />component. - Upload & Image Field Relationship Population (
depth >= 1): FixedPopulationServicein@dyrected/coreto populateuploadandimagefield types (defaulting to the target upload collection ormedia) when queries specifydepth >= 1. Added automatic bare-ID media resolution fallback to<DyrectedMedia />in@dyrected/adminso that media assets display immediately even if received as unpopulated IDs. - Interactive Relationship Badge Links (
DetailRelationshipLink): Relationship and author fields in Detail Views now render interactive linked badges featuring avatar images or initial icons, document titles, and direct navigation links to the target record. If received as an unpopulated ID string, the component automatically resolves the record title and avatar asynchronously. - Tag and Array Badge Rendering: Array fields, multiSelect lists, and JSON string arrays (such as
Tags: ["insights", "operations"]) now automatically parse and render individual badge pills with support forbadgeColorspalettes, avoiding raw JSON string outputs. - Comprehensive Detail Reference & Type Definitions: Added complete JSDoc annotations and automated contract generation in
@dyrected/knowledgefor all 9 Detail View helper functions (displayField,displaySection,displayTabs,displayTab,displayGrid,displayRepeat,displayComputed,displayText,displayDivider,displayCustom) and their configuration options. (@dyrected/admin,@dyrected/core)
- Detail View Inline Editing (
v2.8.0
-
Detail View System:
- Added read-only Detail View pages and configurable layout renderers for collections (
/collections/:slug/:id) and globals (/globals/:slug). - Added layout configuration helpers in
@dyrected/core:defineDetailView,defineSection,defineFieldCard,defineRepeatCard,defineTab,defineTabs,defineComputedCard,defineDivider,defineInfoText, anddefineFieldGrid. - Added support for dynamic conditional visibility on detail cards, sections, and tabs using boolean values or JEXL expressions evaluated against
{ doc, user }. - Added type-aware formatters and display variants including currency, percentages, progress bars, star ratings, tags, avatars, color swatches, and relations.
- Added custom component slot support for detail views in both React and Vue runtimes.
- Added read-only Detail View pages and configurable layout renderers for collections (
-
Collection Aggregations System:
- Added
POST /api/collections/:slug/aggregateendpoint to@dyrected/coreand integrated it into the OpenAPI specification generator. - Added collection
aggregate()method to@dyrected/sdk. - Implemented database aggregation queries across all adapters:
@dyrected/db-postgres,@dyrected/db-mysql(withIF()conditional aggregation),@dyrected/db-mongodb, and@dyrected/db-sqlite. - Added comprehensive security checks and access control gates for collection aggregations.
- Added
-
Knowledge & Documentation Runtime:
- Added runtime-aware documentation manifest generator in
@dyrected/knowledge. - Synchronized OpenAPI endpoints, recipes, and LLM reference indexes.
- Added runtime-aware documentation manifest generator in
v2.7.1
-
- Scoped split-pane edit page width calculation exclusively to desktop screen breakpoints, preventing form compression on mobile viewports
- Replaced zero-based index array warnings with human-readable collection and field slug names in CLI
sync:schemaoutputs - Added direct documentation links to CLI schema sync warning messages and core config validation outputs
- Added comprehensive built-in Jexl helper utility functions (
slugify,lower,upper,trim,capitalize,truncate,readingTime,wordCount,replace,startsWith,endsWith,now,today,formatDate,addDays,diffDays,isPast,isFuture,includes,join,first,last,compact,unique,length,round,clamp,default,coalesce,isEmpty,get) across@dyrected/core,@dyrected/admin, and CLI declarative validation (@dyrected/admin,dyrected,@dyrected/core)
-
- Isolated server observability and logger runtime dependencies under
@dyrected/core/serverto prevent Node core modules (fs,worker_threads,stream) and Pino from leaking into frontend client bundles. - Added browser fallback module configurations for Next.js (
withDyrected) and Nuxt module Vite build hooks to ensure clean client component compilation across Turbopack and Vite. (@dyrected/core,@dyrected/next,@dyrected/nuxt)
- Isolated server observability and logger runtime dependencies under
v2.7.0
-
Add controlled admin theme support so host apps can drive the admin theme and receive theme changes back through the public admin API. This also fixes the admin theme provider initialization so it does not access refs during render. (
@dyrected/admin) -
- Added dark mode SVG logo asset and theme-aware fallback rendering in
admin-shell - Migrated Nuxt example component config access to
useRuntimeConfig - Transitioned default live preview mode to
postMessageacross prompt templates, skills, documentation, and recipes - Updated Dyrected configuration, environment integration, and content modeling rules for rich text and tabbed admin layouts
- Modularized and consolidated prompt generation logic, AI rules, and shared rule templates (
@dyrected/admin,dyrected)
- Added dark mode SVG logo asset and theme-aware fallback rendering in
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
@dyrected/next) -
@dyrected/[email protected] (
@dyrected/next)
v2.6.4
-
Improve admin safety and auth onboarding across admin, core, and SDK.
- add a professional invite dialog in admin with copyable invite URLs and role selection for new invites
- support invite acceptance directly from admin invite links
- pre-create pending invited users in auth collections so they appear in admin lists before acceptance
- let invite and reset emails use clickable URLs with stronger email-client-safe HTML and visible link fallbacks
- expand dashboard "Needs attention" checks with backend health and invite-related signals
- replace browser delete alerts with admin dialogs, including typed confirmation before deleting auth users (
@dyrected/admin,@dyrected/core,@dyrected/sdk)
-
Add Cloud-safe declarative hooks, broader declarative-expression validation, and clearer config diagnostics across core, admin, Nuxt, SDK, and CLI.
- add declarative string hook support for collection/global
beforeRead,afterRead, andbeforeChange, fieldbeforeChange, and fieldadmin.hooks.onChange - preserve supported declarative hook strings during
sync:schema, strip function hooks from Cloud payloads intentionally, and warn with exact schema paths - validate declarative access rules, string access policies, declarative hooks,
admin.condition, andadmin.previewUrlearly with exact config paths and cleaner diagnostics - expose config diagnostics from
/api/schemasso admin surfaces can consume them, and improve admin dashboard attention signals around config issues - improve Nuxt startup and reload reporting for invalid declarative config with formatted diagnostics instead of noisy raw errors
- document the Cloud-safe access and hooks model more clearly, including synced string policies,
createdByCurrentUservsisOwner, declarative hook contexts, and short notes about early validation for access, hooks, preview, andadmin.condition
- add declarative string hook support for collection/global
v2.6.3
-
Polish the admin editing experience with better loading and layout behavior.
- replace branded and text-only loading states with skeleton loaders across bootstrap, collections, globals, dashboard, and media views
- add professional not-found states for missing collections, globals, routes, and missing edit entries after loading resolves
- keep the desktop sidebar pinned to the viewport while the main content scrolls independently
- remove the nested media-page scroll container so the page uses a single parent scroll area
- debounce admin list and media search while keeping existing results mounted so only the results region refreshes during server-side search
- add a draggable desktop split view for resizing the live preview and form editor on collection edit pages
- make rich text editor prose respect dark mode typography tokens
- use configured global
admin.iconvalues in the global edit header - @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/admin)
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
dyrected,@dyrected/next) -
@dyrected/[email protected] (
@dyrected/next)
v2.6.2
-
Add controlled theme props to
DyrectedAdminacross the admin and framework wrappers:themesets the preferred admin theme tosystem,light, ordark.systemThemesupplies the currently resolved system theme for React and Next hosts.onThemeChangelets embedded admin theme controls update host-managed theme state in React and Next.- Nuxt and Vue wrappers expose the same controlled theme surface through
theme,system-theme, andon-theme-change.
This makes it possible for host apps to keep one shared dark and light mode preference while the embedded admin stays in sync.
-
Dogfood the public admin controller APIs inside the built-in UI:
- Move
MediaLibraryDialogontouseMediaLibraryfor internal library loading, paging, and selection state. - Use the public field/form APIs inside the built-in form renderer so nested field state flows through
useFieldanduseDyrectedForm. - Replace manual nested path string building in array, block, form, and nested-editor internals with the exported path helpers.
- Align internal nested field targeting with full field paths, improving consistency with the public custom-field contract. (
@dyrected/admin)
- Move
-
Implemented the framework-level public API first, which was the right prerequisite for docs. Added a framework-level public API across the admin, React, and Vue packages.
@dyrected/adminnow ships a side-effect-free public entrypoint for controllers, helpers, and React admin primitives, without pulling in the admin app entry or its CSS.@dyrected/reactnow exposes the intended top-level admin and media hooks, and re-exports the form, field, and theme React APIs from the admin public surface.@dyrected/vuenow exposes first-class composables for admin schemas, media flows, forms, fields, and theming, and includes a Vue module shim so plain TypeScript validation works. (@dyrected/admin,@dyrected/react,@dyrected/vue)
-
Add a reusable public form and field API foundation to
@dyrected/admin:- Introduce framework-agnostic form and field controllers:
createDyrectedFormControllercreateDyrectedFieldController
- Add React adapters for the shared controller layer:
DyrectedFormProviderDyrectedFieldPathProvideruseDyrectedFormuseField
- Publish custom field component prop/context types so host apps can build
admin.componentfield overrides against a stable contract. - Export form utility helpers (
buildSchemaShape,buildDefaultValues,getFlatErrors,formatPath,resolveContainerPath) for advanced custom form surfaces. - Keep the existing admin form engine on
react-hook-forminternally while syncing its state into the shared controller layer so public consumers and built-in forms use the same source of truth. (@dyrected/admin)
- Introduce framework-agnostic form and field controllers:
-
Add a reusable public media API foundation to
@dyrected/admin:- Introduce framework-agnostic media controllers for uploads, URL imports, and media library state:
createMediaUploadControllercreateMediaURLControllercreateMediaLibraryController
- Refactor the React media hooks to become adapters over the shared controller layer:
useMediaUploaduseMediaURLuseMediaLibrary
- Keep
useAddMediaFromUrlas a backward-compatible alias while shifting the preferred public naming touseMediaURL. - Export the new media controllers, React hooks, and supporting media utilities from
@dyrected/adminso host apps can build custom media interfaces without reimplementing ingestion logic. - Preserve the existing admin media experience by keeping
MediaLibraryDialog,MediaPicker, andMediaPageon the same controller-backed upload and URL import pipeline. (@dyrected/admin)
- Introduce framework-agnostic media controllers for uploads, URL imports, and media library state:
-
Extend the public admin API with theme controller support and field-path ergonomics:
- Introduce
createAdminThemeControlleras a framework-agnostic theme state foundation for React, Vue, and other host apps. - Export the public React theme adapter surface:
AdminThemeProviderAdminThemedRootuseAdminTheme
- Export pure theme helpers:
resolveAdminThemeadminThemeClassNamegetSystemAdminTheme
- Add higher-level nested field path helpers for custom field authors:
normalizeFieldPathgetFieldPathSegmentsjoinFieldPathgetParentFieldPath
- Extend
useFieldwith object/array convenience helpers so nested custom fields can work with child and item paths without hand-building dot-path strings. - Document the controller-first public API pattern in
packages/admin/docs/public-controller-pattern.md. (@dyrected/admin)
- Introduce
-
Refine workflow action behavior in the admin collection editor:
- Prefer
Save draftas the primary workflow button when an entry is currently in a published workflow state. - Keep unpublish-style workflow transitions out of the primary button and available from the workflow dropdown instead.
- Preserve normal forward workflow transitions as the primary action for non-published entries.
- Remove the workflow comment dialog's effect-based local state reset to satisfy React Hooks lint rules without changing the required-comment flow. (
@dyrected/admin)
- Prefer
-
Overhaul media library upload experience with a unified media ingestion pipeline and non-technical storage notices:
- Add multi-file drag-and-drop dropzone with live byte-level upload progress queue in
MediaLibraryDialog. - Unify file ingestion across
MediaLibraryDialog,MediaPicker, andMediaPageusinguseMediaUpload. - Add client-side Canvas API image compression (
compressImage) capping long edges to 2048px before network transfer. - Add safe upload collection resolution (
resolveActiveMediaCollection) falling back to"media"for non-upload collections. - Optimize URL media import pipeline with 0-byte bandwidth transfer for YouTube/Vimeo embeds and direct remote video CDN links, with client-side fetch and CORS fallbacks for direct images.
- Add semantic source classification and visual badges (
getMediaSourceInfo) for internal vs external media items across grid, list, and detail views. - Add non-technical, user-friendly
StorageNotConfiguredNoticebanner onMediaPageandMediaLibraryDialogwhen media storage is not configured. - Add "Media storage is not set up" alert item to the Dashboard "Needs attention" section when an upload collection exists without a configured storage provider.
- Catch
Storage not configurederrors gracefully across upload forms and format them into clear instructions asking the user to contact their developer. (@dyrected/admin)
- Add multi-file drag-and-drop dropzone with live byte-level upload progress queue in
-
Rewrite the public API docs around end-user goals instead of internal architecture.
- Rework the overview for hooks and composables so it starts from the jobs developers are trying to get done, such as media uploads, media picking, document editing, custom fields, and theme-aware shells.
- Add focused documentation pages for media, form and field, and theme APIs in
apps/docs, with practical guidance for custom components, dashboards, and host apps rather than framing them only as admin internals. - Keep the lower-level controller layer documented only as supporting context, while steering most readers toward the public React hooks in
@dyrected/reactand Vue composables in@dyrected/vue. - @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/admin)
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
dyrected) -
Rewrite the public API docs around end-user goals instead of internal architecture.
- Rework the overview for hooks and composables so it starts from the jobs developers are trying to get done, such as media uploads, media picking, document editing, custom fields, and theme-aware shells.
- Add focused documentation pages for media, form and field, and theme APIs in
apps/docs, with practical guidance for custom components, dashboards, and host apps rather than framing them only as admin internals. - Keep the lower-level controller layer documented only as supporting context, while steering most readers toward the public React hooks in
@dyrected/reactand Vue composables in@dyrected/vue. (@dyrected/react,@dyrected/vue)
v2.6.1
-
Improve workflow editing UX in the Admin for workflow-enabled and
drafts: truecollections. Editors now get faster transition actions in the entry header and list view, clearer live-vs-draft status messaging, desktop labels for header action buttons, and a manual "save draft" fallback alongside workflow transitions.Add workflow-aware draft autosave config to collection admin options with
admin.autosaveandadmin.autosaveDelayMs. Workflow-enabled collections now default to autosaving draft revisions without changing the published snapshot, while projects can still disable autosave per collection when they need explicit manual saves. (@dyrected/admin,@dyrected/core)
v2.6.0
-
Add typed collection search config and backend-powered admin search across core, admin, and SDK.
Improve admin document titles and list cell rendering for relationship, object, and array values, including nested relation title chains and nested field
admin.useAsTitle.Add join-field admin actions to show or hide
Create newandView all, withView allopening the related collection list pre-filtered by the join relationship. (@dyrected/admin,@dyrected/core,@dyrected/sdk)
v2.5.65
-
- Keep the edit-form change-password section inside the default tab when a collection has multiple tabs.
- Populate nested join fields when the requested depth budget allows it, while leaving them unpopulated when depth is exhausted.
- Reuse a shared Postgres client per connection URL so repeated adapter construction in dev servers does not exhaust database connections. (
@dyrected/admin,@dyrected/core,@dyrected/db-postgres)
v2.5.64
-
@dyrected/[email protected]
-
@dyrected/[email protected]
-
Add a dedicated
@dyrected/next/serverexport for App Router route files and other server-only helpers so Next server code does not pull the client React entrypoints from the package root.- @dyrected/[email protected]
- @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/next)
-
@dyrected/[email protected] (
@dyrected/nuxt,@dyrected/react,@dyrected/vue) -
@dyrected/[email protected] (
@dyrected/nuxt)
v2.5.63
-
Fix workflow and draft handling across the admin UI and core collection APIs.
- stop showing the admin publishing status column for collections that only define a user
statusfield - show workflow state labels and colors consistently in admin list and edit views
- return published workflow documents correctly in public reads, including legacy entries without a materialized published snapshot
- materialize workflow metadata on update responses so the admin can keep draft and transition state in sync
- improve the example auth roles setup and docs so custom auth
rolesfields use the expected array-backed shape (@dyrected/admin,@dyrected/core)
- stop showing the admin publishing status column for collections that only define a user
v2.5.62
-
Use server-backed logout and clear revoked stored admin sessions
The admin provider still treated logout as a purely client-side action after Dyrected auth moved to revocable server-backed sessions. Logging out from the admin cleared local storage, but it did not call the server logout route, so the current session stayed valid until expiry. The provider also kept dead tokens in local storage when bootstrapping
me()failed, which caused repeated failed auth requests on reload after a session had already been revoked.The admin provider now calls the collection logout route before clearing local state, so admin logout actually revokes the current session. It also clears persisted auth state only on real stale-auth failures during bootstrap (
401/404), so revoked or invalid stored sessions are cleaned up automatically without treating unrelated network errors as a logout. (@dyrected/admin) -
Fix token-mode live preview never showing the draft
In
previewMode: "token", the preview pane minted a valid token but discarded it before it reached the iframe, so the frame kept loading published content and never reflected edits. The mint effect depended on thedataobject, so it re-ran on every parent render; its cleanup cancelled the in-flight mint, and theif (cancelled) returnguard then skipped applying the token. The constant re-runs also cleared the debounce timer, so minting eventually stopped firing on edits.The effect now depends on a stable serialized key of the draft instead of the object, so it only re-runs on a real edit — cancellation now means "the draft changed again," and a successful mint is applied to the iframe as intended. (
@dyrected/admin) -
Type the SDK client and framework hooks against your generated schema automatically
Previously the framework hooks were loosely typed: React's client came through context as
DyrectedClient<BaseSchema>, and the Vue composables took an untypedcollection: stringwith a hand-annotated<T = any>result. You got no slug autocomplete and no document types unless you passed a generic at every call site.Now
dyrected generate:typesemits a module augmentation that registers your schema globally:// dyrected-types.ts (generated) declare module "@dyrected/sdk" { interface Register { schema: DyrectedSchema; } }Once that generated file is part of your compilation, the SDK client and every framework hook (React, Vue, and Nuxt via auto-import) are typed against your schema with no per-call generics:
// Vue const { docs } = useDyrectedCollection("posts"); // "posts" autocompleted, docs: Post[] // React const { client } = useDyrected(); const { docs } = await client.collection("posts").find().exec(); // typedThe mechanism is a new
Registerseam in@dyrected/sdk;DyrectedClientandcreateClientnow default their schema type parameter to the registered schema, falling back toBaseSchemauntil the generated types are present. Existing code that passed an explicit schema generic is unchanged.Note for Vue:
useDyrected,useDyrectedCollection, anduseDyrectedGlobalnow take a collection/global slug as their first type parameter. To override the inferred document type, pass both —useDyrectedCollection<"posts", CustomPost>("posts").Generated types now land in your app's source directory.
generate:types(andsync:schema) writedyrected-types.tsintosrc/(Vite/Next) orapp/(Nuxt) instead of the project root. This is required for the schema augmentation to take effect: TypeScript only applies adeclare moduleaugmentation when the file is inside the program'sincludeglobs, and adyrected-types.tsat a Nuxt project root is silently ignored. Yourdyrected.config.tsstays at the project root. Pass--outputto override the location.Generator correctness fixes:
- Auth collections no longer emit a duplicate
rolesproperty. When your collection declares its ownrolesfield (e.g. aselect/radiowith options), that definition wins — you get the enum union"admin" | "editor" | "viewer"instead of a conflicting secondroles?: string[]declaration (which was a TypeScript error). multiSelectfields now generate an array of the option literals —("admin" | "editor")[]— instead of a loosestring[], so multi-valued fields likerolesstay typed as their allowed values.- The SDK's schema-generic constraint was loosened to a
SchemaShapebound so a generatedDyrectedSchema(built from namedinterfaces, which lack an implicit index signature) satisfies it. Previously the augmentation silently fell back toBaseSchema.
The Nuxt composables (
useDyrectedDoc,useDyrectedCollection,useDyrectedGlobal) now return a properly typedAsyncData<...>instead ofany— theirdatais typed as your document/global shape — and are constrained to your schema's slugs. (dyrected,@dyrected/react,@dyrected/sdk,@dyrected/vue) - Auth collections no longer emit a duplicate
-
Add built-in API rate limiting, proxy-aware client IP resolution, and revocable auth sessions
Dyrected auth and request protection were missing three production layers that Payload already treats as part of the core server contract: app-level request throttling, correct client-IP handling behind proxies, and a way to revoke JWT sessions immediately instead of waiting for expiry.
createDyrectedAppnow mounts an in-process API rate limiter with Payload-style defaults for/apiroutes, including configurablemax,window,paths,skip, andtrustProxyoptions. Client IP resolution now understands common provider headers and trustedX-Forwarded-Forchains so production deployments behind a reverse proxy count the right caller instead of the proxy hop.Auth collections also move from purely stateless login tokens to JWTs backed by hidden
__auth_sessionsrecords. New tokens carry a session id, auth middleware validates that the backing session is still active, logout can revoke the current session immediately,?allSessions=truecan revoke every session for the account, and password reset / password change now invalidate active sessions as a security boundary. Refreshing a token keeps the same underlying session instead of creating a second one silently.The docs and OpenAPI surface were updated to match the new behavior, especially around built-in rate limiting, trusted proxy setup, logout semantics, and session revocation. (
@dyrected/core) -
Point package-distributed documentation references at the canonical
/docstreeThe docs site no longer maintains a separate
/new-docscontent tree and route. The new authored docs set now lives directly under the canonical/docspath, and the knowledge generator, published references, and package JSDoc links were updated to match.For
@dyrected/core, this updates JSDoc@seelinks so generated API references and editor tooling point at the current docs URLs instead of the removed/new-docspaths.For
@dyrected/knowledge, this refreshes generated references, prompt artifacts, LLM indexes, and skill outputs so published knowledge bundles link to the canonical docs paths and no longer depend on removed legacy recipe/reference pages. (@dyrected/core) -
Add
definePublishingWorkflowto map your own role names onto the publishing workflowpublishingWorkflow()hardcoded the role nameseditor,publisher, andadmin, so a project whose roles are named differently (e.g.writer,managing-editor) got no capabilities and couldn't move documents through the flow.definePublishingWorkflow({ editors, publishers })builds the samedraft → in review → publishedworkflow but maps your role values onto its two capability tiers —editorsmay edit and submit,publishersmay also publish and unpublish.publishingWorkflow()is now a shorthand fordefinePublishingWorkflow()with the conventional defaults, so existing usage is unchanged.workflow: definePublishingWorkflow({ editors: ["writer"], publishers: ["managing-editor", "admin"], }); ``` (`@dyrected/core`) -
Fix
drafts: truedocuments disappearing from the Admin listThe publishing workflow synthesized from
drafts: true(simplePublishingWorkflow) defined no role→capability mappings, socanViewWorkflowDraftreturnedfalsefor everyone — including admins and editors. Every draft document was then filtered out of collection reads, leaving the Admin list empty.canViewWorkflowDraftnow treats a workflow with noroles(thedrafts: truecase) as ungated: any authenticated user can view drafts, so they show up in the Admin regardless of what a project names its roles. Unauthenticated/public readers still only ever see published content, so drafts never leak to the live site. Workflows that define explicitroleskeep their existing capability-based gating. (@dyrected/core) -
Add Payload-style logger config and first-class observability to Dyrected core
Dyrected now supports a root
loggerconfig shaped like Payload's Pino-based logger surface, plus a new top-levelobservabilityconfig for request logging, redaction, sampling, tracing, metrics, and Dyrected-managed transports.Request logging is now structured instead of ad hoc string output. Successful requests are sampled,
4xxrequests log atwarn,5xxrequests log aterror, and request ids, site/workspace ids, and trace correlation fields are included when available.Body logging is opt-in and bounded. Dyrected only attempts to capture JSON request bodies, redacts common secret fields and headers before logging, truncates oversized payloads, and falls back to metadata-only logging when a body cannot be parsed safely after capture.
Core services and request paths now use structured logger helpers instead of direct
console.*calls. This includes auth, audit-failure reporting, email delivery failures, router warnings, workflow hook isolation, and request error handling.OpenTelemetry tracing and metrics are now available behind explicit config. Dyrected can create request spans, emit request and failure metrics, export telemetry through OTLP, and expose a Prometheus scrape route only when configured. Audit logging remains a separate feature and is not merged with runtime observability. (
@dyrected/core)
v2.5.61
-
Admin: brand accent color, wired page metadata, and list export
- Add
admin.branding.accentColor— a second brand color for links, navigation accents, and focus rings (mapped to the--intelligencetoken) alongsideprimaryColor. Branding colors now also apply correctly in dark mode. - Wire
admin.meta.titleSuffixinto the browser tab title (it now reflects the current page and updates on navigation) andadmin.branding.faviconinto the page favicon. Both restore the host page's title/icon when the embedded admin unmounts. - Add an Export Selected bulk action on collection lists (export just the selected rows to CSV), and quote/escape CSV export values per RFC 4180 so values containing commas, quotes, or newlines no longer break columns.
Breaking (shipped as patch): removed the no-op
basenameprop fromAdminUIPropsand the@dyrected/vue/@dyrected/nuxtwrappers, and stopped the CLI from scaffolding it. The admin routes internally with a hash router, so the panel's location is determined by the route of the page you render it in. If your app passesbasename, remove it — it had no effect. - Add
-
Fix audit log and drafts/workflow panels not appearing in the Admin
Three related fixes so
audit: trueanddrafts: truesurface their Admin UI as intended:- Audit log button never showed. The
/api/schemasresponse hand-serialized each collection and omitted theauditanddraftsflags, so the Admin'sschema.auditwas alwaysundefinedand the audit-history button never rendered regardless of config. Both flags are now included in the serialized schema. - Workflow/version panel hidden for existing documents. Setting
drafts: truesynthesizes a publishing workflow vianormalizeConfig, but the panel only appears when a document carries__workflowmetadata — which documents created before the workflow existed (e.g. seeded content) don't have.materializeWorkflowDocumentnow treats such legacy documents as already-published live content: it surfaces them with the workflow's published state (keeping them visible to the public) so the workflow panel appears. New documents are unaffected. - Live/Draft badge missing on workflow collections. The header publishing badge only rendered for collections without a workflow, and read the raw
statusfield. It now derives from the workflow state when a workflow is present (a state flaggedpublishedshows "Live", otherwise "Draft"), so collections usingdrafts: true— including ones with nostatusfield — show the correct badge. (@dyrected/admin,@dyrected/core)
- Audit log button never showed. The
-
Server-side (token) live preview now works end to end
previewMode: "token"was previously a config value with backend endpoints but no admin integration. It's now wired up for server-rendered and statically generated frontends that can't receivepostMessage.@dyrected/admin: intokenmode the live-preview pane mints a short-lived token from the current draft (debounced) and loads the frontend iframe atpreviewUrl?dyPreview=<token>, reloading on change. Click-to-edit and live-as-you-type remainpostMessage-only.@dyrected/sdk: newcreatePreviewToken({ collectionSlug, documentId?, data })to mint a token, plusgetPreviewToken(search)andPREVIEW_TOKEN_PARAMhelpers for reading thedyPreviewtoken from a request's query string.@dyrected/reactand@dyrected/vuere-export the helpers;@dyrected/nuxtauto-importsgetPreviewToken.@dyrected/core: the server now logs a startup warning whenDYRECTED_JWT_SECRETis unset, since token-mode preview signs with it.
Token mode is refresh-based (a mint + iframe reload per change) and embeds the draft in the signed token — see the Live Preview → Server-side docs for the security notes (set
DYRECTED_JWT_SECRET) and the large-document URL-length caveat. -
Vue bridge shares the host app context, CLI sync respects DYRECTED_URL
@dyrected/vue: custom Vue components in the admin (custom field inputs and dashboard/list slots) now share the host app's context instead of each mounting an isolated Vue app. They can use the host app's plugins,provide/inject, Pinia, and i18n, and many custom components no longer spin up one full Vue app per instance.dyrected(CLI):sync:schemanow honorsDYRECTED_URL(and theNEXT_PUBLIC_/NUXT_PUBLIC_/VITE_variants) from your environment. Previously the--urloption's hardcoded default masked the env fallback, so it always synced to Dyrected Cloud regardless of your configured URL.@dyrected/admin: fix the admin browser-title helper resolving a collection's label — it read a non-existentcollection.label(collections uselabels.singular/labels.plural), which broke the package build. Also corrected the misleadingAdminComponentsJSDoc (fieldsis keyed by the field'sadmin.componentstring, not field type;collectionListinjects list slots rather than replacing the list view). (@dyrected/admin,dyrected,@dyrected/vue)
v2.5.60
-
Improve dynamic select options, frontend rendering components, and field ergonomics.
- Server-side search for dynamic
select/multiSelectoptions. The Admin now forwards the editor's typed query to the options resolver asreq.query.search(debounced) and renders whatever the resolver returns, instead of loading the entire list into the browser and filtering client-side. Push the filter into your query (where: { name: { contains: search } }, cappedlimit) so large and growing lists stay fast. Previously-typed results are kept visible while the next page loads. - Cached option resolvers.
optionsobjects that setcacheTTL(seconds) are now actually cached on the server, keyed by field, query parameters, and requesting user, and reused until the TTL elapses. The value was previously accepted but ignored. DyrectedRichTextcomponent added to@dyrected/reactand@dyrected/vue, re-exported from@dyrected/next, and auto-imported in@dyrected/nuxt. It renders the HTML string arichTextfield stores.DyrectedIconis now re-exported from@dyrected/next— Next.js apps no longer need to import it from@dyrected/react.- Nuxt renders images with
<NuxtImg>.DyrectedImageis now registered as an auto-imported component, and both it and the image branch ofDyrectedMediause@nuxt/image, which the module installs automatically. RichTextFieldnow types its value asstring(an HTML string) rather thanRecord<string, unknown>, matching what the editor stores.UrlFieldvalue type widened tostring | UrlLinkValueto reflect the structured link object it returns.- Number fields accept advisory
min/max, surfaced to editors and client tooling (not enforced as server-side validation), mirroringmaxLength. defineTabhelper groups a set of fields under a shared Admin tab label.- Auth collections re-assert
email/passwordintegrity. A developer-definedemailfield can no longer silently drop the injectedunique/requiredconstraints. - Relationship read depth defaults to
1across the REST controllers, matching the SDK. - Field type reference contracts now carry per-type descriptions, and the
checkbox/group/upload/radio-groupfield docs pages were renamed toboolean/object/image/radioto match their helper names.
- Server-side search for dynamic
-
Fix DatePicker click bug, revert react-day-picker to v8, and fix focus warnings.
- Fixed DatePicker closing prematurely. Intercept
pointerdownevents instead ofmousedownon the wrapper, preventing the picker from instantly closing on click due to React event phase mismatches. - Downgraded
react-day-pickerto v8. Version 9 introduced breaking DOM/CSS structure that conflicted with our existing styling. Downgrading to the highly stable v8 restores standard navigation button interactions and styling. - Fixed
aria-hiddenfocus retention warning. Replacedaria-hiddenwith the moderninertattribute on the closed calendar wrapper, forcing the browser to safely drop keyboard focus and satisfy screen reader constraints when the picker closes. (@dyrected/admin)
- Fixed DatePicker closing prematurely. Intercept
v2.5.59
-
Fix server-side field access evaluation so field rules receive the current document
idduring API reads and updates, matching admin behavior and preventing!id-style rules from silently allowing protected field changes.Improve the public access-control type surface by allowing
AccessFunctionArgs,AccessFunction,AccessRule,AccessPolicyResolver,DyrectedConfig, anddefineConfigto carry a custom authenticated-user type for deployments that extend the default user claims.Align the access-control overview docs with runtime behavior by documenting that field access is enforced by both the API and the admin panel.
I improved dyrected upgrade in packages/cli/src/commands/upgrade.t It now:
- resolves the actual published version for each @dyrected/* package with
npm view <pkg> version - installs explicit versions instead of relying on @latest
- upgrades dependencies and devDependencies separately
- uses exact-version installs (--save-exact / --exact)
- verifies both package.json and node_modules after install
- fails loudly if the installed result is still stale (
dyrected,@dyrected/core)
- resolves the actual published version for each @dyrected/* package with
v2.5.58
-
Add a production-ready access control model that supports booleans, Jexl strings, direct self-hosted functions, and named policies across collections, globals, and field access.
Introduce top-level
accessPoliciesresolution in core, enforce collection/global/field access on the server, and preserve object-based Jexl filter results for row-level access constraints.Make Cloud schema sync safe by stripping function-based access rules from synced payloads, preserving only booleans, Jexl strings, and named policies, with clear warnings for unsupported rules.
Harden the admin hooks sandbox message listener so it only accepts messages from the expected iframe source. (
@dyrected/admin,dyrected,@dyrected/core)
v2.5.57
-
Centralize preview URL resolution into a shared admin utility and standardize project initialization with updated defaults and enhanced schema configuration. (
@dyrected/admin,dyrected) -
Add type-safe field builder helpers and related updates.
- Add
defineField,defineBlock, and a dedicateddefine<Type>Fieldhelper for every field type (defineTextField,defineRichTextField,defineRelationshipField, …) to@dyrected/core. Each is an identity helper that injects the fieldtypeand preserves full document-shape inference throughdefineCollection/defineGlobal. - Add configurable
featuresandheadingLevelsto rich-text fields. The Admin rich-text editor now enables only the configured toolbar controls and editor capabilities (disabling a feature also removes its keyboard shortcut and paste handling). - Migrate documentation examples, the
dyrected initscaffold, and the@dyrected/knowledgerecipes and prompt templates to use the newdefine*Fieldhelpers. - Rename the
JWT_SECRETenvironment variable toDYRECTED_JWT_SECRET— update your.envaccordingly. - Filter unpublished documents out of public read responses. (
@dyrected/admin,dyrected,@dyrected/core,@dyrected/nuxt)
- Add
v2.5.56
- Render single-field arrays as a flat, reorderable list instead of accordion cards, with the label shown once and per-row actions (duplicate, move, delete) in an overflow menu. Add a
hideLabeladmin option to suppress a field's label where it would be redundant. Hide the admin's own mobile header when embedded so the host dashboard renders a single top bar, driven via adyrected:toggle-menuwindow event. Fix the mobile nav drawer closing immediately after opening (the close-on-navigation effect depended on the open state and re-triggered itself); it now closes only when the route changes. Refresh the dashboard update-check cache on a TTL so the banner reflects newly published versions instead of freezing on the first value seen. (@dyrected/admin,@dyrected/core)
v2.5.55
-
Improve table cell rendering with default string truncation, protect primary title columns from shrinking, enlarge row actions layout, and resolve local origin preview overrides for development.
- @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/admin)
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
dyrected,@dyrected/next) -
@dyrected/[email protected] (
@dyrected/next)
v2.5.54
-
feat: visual and functional enhancements to the Admin UI
- Filenames: Added a
getDisplayFilenameutility that strips directory path prefixes (e.g.dyrected_cloud/...) to show clean filenames in list views, media cards, and detail dialog inputs. - Collection Icons: Resolved custom collection icons (
schema.admin?.icon) on list page headers, falling back dynamically toUsersorDatabase. - Data Table Layout: Upgraded the
DataTablevisual presentation (borders, rounded corners, row heights, and backgrounds) to align with the media library's clean design aesthetics. - Field Labels: Updated
DataTablesearch placeholders and View Settings column checklists to render human-readable field labels instead of raw database keys. - Build Cleanups: Suppressed Rollup
MODULE_LEVEL_DIRECTIVEand sourcemap warnings for clean Vite/Nuxt client builds. - @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/admin)
- Filenames: Added a
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
dyrected) -
feat: visual and functional enhancements to the Admin UI
- Filenames: Added a
getDisplayFilenameutility that strips directory path prefixes (e.g.dyrected_cloud/...) to show clean filenames in list views, media cards, and detail dialog inputs. - Collection Icons: Resolved custom collection icons (
schema.admin?.icon) on list page headers, falling back dynamically toUsersorDatabase. - Data Table Layout: Upgraded the
DataTablevisual presentation (borders, rounded corners, row heights, and backgrounds) to align with the media library's clean design aesthetics. - Field Labels: Updated
DataTablesearch placeholders and View Settings column checklists to render human-readable field labels instead of raw database keys. - Build Cleanups: Suppressed Rollup
MODULE_LEVEL_DIRECTIVEand sourcemap warnings for clean Vite/Nuxt client builds. (@dyrected/nuxt)
- Filenames: Added a
-
feat: add
DyrectedIconcomponent for renderingiconfield valuesThe
iconfield type stores a Lucide icon name (e.g."ChartNoAxesCombined"), not SVG markup. The newDyrectedIconcomponent resolves that name to the matching Lucide icon soiconfield values can be rendered directly:@dyrected/react—<DyrectedIcon name={feature.icon} className="w-6 h-6" />(backed bylucide-react)@dyrected/vue—<DyrectedIcon :name="feature.icon" class="w-6 h-6" />(backed bylucide-vue-next)@dyrected/nuxt— auto-imported as<DyrectedIcon>(no import required)
All standard Lucide props (
size,color,strokeWidth,class/className, …) are forwarded, plus an optionalfallbackicon name. Integration docs now document the component and include a full per-framework component reference. (@dyrected/nuxt,@dyrected/react,@dyrected/vue)
v2.5.53
-
Expose the field-type contracts as public types.
Block,BlockVariant,TypedField,FieldBase, the per-field admin option types (BaseFieldAdmin,TextFieldAdmin,TextareaFieldAdmin,EmailFieldAdmin,UrlFieldAdmin,IconFieldAdmin,SelectFieldAdmin,RadioFieldAdmin,BooleanFieldAdmin,MultiSelectFieldAdmin,CharacterLimitFieldAdmin,WordLimitFieldAdmin), and the field hook shapes (FieldHooks,FieldAdminHooks) are now exported from@dyrected/core. This lets consumers and generated documentation reference the full field type surface directly. Purely additive — no runtime or existing-type changes. (@dyrected/core) -
@dyrected/[email protected] (
@dyrected/react,@dyrected/vue) -
@dyrected/[email protected] (
@dyrected/react,@dyrected/vue)
v2.5.52
-
Block icons & variants, a cleaner admin loading state, dark-mode text fix, and OpenAPI/Swagger fixes.
Block schema (
@dyrected/core)Blocknow supportsicon(a LucideAdminIconName) anddescription(a one-line summary), shown on block cards and in the block library.- New
Block.variants(BlockVariant[]) — presentation variants over a shared field set. The chosen variant is stored on each block row under the reservedvariantkey and passed to the render component as avariantprop. Switching variant preserves the author's content.
Admin (
@dyrected/admin)- Redesigned block cards to match the visual editor: drag handle, icon tile, title, and a description/variant subtitle, with an accent selected state; duplicate/delete reveal on hover.
- Added an in-block variant switcher (drill-in and inline modes) that writes the
variantkey and updates the live preview immediately; new blocks default to the first variant, and older rows backfill a variant on load. - Click-to-edit / error-summary navigation now switches to the tab that owns the target block, so drilling into a field on a non-active tab actually mounts its sub-form (previously showed only the breadcrumb).
- Dark-mode fix: the admin root now applies a base
color/backgroundfrom the theme tokens, so raw inputs, ghost/outline buttons, and plain text are legible in dark mode instead of falling back to black. - Cleaner bootstrap: a single branded
AdminSplashreplaces the mismatched "Loading Dashboard…" / "Authenticating…" screens across initial mount and auth resolution (embedded and standalone), so cold load reads as one continuous step. - The setup screen now links to the backend's interactive API reference (Swagger) at
/api/docs. - URL-driven nested navigation: the active form tab (
?tab=) and the block drill-in trail (?block=) now live in the URL. Drilling into a block pushes a history entry, so the browser/mobile back button steps back out of a block to its list; tab switches replace (no history spam); deep links and refreshes restore the drilled-in view. (EmbeddedHashRoutermode; the standalone iframe'sMemoryRouterkeeps the in-app breadcrumb.) - Redesigned tabs: compact underline tabs pinned at the top, horizontally scrollable on mobile, replacing the pill tab bar and the mobile accordion — one consistent pattern across breakpoints.
- Mobile: the edit page can toggle between the form and the live preview (single-pane) via an action-rail switch.
Render packages (
@dyrected/react,@dyrected/vue)BlocksItemnow types the optionalvariantfield; it already flows to block components via prop spreading.
Backend (
@dyrected/core)- Swagger UI now resolves its OpenAPI spec relative to the docs page, so
/api/docsworks when the app is mounted under a prefix (e.g. a NuxtapiBase: "/dyrected") instead of 404-ing on an absolute/api/openapi.json. (@dyrected/admin,@dyrected/core,@dyrected/react,@dyrected/vue)
-
Nested block editor, live-preview click-to-edit, and a redesigned edit page.
Admin
- Redesigned the collection edit page: live preview on the left, form on the right, with a vertical action rail (Save, New, Preview, Workflow, View, Reset, Info) replacing the horizontal header icon cluster.
- Nested block/array/object editing via drill-in navigation with breadcrumbs, backed by a new
NestedEditorContextwith stable-id path tracking (survives reorder/delete) and a sharedresolveContainerPathutility. - Live-preview click-to-edit: clicking an annotated element in the preview iframe drills into the owning block and focuses the exact field. The global error summary now also drills in before scrolling.
- Drill-in (nested form) is only used when live-preview mode is on; otherwise blocks render inline as a flat form.
array/objectdrill-in is opt-in viaadmin.drillIn. - The nav sidebar auto-collapses while live preview is open and restores afterwards.
- Document metadata moved into an Info popover on the rail; the workflow panel is an independent rail toggle; fields without an
admin.tabare grouped into a tab named after the collection's singular label; the block library modal is now reliably scrollable. - Added a scalar
usePreferencehook.
Site packages (
@dyrected/vue,@dyrected/react,@dyrected/nuxt,@dyrected/next)- New
Blockscomponent plususeDyPath/provideDyPath(DyPathProviderin React,DyPathScopein Vue) for low-effortdata-dy-pathannotation — authors pass only a field name and the ancestor supplies the base path. useLivePreviewnow supports edit mode: ondyrected-enter-edit-modeit highlights and captures clicks on[data-dy-path]elements (via document-level event delegation) and reports them to the admin.- Nuxt module auto-imports
useDyPath/provideDyPathand registers theDyrectedBlockscomponent. @dyrected/nextre-exportsBlocks,DyPathProvider, anduseDyPathso Next.js apps import everything from one package.
-
Upload MIME/size validation and add-media-from-URL.
Core (
@dyrected/core)- New
upload-validationutility:isMimeAllowed(supports*,type/*, and exacttype/subtypepatterns, case-insensitive) and payload validation that returns a typed error with the correct HTTP status (415 Unsupported Media Typeor413 Payload Too Large). - The media controller enforces a collection's
uploadconfig (allowedMimeTypes,maxFileSize) on upload and accepts external media references.
Admin (
@dyrected/admin)- Add media from a URL:
external-mediabuilder +useAddMediaFromUrlhook detect YouTube/Vimeo videos, direct image URLs, and generic files, and store them as reference-only media records (no file bytes). The media grid and preview components key off the resultingmimeType(video/youtube,video/vimeo,image/external, …) to render each asset correctly. - Media picker, media card, media library dialog, and media page updated to support external media and surface upload validation errors.
SDK (
@dyrected/sdk)- Support for external media references and upload validation feedback. (
@dyrected/admin,@dyrected/core,@dyrected/sdk)
- New
v2.5.51
-
@dyrected/[email protected]
-
@dyrected/[email protected]
-
Traverse parent directories to detect lockfiles in monorepos/nested workspaces during package manager detection.
- @dyrected/[email protected]
- @dyrected/[email protected] (
dyrected)
-
@dyrected/[email protected] (
@dyrected/next) -
@dyrected/[email protected] (
@dyrected/nuxt,@dyrected/react,@dyrected/vue) -
@dyrected/[email protected] (
@dyrected/nuxt)
v2.5.50
- Resolve preview domain dynamically using schemas siteUrl, prefix/strip url field domains using siteUrl origin, and update block builder library dialog with scrollable 3-column desktop layout. (
@dyrected/admin,@dyrected/core)
v2.5.49
-
Add upgrade command, non-interactive init options, and unified combobox URL field redesign. (
@dyrected/admin,dyrected) -
@dyrected/[email protected]
-
@dyrected/[email protected] (
@dyrected/next) -
@dyrected/[email protected] (
@dyrected/next)
v2.5.48
-
Fix CSV importer: drag & drop, file validation, empty file rejection, invalid row handling, network failure retry, and full-page layout
- Drag and drop now works on the upload zone (was advertised but never wired up) (CI-005)
- Non-CSV files dropped or selected show a clear "Unsupported file type" error and stay on the upload screen (CI-005)
- Empty CSV files (zero data rows) are rejected with an explicit message instead of advancing to a blank mapping step (CI-006)
- At the preview step, if all rows are invalid the Start Import button is disabled and a blocking error is shown; if some rows are invalid an acknowledgement checkbox must be checked before import can proceed, preventing silent partial data creation (CI-029)
- Rows that fail due to network or API errors during import are tracked separately from validation failures; a "Retry N Failed Rows" button appears on the complete screen so users can retry without re-uploading or re-mapping (CI-030)
- CSV import now renders as a full-page layout instead of a constrained modal, giving the validation table sufficient room to display all columns and rows (
@dyrected/admin)
-
Improve cloud admin auth collection resolution and delegated membership handling
- Prefer the
__adminscollection for admin auth when present, then fall back to the configuredadminAuth.collectionSlug, then the first auth collection - Return the resolved admin auth collection slug in public admin auth config so the admin UI and server agree on the active auth collection
- Pass a normalized hook request context to delegated provider membership handlers so cloud-backed user management hooks can safely read query params and request headers
- Preserve multipart upload behavior in the SDK by letting fetch set the multipart boundary automatically (
@dyrected/admin,@dyrected/core,@dyrected/sdk)
- Prefer the
v2.5.47
-
Normalize cloud-issued admin session token roles for client-side access checks.
- @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/admin)
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
dyrected,@dyrected/next) -
@dyrected/[email protected] (
@dyrected/next)
v2.5.46
-
Add low-impact dark mode support to the admin UI with system, light, and dark theme preferences.
- @dyrected/[email protected]
- @dyrected/[email protected] (
@dyrected/admin)
-
@dyrected/[email protected]
-
@dyrected/[email protected] (
dyrected,@dyrected/next) -
@dyrected/[email protected] (
@dyrected/next)
v2.5.45
-
feat: add enterprise guide and implement table auto-initialization with improved admin authentication checks (
@dyrected/core,@dyrected/db-postgres) -
@dyrected/[email protected] (
@dyrected/react,@dyrected/vue) -
@dyrected/[email protected] (
@dyrected/react,@dyrected/vue)
v2.5.44
-
Add provider membership hooks type definitions and collection controller delegation logic to redirect authentication collection CRUD requests. (
@dyrected/core) -
@dyrected/[email protected] (
@dyrected/react,@dyrected/vue) -
@dyrected/[email protected] (
@dyrected/react,@dyrected/vue)
> For earlier release notes (v0.x), see the full CHANGELOG.md on GitHub.