Changelog
3.0.0 2026-09-
{warning} Before upgrading to Hyper 3, review the Upgrading from v2 guide for breaking changes and required migration steps.
Added
- Added named Link Type Configs in project config, with dedicated settings screens and support for field-owned custom configurations. Configurations are stored by UID so fields remain attached when a handle changes. (#52 (opens new window))
- Added link collection filtering by type handle, native attributes and custom fields, with Boolean conditions, ordering, limits and explicit empty-link selection.
- Added opt-in Bulk Add for multi-link fields, with element selection and one-value-per-line entry for supported link types. (#158 (opens new window), D#37 (opens new window))
- Added per-field block and card view modes for multi-link fields. (#246 (opens new window), D#36 (opens new window))
- Added selectable-element conditions and field-layout visibility and editability conditions across link types. (#225 (opens new window))
- Added copy, cut and paste actions for links, with stable content identities that preserve moves without duplicating copied links. (#107 (opens new window))
- Added header tabs and inline pane switching to link field layouts. (#160 (opens new window))
- Added a native New Window field layout element.
- Added default values and character limits for Link Text fields. (#210 (opens new window), #96 (opens new window))
- Added default and fixed values for URL link types. (#51 (opens new window))
- Added the Passive link type for label-only links without a URL target. (#8 (opens new window))
- Added per-field allowed-domain settings for Embed link types. (#24 (opens new window))
- Added per-link-type controls for limiting element sources to sections or groups with URI formats. (#242 (opens new window), #63 (opens new window))
- Added default upload volume and subpath settings for Asset link types. (#101 (opens new window))
- Added an Add-link call to action for empty fields instead of pre-seeding a blank row. (#141 (opens new window))
- Added multi-link previews to element cards and tables. (#251 (opens new window))
- Added the
hyper_linksrelation index for reverse lookups, plushyper/content/sync-relationsfor rebuilding the index from canonical content. - Added automatic batch hydration and Craft-style
with()eager-loading for linked elements, including links nested in Matrix and Neo fields. (#222 (opens new window), #84 (opens new window)) - Added a raw content API for safely updating custom fields inside links, including links nested in Vizy content.
- Added
LinkCollectionInterfaceand immutableLinkCollection::withLinks()collection updates. - Added a GraphQL
fieldsbag for custom link layout values. (D#68 (opens new window)) - Added a GraphQL
emptyargument for including or selecting links without destinations. - Added native Craft Link field and content migrators, with raw-content conversion, relation syncing and dry-run support.
- Expanded Typed Link migration support for Vizy content, orphaned elements, encoded URLs and relation syncing. (#244 (opens new window), #226 (opens new window), #191 (opens new window))
- Added wrav/oEmbed field and content migrators. (#124 (opens new window))
- Added a Category-to-Entry entrification remapper. (#136 (opens new window))
Changed
- Hyper now requires Craft 5.9 or later and Embed 4.
- Hyper 3 now supports upgrading directly from Hyper 1 on Craft 4 without installing Hyper 2 as an intermediate step.
- Link collections now exclude links without a resolved URL by default, with consistent iteration, counting, array access and first-link rendering in single-link and multi-link fields. Use
empty(null)to include all stored links. - Link
isEmpty()now consistently checks the resolved URL across all link types, including element links. - Link content now uses stable, author-owned type handles and writes the v3
linkTypeHandlecontent shape while continuing to read v2 payloads. (#255 (opens new window)) - Link destinations now use literal values. Existing environment-variable and alias references must be updated before upgrading.
- Link block headers now use the link type as a compact title and menu, with additional layout tab labels shown alongside it.
- Element links now localize through Craft’s propagation lifecycle, including multi-link structure propagation and current-owner-site resolution. (#45 (opens new window), #219 (opens new window), #212 (opens new window))
- GraphQL link type names now derive from original field handles and stable link type handles rather than layout aliases or control-panel labels. (#218 (opens new window))
- Embed
html,iframeSrc,embedImageandproviderNamevalues are now available on the GraphQLHyperLinkInterface. (#194 (opens new window)) - Deleting a site now removes its UID from Hyper settings, defaults and stored link content. (#264 (opens new window))
- YouTube embeds now prefer
maxresdefaultthumbnails when available. (#243 (opens new window)) - Unsupported or unavailable link types and missing named configurations now retain their original content instead of falling back to the default type.
- URL values now allow only safe built-in schemes by default, with additional schemes configurable through
allowedUriSchemes; dangerous schemes remain blocked. - Embed requests now enforce exact-domain allowlists, public-IP redirect checks, response limits and TLS verification, and control-panel previews use sandboxed frames.
- Link rendering now escapes author-supplied text by default and rejects unsafe attribute names while continuing to trust template-supplied Twig
Markup. - Improved relation-index save performance for fields containing many links.
- Revised the documentation with complete link creation, rendering, importing, multisite, event and GraphQL guidance.
- Clarified that
linkValueshould remain on the first field layout tab. (#145 (opens new window))
Fixed
- Fixed link edits being lost immediately after a field loads or when saving immediately after editing.
- Fixed a stored XSS vulnerability.
- Fixed an information disclosure vulnerability.
- Fixed cleared element selections continuing to resolve a cached target. (#259 (opens new window))
- Fixed empty-string link values preventing attribute-only links from persisting when set programmatically. (#238 (opens new window))
- Fixed field-level
targetandnewWindowdefaults and per-link New Window overrides not being applied consistently. (#146 (opens new window)) - Fixed link type layouts rendering a Link Value input when that field was omitted. (#129 (opens new window))
- Fixed Embed URLs being cleared when complete metadata had not been fetched. (#203 (opens new window))
- Fixed hash-only and configured custom-scheme URL values being rejected. (#188 (opens new window), #235 (opens new window))
- Fixed required Link Text fields rejecting links without a target value. (D#192 (opens new window))
- Fixed empty Site links appearing to select the first available site. (#233 (opens new window))
- Fixed shared link attributes being lost when changing link type. (#108 (opens new window))
- Fixed multi-column fields overflowing narrow control-panel containers and flyouts. (#180 (opens new window))
- Fixed migration of Link content nested in Matrix and Super Table fields. (#253 (opens new window))
Removed
- Removed arbitrary collection forwarding to the first link. Read custom fields, edit attributes and call type-specific methods on a Link obtained through
first()or iteration. Explicit rendering conveniences such asgetLink(),getUrl()andgetText()remain available. - Removed the legacy element cache, page-template preload and cache utility after migrating reverse lookups to
hyper_links. - Removed the unused field cache and its legacy database table.