Version 3.0.0

August 10, 2026

Added

  • Craft CMS 5 compatibility.

Changed

  • Requires Craft CMS 5.0 or later.
  • Migrated the elements to the Craft 5 APIs (element index rendering).

Version 2.3.0

August 10, 2026

Added

  • resave/short-urls and resave/short-url-templates console commands, to rebuild data derived from short URLs. Add --update-search-index to also refresh the search keywords.

Fixed

  • The search index stored the entry title under the “Template” column instead of the template title, so searching for a template name found nothing. A migration re-saves the existing short URLs, so the keywords are corrected on update.
  • Indexing a short URL whose entry or template has no title threw a TypeError.

Version 2.2.0

August 9, 2026

Queued UpdateShortUrl jobs from an earlier version fail after updating: the job's entryIds property was replaced by shortUrlIds. Let the queue drain before deploying.

This release adds a unique index on the short code. If duplicate codes exist, the migration stops and names them; make them unique and run it again.

Added

  • Separate EVENT_HANDLE_CATCH_ALL event for paths caught by the catch-all route.
  • Export of the short URLs as an Apache, Nginx or Caddy redirect configuration, on the settings page or via php craft shortener/export <format>.

Changed

  • Short codes are generated from a cryptographically secure source, so they can no longer be guessed from earlier ones. Alphabet and length are unchanged, but a code no longer contains at least one character of every set.
  • Catch-all paths trigger EVENT_HANDLE_CATCH_ALL instead of EVENT_HANDLE_MISSING_SHORTURL. Listeners that handled catch-all paths must subscribe to the new event.
  • The configured domain is matched against the request host exactly instead of as a substring, so evil-example.com no longer matches example.com.
  • The short code column has a unique index; redirects no longer scan the table on every request.
  • A short URL is only written when its destination actually changes, so resaving entries no longer rewrites unchanged records.
  • Update jobs load short URLs in batches and are split every 500 entries, so a template with many short URLs no longer occupies the queue with a single long-running job.
  • The root path of the shortener domain is routed like any other path instead of throwing during plugin initialisation. With the catch-all enabled it can now be answered through the HandleCatchAll event.
  • The settings page warns before the fields, not after them, and explains that the catch-all makes the plugin answer every path on the domain.
  • The edit forms warn that browsers cache a 301 permanently.
  • All control panel texts are translatable now, with an English source catalogue in src/translations/en.

Fixed

  • getUrl() returned a broken https:///code when no domain was configured; it now returns null.
  • Editing a short URL could reuse a code that was already taken.
  • The control panel navigation no longer errors when no user is signed in.
  • Rendering a template pattern reports every Twig error, not only syntax errors.
  • Generating a code gives up with a clear error instead of looping forever when none is free.
  • Changing a template did not update its short URLs: the update job was handed short URL IDs in a field meant for entry IDs, so it looked for the wrong records and silently did nothing.
  • Short URLs and templates could not be deleted through Craft's element index, because the elements reported themselves as not deletable.
  • Destinations can no longer contain control characters, which broke out of the Location header and of an exported server configuration.
  • Fixed a typo in the destination placeholder and unified the labels for templates.
  • getElement() declared a narrower return type than Craft guarantees.

Version 2.1.0

July 3, 2025

Added

  • Copy short URL in index page to clipboard.
  • Event to handle catch-all requests.

Changed

  • Event to handle missing short codes now have the code which was requested.

Fixed

  • Permission check for editing templates and short codes
  • Using environment variable in domain config

Version 2.0.4

October 21, 2022

Fixed

  • Routing with schemes.

Version 2.0.3

June 29, 2022

Fixed

  • Fixed column order, again.

Version 2.0.2

June 29, 2022

Fixed

  • Fixed column order.

Version 2.0.1

June 29, 2022

Fixed

  • Fixed migration table name.

Version 2.0.0

June 27, 2022

Added

  • Craft CMS 4 compatibility

Changed

  • Requires Craft CMS >= 4.0

Version 1.0.0-alpha-5

June 23, 2021

Added

  • Add a description field to Short URLs.
  • Add functions to delete templates and Short URLs.

Fixed

  • Fix notice when saving templates.
  • Show template actions only, when templates are available.

Version 1.0.0-alpha.4

June 22, 2021

Added

  • Add event HandleMissingShortUrl to allow plugins to handle request before a 404 exception is throwing on missing short URLs.
  • Add QR Codes to Short URLs.
  • The domain in the settings has to be a full URL.
  • Add URL validation to domain.

Version 1.0.0-alpha.3

June 21, 2021

Fixed

  • Fixed a bug when creating search index for ShortUrls without templates.
  • Fix notice when saving new ShortURL.
  • Trim domain and path for trailing slashes.

Version 1.0.0-alpha.2

August 18, 2020

Added

  • Add redirect for non-codes and root path.

Version 1.0.0-alpha.1

August 17, 2020

Added

  • Initial release