URL Shortener
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-urlsandresave/short-url-templatesconsole commands, to rebuild data derived from short URLs. Add--update-search-indexto 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
UpdateShortUrljobs from an earlier version fail after updating: the job'sentryIdsproperty was replaced byshortUrlIds. 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_ALLevent 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_ALLinstead ofEVENT_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.comno longer matchesexample.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
HandleCatchAllevent. - 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 brokenhttps:///codewhen no domain was configured; it now returnsnull.- 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
Locationheader 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