The problem: Searching the record list could take 5-6 seconds, making it impractical for large datasets.
What's new: Record search now returns results in milliseconds. Search semantics are unchanged - the same terms match the same results, just dramatically faster.
How to use it: Nothing changes for end users - the same search box, the same results, just fast.
Configuration: No configuration required.
The problem: Integrating with Ligantic outside the product required hand-rolled HTTP calls without the support or harness of an SDK and CLI.
What's new: Two new published packages:
@ligantic/sdk - a TypeScript client for Ligantic (identity, spaces, schemas, records, flow runs + run inspection) with automatic retries and typed error handling.@ligantic/cli - a command-line tool for managing spaces, schemas, records, and flows, with --json output for scripting and secure credential storage.How to use the CLI:
npm install @ligantic/cliligantic auth login - authenticates and stores credentials securelyligantic space use <space> - select the space to work againstligantic records list --json - script against your data, or ligantic flows run <flow> --wait to run a flow and wait for its outputsConfiguration: Set LIGANTIC_API_KEY (and optionally LIGANTIC_API_BASE_URL and LIGANTIC_SPACE_ID) for the CLI, or pass them to the SDK constructor.
The problem: Experience text blocks were either static or fully dynamic - authors could not compose static and dynamic text like "Thanks, {customer.name}" without leaving the text block.
What's new: Text blocks can now inline references to the datums available in their scope, rendered as {{variable}} chips in the designer and resolved to live datum values at runtime. Each variable chip is editable inline: date variables expose a date format picker, and array/object/geojson variables expose a value format picker. Each variable has an optional default value that is shown when the referenced value is empty.
How to use it:
Configuration: No configuration required. Variables are automatically scoped to the block's available datums.
Two new publishable workspace packages:
@ligantic/sdk - a self-contained, never-throwing TypeScript client over the OpenAPI v1 surface (identity, spaces, schemas, records, flows run + run inspection), with a Result<T, LiganticError> pattern, idempotent-only retry with exponential backoff, and spec-derived types via codegen.@ligantic/cli - a human-friendly command tree over the SDK: auth (login/whoami/logout), space (list/use/select/current), schemas (list/show),
records (list/show/create/delete), and flows (list/show/run --wait/run show/outputs), with --json output for scripting and OS key-store credential storage.Experience text blocks can now inline references to the datums available in their scope, rendered as {{variable}} chips in the designer and resolved to live datum values at runtime.
What changed:
variable content node type (an inline void element) can be inserted into a text block's rich content. withVariables (core-ui/content/withVariables.tsx) registers the node with the Slate editor and provides the VariableProvider/useVariables context that exposes the set of available variables to the editor toolbar.TextBlock.tsx builds the available variable set from the block's useAvailableDatums(block.id), keeping only true datums and mapping each to its schema. getFullVariablesSet flattens object schemas so nested fields are individually referenceable (e.g. order.customer.name), and the resulting set is passed to the content editor as variables.DateFormatSelect/ValueFormatSelect).defaultValue. When the referenced value is empty, the defaultValue is shown (or nothing, if unset).
Serialisation precedence is: an existing non-empty value → the variable's defaultValue → the schema's current default.TextRenderer renders content with resolveVariables, and VariableBlock resolves each node into a DatumValueRenderer using a DatumReference built from the variable path (referenceId + optional path), preserving any date format. In the designer the chip shows {{variableName}} with a purple background, or a grey "missing" style when the variable no longer resolves to
a known datum.white-space: pre-wrap, overflow-wrap: break-word and flex-grow: 1 so multi-line content and long values wrap correctly, and content is rendered as inline spans so variables flow naturally within a sentence.Why does it matter? Authors can compose dynamic text like "Thanks, {{customer.name}} - your order {{order.id}} was placed on {{order.createdAt}}" directly in the Experience designer text block, with per-variable formatting and sensible fallbacks when a value is absent.
Built into the Schema and Record, when a "File" type field has the "Display media preview?" option turned on and the file is a PDF or Docx, it will show a preview of the document inline.
Copying a table out of the rich content editor now produces a faithful, re-importable payload instead of a lossy HTML blob. Previously, copying a selected table used the browser's default copy path, which serialised the rendered DOM, losing structured content (and any nested variables/links) and only round-tripping as plain HTML on paste.
Why does it matter? Now you can copy a table in one Ligantic content field, paste it into another, and the full structured content (including variables) is preserved rather than flattened to HTML.