Version 1.1.0
October 30, 2026
Added
- A Typesense section in the control panel, with a page per declared collection, where editors manage rules and synonyms. It needs the new Manage Typesense rules permission and appears only while the connection is configured.
- Rules: for a search term, matched exactly or contained, pin up to 20 entries in order and hide up to 100, with optional start and end dates. Also match synonyms makes a rule fire for its term's synonyms too. Drag to set which rule wins, and switch a rule off without deleting it. Pinned entries still obey the search key's publication window and filters.
- Synonym groups: all equal, or one way from a main term.
- Craft holds the rules and Typesense holds a copy. The plugin owns one curation set and one synonym set per collection, pushes them on every save, links them to every collection version it builds, and keeps any set someone linked by hand. An edit saved while Typesense is unreachable is kept and pushed again from the queue.
- Each collection shows whether Typesense matches Craft (not live yet, or out of step after a dashboard edit), in the section, the utility and
collections/status.collections/applyandsetupput Craft's version back. rules/exportandrules/importmove a collection's rules and synonyms between environments, matching entries by uid, then by section and slug, and listing anything they cannot find.rules/adoptbrings a curation or synonym set made by hand in Typesense under the plugin, listing any item that uses an option the section does not offer, and unlinks the original without deleting it.- The utility lists rows left by a collection no longer declared, and
rules/prunedeletes them.
Changed
- Uninstalling drops the plugin's rules and synonyms tables. The sets stay in Typesense, linked, so search is unchanged; the README says how to remove them.
Version 1.0.1
October 23, 2026
Changed
- New plugin icon: a white glyph on a black circle, with a white icon mask for the control panel nav.
Version 1.0.0
October 19, 2026
Fixed
- Saving the plugin settings no longer fails with an error when a connection setting names an environment variable that is set but empty; the empty value is saved like any other.
- Test connection and
setupno longer refuse a correct search-only API key because another key on the server starts with the same four characters. A key that genuinely allows more than search is still refused.
Version 1.0.0-beta.2
October 1, 2026
Added
- A collection can name the field its documents carry their type in with
typeField(defaulttype), so documents that usetypefor a field of their own keep it.BaseFormatter's schema and documents both follow it,SchemaContext::getTypeField()gives it to a formatter's schema, and a value that is not a field name or that names another base field is reported as a problem. Search::EVENT_DEFINE_SCOPED_KEYis cancellable: a handler that sets$event->isValid = falserefuses the key, andscopedKey(),searchConfig()andscopedKeyParams()return null, so a page fails closed when a filter its key must carry cannot be built.
Version 1.0.0-beta.1
September 30, 2026
Added
- Connection settings in the control panel, environment-variable aware, with a Test connection button that checks the server version (30.0 or later) and refuses a search-only key that can do more than search.
- Collections, sources and analytics declared in
config/typesense-sync.php, validated in full: unknown keys, undeclared collections, missing formatters, conflicting fields, clashing names and reference cycles are all reported. - Sources for sections (with per-entry-type overrides), category groups, users and Craft Commerce product types. The Commerce source is optional and warns rather than fails when Commerce is absent.
- The index follows content: saves, disables, deletes and restores queue a deduplicated sync, as do user status and group changes. Drafts, revisions, bulk resaves and nested entries are skipped, and a save never fails because of Typesense.
BaseFormatter,FormatterInterfaceandSchemaContextfor turning elements into documents, with root-relative URLs and a publication window that needs no cron.- Reindex with optional prune (skipped when a run builds nothing), and counter fields kept through every reindex.
- Apply (create, or alter in place) and recreate (rebuild beside the live version behind an alias, then swap), with collections that reference each other rebuilt together in dependency order.
- Short-lived scoped search keys with the publication window, a caller's filter and excluded fields embedded, and
craft.typesensefor templates, which returns null instead of throwing. - Search analytics: popular searches, searches with no results, and view counters, applied as a diff; an events-only key command; and a report.
- Utilities → Typesense Sync: connection, problems, each collection's version, document count and schema difference, analytics rule states, and Apply, Reindex and Recreate actions.
- A "Sync to Typesense" element action and edit-screen menu item.
- Console commands:
setup,sync,sync/element,sync/flush,collections/status|apply|recreateandanalytics/status|apply|report|create-events-key|remove, each exiting non-zero on failure. - Events:
Sync::EVENT_BEFORE_INDEX_DOCUMENT,Sync::EVENT_AFTER_SYNC,Sync::EVENT_AFTER_DELETE_DOCUMENT,Targets::EVENT_RESOLVE_TARGET,Targets::EVENT_REGISTER_ELEMENT_TYPESandSearch::EVENT_DEFINE_SCOPED_KEY, plussync->queueElement(). - Copy-in examples: configs, formatters and Alpine.js search and view-counter components.