All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
#2207 Add
hasRedirectRules
flag to short URL API model. This flag tells if a specific short URL has any redirect rules attached to it. -
#1520 Allow short URLs list to be filtered by
domain
.This change applies both to the
GET /short-urls
endpoint, via thedomain
query parameter, and theshort-url:list
console command, via the--domain
|-d
flag. -
#1774 Add new geolocation redirect rules for the dynamic redirects system.
geolocation-country-code
: Allows to perform redirections based on the ISO 3166-1 alpha-2 two-letter country code resolved while geolocating the visitor.geolocation-city-name
: Allows to perform redirections based on the city name resolved while geolocating the visitor.
-
#2193 API keys are now hashed using SHA256, instead of being saved in plain text.
As a side effect, API key names have now become more important, and are considered unique.
When people update to this Shlink version, existing API keys will be hashed for everything to continue working.
In order to avoid data to be lost, plain-text keys will be written in the
name
field, either together with any existing name, or as the name itself. Then users are responsible for renaming them using the newapi-key:rename
command.For newly created API keys, it is recommended to provide a name, but if not provided, a name will be generated from a redacted version of the new API key.
-
Update to Shlink PHP coding standard 2.4
-
Update to
hidehalo/nanoid-php
2.0 -
Update to PHPStan 2.0
- Nothing
- Nothing
- Nothing
- Nothing
- Update to Shlink PHP coding standard 2.4
- Nothing
- Nothing
- #2244 Fix integration with Redis 7.4 and Valkey.
- Nothing
- Nothing
- Nothing
- #2232 Run RoadRunner in docker with
exec
to ensure signals are properly handled.
- Nothing
- Nothing
- Nothing
- Nothing
- #2225 Fix regression introduced in v4.2.2, making config options with
null
value to be promoted as env vars with value''
, instead of being skipped.
- Nothing
- #2208 Explicitly promote installer config options as env vars, instead of as a side effect of loading the app config.
- Nothing
- Nothing
- #2213 Fix spaces being replaced with underscores in query parameter names, when forwarded from short URL to long URL.
- #2217 Fix docker image tag suffix being leaked to the version set inside Shlink, producing invalid SemVer version patterns.
- #2212 Fix env vars read in docker entry point not properly falling back to their
_FILE
suffixed counterpart.
- #2183 Redis database index to be used can now be specified in the connection URI path, and Shlink will honor it.
- Nothing
- Nothing
- Nothing
- #2201 Fix
MEMORY_LIMIT
option being ignored when provided via installer options.
-
#2120 Add new IP address condition for the dynamic rules redirections system.
The conditions allow you to define IP addresses to match as static IP (1.2.3.4), CIDR block (192.168.1.0/24) or wildcard pattern (1.2.*.*).
-
#2018 Add option to allow all short URLs to be unconditionally crawlable in robots.txt, via
ROBOTS_ALLOW_ALL_SHORT_URLS=true
env var, or config option. -
#2109 Add option to customize user agents robots.txt, via
ROBOTS_USER_AGENTS=foo,bar,baz
env var, or config option. -
#2163 Add
short-urls:edit
command to edit existing short URLs.This brings CLI and API interfaces capabilities closer, and solves an overlook since the feature was implemented years ago.
-
#2164 Add missing
--title
option toshort-url:create
andshort-url:edit
commands.
- #2096 Update to RoadRunner 2024.
- Nothing
- Nothing
- Nothing
- Nothing
- Use new reusable workflow to publish docker image
- #2015 Update to PHPUnit 11.
- #2130 Replace deprecated
pugx/shortid-php
package withhidehalo/nanoid-php
.
- Nothing
- Nothing
- #2111 Fix typo in OAS docs examples where redirect rules with
query-param
condition type were defined asquery
. - #2129 Fix error when resolving title for sites not using UTF-8 charset (detected with Japanese charsets).
-
#1330 All visit-related endpoints now expose the
visitedUrl
prop for any visit.Previously, this was exposed only for orphan visits, since this can be an arbitrary value for those.
-
#2077 When sending visits to Matomo, the short URL title is now used as document title in matomo.
-
#2059 Add new
short-url:delete-expired
command that can be used to programmatically delete expired short URLs.Expired short URLs are those that have a
validUntil
date in the past, or optionally, that have reached the max amount of visits.This command can be run periodically by those who create many disposable URLs which are valid only for a period of time, and then can be deleted to save space.
-
#1925 Add new
integration:matomo:send-visits
console command that can be used to send existing visits to integrated Matomo instance. -
#2087 Allow
memory_limit
to be configured via the newMEMORY_LIMIT
env var or configuration option.
-
#2034 Modernize entities, using constructor property promotion and readonly wherever possible.
-
#2036 Deep performance improvement in some endpoints which involve counting visits:
- listing short URLs ordered by visits counts.
- loading tags with stats.
- visits overview.
This has been achieved by introducing a new table which tracks slotted visits counts. We can then
SUM
all counts for certain short URL, avoidingCOUNT(visits)
aggregates which are much less performant when there are a lot of visits. -
#2049 Request ID is now propagated to the background tasks/jobs scheduled during a request.
This allows for a better traceability, as the logs generated during those jobs will have a matching UUID as the logs generated during the request the triggered the job.
- Nothing
- Nothing
- #2095 Fix custom slugs not being properly imported from bitly
- Fix error when importing short URLs and visits from a Shlink 4.x instance
- Nothing
- Nothing
- Nothing
- Nothing
- #2058 Fix DB credentials provided as env vars being casted to
int
if they include only numbers. - #2060 Fix error when trying to redirect to a non-http long URL.
- Nothing
- Nothing
- Nothing
- Nothing
- #2021 Fix infinite GeoLite2 downloads.
- Nothing
- Nothing
- Nothing
- Nothing
- #2041 Document missing
color
andbgColor
params for the QR code route in the OAS docs. - #2043 Fix language redirect conditions matching too low quality accepted languages.
-
#1914 Add new dynamic redirects engine based on rules. Rules are conditions checked against the visitor's request, and when matching, they can result in a redirect to a different long URL.
Rules can be based on things like the presence of specific params, headers, locations, etc. This version ships with three initial rule condition types: device, query param and language.
-
#1902 Add dynamic redirects based on query parameters.
This is implemented on top of the new rule-based redirects.
-
#1915 Add dynamic redirects based on accept language.
This is implemented on top of the new rule-based redirects.
-
#1868 Add support for docker compose secrets to the docker image.
-
#1979 Allow orphan visits lists to be filtered by type.
This is supported both by the
GET /visits/orphan
API endpoint viatype=...
query param, and by thevisit:orphan
CLI command, via--type
flag. -
#1904 Allow to customize QR codes foreground color, background color and logo.
-
#1884 Allow a path prefix to be provided during short URL creation.
This can be useful to let Shlink generate partially random URLs, but with a known prefix.
Path prefixes are validated and filtered taking multi-segment slugs into consideration, which means slashes are replaced with dashes as long as multi-segment slugs are disabled.
- #1935 Replace dependency on abandoned
php-middleware/request-id
with userland simple middleware. - #1988 Remove dependency on
league\uri
package. - #1909 Update docker image to PHP 8.3.
- #1786 Run API tests with RoadRunner by default.
- #2008 Update to Doctrine ORM 3.0.
- #2010 Update to Symfony 7.0 components.
- #2016 Simplify and improve how code coverage is generated in API and CLI tests.
- #1674 Database columns persisting long URLs have now
TEXT
type, which allows for much longer values.
- Nothing
- #1908 Remove support for openswoole (and swoole).
- #2000 Fix short URL creation/edition getting stuck when trying to resolve the title of a long URL which never returns a response.
- Nothing
- #1968 Move migrations from
data
tomodule/Core
.
- Nothing
- Nothing
- #1967 Allow an empty dir to be mounted in
data
when using the docker image.
- Nothing
- Nothing
- Nothing
- Nothing
- #1960 Allow QR codes to be optionally resolved even when corresponding short URL is not enabled.
- Nothing
- Remove dependency on functional-php library
- #1939 Fine-tune RoadRunner logs to avoid too many useless info.
- Nothing
- Nothing
- #1947 Fix error when importing short URLs while using Postgres.
-
#1798 Experimental support to send visits to an external Matomo instance.
-
#1780 Add new
NO_ORPHAN_VISITS
API key role.Keys with this role will always get
0
when fetching orphan visits.When trying to delete orphan visits the result will also be
0
and no visits will actually get deleted. -
#1879 Cache namespace can now be customized via config option or
CACHE_NAMESPACE
env var.This is important if you are running multiple Shlink instance on the same server, or they share the same Redis instance (even more so if they are on different versions).
-
#1905 Add support for PHP 8.3.
-
#1927 Allow redis credentials be URL-decoded before passing them to connection.
-
#1834 Add support for redis encrypted connections using SSL/TLS.
Encryption should work out of the box if servers schema is set tp
tls
orrediss
, including support for self-signed certificates.This has been tested with AWS ElasticCache using in-transit encryption, and with Digital Ocean Redis database.
-
#1906 Add support for RabbitMQ encrypted connections using SSL/TLS.
In order to enable SLL, you need to pass
RABBITMQ_USE_SSL=true
or the corresponding config option.Connections using self-signed certificates should work out of the box.
This has been tested with AWS RabbitMQ using in-transit encryption, and with CloudAMQP.
-
#1799 RoadRunner/openswoole jobs are not run anymore for tasks that are actually disabled.
For example, if you did not enable RabbitMQ real-time updates, instead of triggering a job that ends immediately, the job will not even be enqueued.
-
#1835 Docker image is now built only when a release is tagged, and new tags are included, for minor and major versions.
-
#1055 Update OAS definition to v3.1.
-
#1885 Update to chronos 3.0.
-
#1896 Requests to health endpoint are no longer logged.
-
#1877 Print a warning when manually running
visit:download-db
command and a GeoLite2 license was not provided.
- #1783 Deprecated support for openswoole. RoadRunner is the best replacement, with the same capabilities, but much easier and convenient to install and manage.
- #1790 Drop support for PHP 8.1.
- #1819 Fix incorrect timeout when running DB commands during Shlink start-up.
- #1901 Do not allow short URLs with custom slugs containing URL-reserved characters, as they will not work at all afterward.
- #1900 Fix short URL visits deletion when multi-segment slugs are enabled.
- Nothing
-
#1866 The
INITIAL_API_KEY
env var is now only relevant for the official docker image.Going forward, new non-docker Shlink installations provisioned with env vars that also wish to provide an initial API key, should do it by using the
vendor/bin/shlink-installer init --initial-api-key=%SOME_KEY%
command, instead of usingINITIAL_API_KEY
.
- Nothing
- Nothing
- #1819 Fix incorrect timeout when running DB commands during Shlink start-up.
- #1870 Make sure shared locks include the cache prefix when using Redis.
- #1866 Fix error when starting docker image with
INITIAL_API_KEY
env var.
- Nothing
- Nothing
- Nothing
- Nothing
- #1817 Fix Shlink trying to create SQLite database tables even if they already exist.
- Nothing
- Nothing
- Nothing
- Nothing
- #1808 Fix
rr
binary downloading during Shlink update.
- Nothing
- Nothing
- Nothing
- Nothing
- #1413 Fix error when creating initial DB in Postgres in a cluster where a default
postgres
db does not exist or the credentials do not grant permissions to connect. - #1803 Fix default RoadRunner port when not using docker image.
-
#1148 Add support to delete short URL visits.
This can be done via
DELETE /short-urls/{shortCode}/visits
REST endpoint or viashort-url:visits-delete
console command.The CLI command includes a warning and requires the user to confirm before proceeding.
-
#1681 Add support to delete orphan visits.
This can be done via
DELETE /visits/orphan
REST endpoint or viavisit:orphan-delete
console command.The CLI command includes a warning and requires the user to confirm before proceeding.
-
#1753 Add a new
vendor/bin/shlink-installer init
command that can be used to automate Shlink installations.This command can create the initial database, update it, create proxies, clean cache, download initial GeoLite db files, etc
The official docker image also uses it on its entry point script.
-
#1656 Add support for openswoole 22
-
#1784 Add new docker tag where the container runs as a non-root user.
-
#953 Add locks that prevent errors on duplicated keys when creating short URLs in parallel that depend on the same new tag or domain.
-
#1755 Update to roadrunner 2023
-
#1745 Roadrunner is now the default docker runtime.
There are now three different docker images published:
- Versions without suffix (like
3.6.0
) will contain the default runtime, whichever it is. - Versions with
-roadrunner
suffix (like3.6.0-roadrunner
) will always use roadrunner as the runtime, even if default one changes in the future. - Versions with
-openswoole
suffix (like3.6.0-openswoole
) will always use openswoole as the runtime, even if default one changes in the future.
- Versions without suffix (like
- Deprecated
ENABLE_PERIODIC_VISIT_LOCATE
env var. Use an external mechanism to automate visit locations.
- Nothing
- #1760 Fix domain not being set to null when importing short URLs with default domain.
- #953 Fix duplicated key errors and short URL creation failing when creating short URLs in parallel that depend on the same new tag or domain.
- #1741 Fix randomly using 100% CPU in task workers when trying to download GeoLite DB files.
- Fix Shlink trying to connect to RabbitMQ even if configuration set to not connect.
- Nothing
- Nothing
- Nothing
- Nothing
-
#1742 Fix URLs using schemas which do not contain
//
, likemailto:
, to no longer be considered valid. -
#1743 Fix Error when trying to create short URLs from CLI on an openswoole context.
Unfortunately the reason are real-time updates do not work with openswoole when outside an openswoole request, so the feature has been disabled for that context.
- Nothing
- Nothing
- Nothing
- Nothing
- #1715 Fix short URL creation/edition allowing long URLs without schema. Now a validation error is thrown.
- #1537 Fix incorrect list of tags being returned for some author-only API keys.
- #1738 Fix memory leak when importing short URLs with many visits.
- Nothing
- #1696 Migrated to PHPUnit 10.
- Nothing
- Nothing
- #1698 Fixed error 500 in
robots.txt
. - #1688 Fixed huge performance degradation on
/tags/stats
endpoint. - #1693 Fixed Shlink thinking database already exists if it finds foreign tables.
- Nothing
- #1685 Changed
loosely
mode toloose
, as it was a typo. The old one keeps working and maps to the new one, but it's considered deprecated.
- Nothing
- Nothing
- #1682 Fixed incorrect case-insensitive checks in short URLs when using Microsoft SQL server.
- #1684 Fixed entities metadata cache not being cleared at docker container start-up when using redis with replication.
-
#1557 Added support to dynamically redirect to different long URLs based on the visitor's device type.
For the moment, only
android
,ios
anddesktop
can have their own specific long URL, and when the visitor cannot be matched against any of them, the regular long URL will be used.In the future, more granular device types could be added if appropriate (iOS tablet, android table, tablet, mobile phone, Linux, Mac, Windows, etc).
In order to match the visitor's device, the
User-Agent
header is used. -
#1632 Added amount of bots, non-bots and total visits to the visits summary endpoint.
-
#1633 Added amount of bots, non-bots and total visits to the tag stats endpoint.
-
#1653 Added support for all HTTP methods in short URLs, together with two new redirect status codes, 307 and 308.
Existing Shlink instances will continue to work the same. However, if you decide to set the redirect status codes as 307 or 308, Shlink will also return a redirect for short URLs even when the request method is different from
GET
.The status 308 is equivalent to 301, and 307 is equivalent to 302. The difference is that the spec requires the client to respect the original HTTP method when performing the redirect. With 301 and 302, some old clients might perform a
GET
request during the redirect, regardless the original request method. -
#1662 Added support to provide openswoole-specific config options via env vars prefixed with
OPENSWOOLE_
. -
#1389 and #706 Added support for case-insensitive short URLs.
In order to achieve this, a new env var/config option has been implemented (
SHORT_URL_MODE
), which allows eitherstrict
orloosely
loose
.Default value is
strict
, but ifloose
is provided, then short URLs will be matched in a case-insensitive way, and new short URLs will be generated with short-codes in lowercase only.
- Nothing
- #1676 Deprecated
GET /short-urls/shorten
endpoint. UsePOST /short-urls
to create short URLs instead. - #1678 Deprecated
validateUrl
option on URL creation/edition.
- Nothing
- #1639 Fixed 500 error returned when request body is not valid JSON, instead of a proper descriptive error.
-
#1612 Allowed to filter short URLs out of lists, when
validUntil
date is in the past or have reached their maximum amount of visits.This can be done by:
- Providing
excludeMaxVisitsReached=true
and/orexcludePastValidUntil=true
to theGET /short-urls
endpoint. - Providing
--exclude-max-visits-reached
and/or--exclude-past-valid-until
to theshort-urls:list
command.
- Providing
-
#1613 Added amount of visits coming from bots, non-bots and total to every short URL in the short URLs list.
Additionally, added option to order by non-bot visits, by passing
nonBotVisits-DESC
ornonBotVisits-ASC
. -
#1599 Added support for credentials on redis DSNs, either only password, or both username and password.
-
#1616 Added support to import orphan visits when importing short URLs from another Shlink instance.
-
#1519 Allowing to search short URLs by default domain.
-
#1555 and #1625 Added full support for PHP 8.2, updating the docker image to this version.
- #1563 Moved logic to reuse command options to option classes instead of base abstract command classes.
- #1569 Migrated test doubles from phpspec/prophecy to PHPUnit mocks.
- #1329 Split some logic from
VisitRepository
andShortUrlRepository
into separated repository classes.
- Nothing
- Nothing
- #1618 Fixed imported short URLs and visits dates not being set to the target server timezone.
- #1578 Fixed short URL allowing an empty string as the domain during creation.
- #1580 Fixed
FLUSHDB
being run on Shlink docker start-up when using redis, causing full cache to be flushed.
- Nothing
- Nothing
- Nothing
- Nothing
- #1576 Fixed error when trying to retry visits location from CLI.
- Nothing
- #1474 Added preliminary support for PHP 8.2 during CI workflow.
- #1551 Moved services related to geolocating visits to the
Visit\Geolocation
namespace. - #1550 Reorganized main namespaces from Core module.
- Nothing
- Nothing
- #1556 Fixed trailing slash not working when enabling multi-segment slashes.
-
#1221 Added experimental support to run Shlink with RoadRunner instead of openswoole.
-
#1531 and #1090 Added support for trailing slashes in short URLs.
-
#1406 Added new REST API version 3.
When making requests to the REST API with
/rest/v3/...
and an error occurs, all error types will be different, with the next correlation:INVALID_ARGUMENT
->https://shlink.io/api/error/invalid-data
INVALID_SHORT_URL_DELETION
->https://shlink.io/api/error/invalid-short-url-deletion
DOMAIN_NOT_FOUND
->https://shlink.io/api/error/domain-not-found
FORBIDDEN_OPERATION
->https://shlink.io/api/error/forbidden-tag-operation
INVALID_URL
->https://shlink.io/api/error/invalid-url
INVALID_SLUG
->https://shlink.io/api/error/non-unique-slug
INVALID_SHORTCODE
->https://shlink.io/api/error/short-url-not-found
TAG_CONFLICT
->https://shlink.io/api/error/tag-conflict
TAG_NOT_FOUND
->https://shlink.io/api/error/tag-not-found
MERCURE_NOT_CONFIGURED
->https://shlink.io/api/error/mercure-not-configured
INVALID_AUTHORIZATION
->https://shlink.io/api/error/missing-authentication
INVALID_API_KEY
->https://shlink.io/api/error/invalid-api-key
If you make a request to the API with v2 or v1, the old error types will be returned, until Shlink 4 is released, when only the new ones will be used.
Non-error responses are not affected.
-
#1513 Added publishing of the docker image in GHCR.
-
#1114 Added support to provide an initial API key via
INITIAL_API_KEY
env var, when running Shlink with openswoole or RoadRunner.Also, the installer tool now allows to generate an initial API key that can be copy-pasted (this tool is run interactively), in case you use php-fpm or you don't want to use env vars.
-
#1528 Added support to delay when the GeoLite2 DB file is downloaded in docker images, speeding up its startup time.
In order to do it, pass
SKIP_INITIAL_GEOLITE_DOWNLOAD=true
when creating the container.
- #1339 Added new test suite for CLI E2E tests.
- #1503 Drastically improved build time in GitHub Actions, by optimizing parallelization and adding php extensions cache.
- #1525 Migrated to custom doctrine CLI entry point.
- #1492 Migrated to immutable options objects, mapped with cuyz/valinor.
- Nothing
- Nothing
- Nothing
- Nothing
- #1495 Centralized how routes are configured to support multi-segment slugs.
- #1497 Updated to latest shlink dependencies with support for PHP 8.1 only.
- Nothing
- Nothing
- #1499 Fixed loading of config options as env vars, which was making all default configurations to be loaded unless env vars were explicitly provided.
-
#854 Added support for multi-segment custom slugs.
The feature is disabled by default, but you can optionally opt in. If you do, you will be able to create short URLs with multiple segments in the custom slug, like
https://example.com/foo/bar/baz
. -
#1280 Added missing visit-related commands.
Now you can run
tag:visits
,domain:visits
,visit:orphan
orvisit:non-orphan
to get the corresponding list of visits from the command line. -
#962 Added new real-time update for new short URLs.
You can now subscribe to the
https://shlink.io/new-short-url
topic on any of the supported async updates technologies in order to get notified when a short URL is created. -
#1367 Added support to publish real-time updates in redis pub/sub.
The publishing will happen in the same redis instance/cluster configured for caching.
-
#1452 Updated to monolog 3
-
#1485 Changed payload published in RabbitMQ for all visits events, in order to conform with the Async API spec.
Since this is a breaking change, also provided a new
RABBITMQ_LEGACY_VISITS_PUBLISHING=true
env var that can be provided in order to keep the old payload.This env var is considered deprecated and will be removed in Shlink 4, when the legacy format will no longer be supported.
- Nothing
- #1280 Dropped support for PHP 8.0
- #1471 Fixed error when running
visit:locate
command with any extra parameter (like--retry
).
- Nothing
- Nothing
- Nothing
- Nothing
- #1448 Fixed HTML entities not being properly parsed when auto-resolving page titles.
- #1458 Fixed 500 error when filtering short URLs by ALL tags and search term.
- Nothing
- #1444 Updated docker image to openswoole 4.11.1, in an attempt to fix error.
- Nothing
- Nothing
- #1439 Fixed crash when trying to auto-resolve titles for URLs which serve large binary files.
-
#1294 Allowed to provide a specific domain when importing URLs from YOURLS.
-
#1416 Added support to import URLs from Kutt.it.
-
#1418 Added support to customize the timezone used by Shlink, falling back to the default one set in PHP config.
The timezone can be set via the
TIMEZONE
env var, or using the installer tool. -
#1309 Improved URL importing, ensuring individual errors do not make the whole process fail, and instead, failing URLs are skipped.
-
#1162 Added new endpoint to get visits by domain.
The endpoint is
GET /domains/{domain}/visits
, and it has the same capabilities as any other visits endpoint, allowing pagination and filtering.
- #1359 Hidden database commands.
- #1385 Prevented a big error message from being logged when using Shlink without mercure.
- #1398 Increased required mutation score for unit tests to 85%.
- #1419 Input dates are now parsed to Shlink's configured timezone or default timezone before using them for database queries.
- #1428 Updated native dependencies in docker image and base image to PHP v8.1.5.
- #1340 Deprecated webhooks. New events will only be added to other real-time updates approaches, and webhooks will be completely removed in Shlink 4.0.0.
- Nothing
- #1397 Fixed
db:create
command always reporting the schema exists if thedb:migrate
command has been run before by mistake. - #1402 Fixed the base path getting appended with the default domain by mistake, causing multiple side effects in several places.
- Nothing
- #1382 Updated docker image to PHP 8.1.3.
- Nothing
- Nothing
- #1377 Fixed installer always setting delete threshold with value 1.
- #1379 Ensured API keys cannot be created with a domain-only role linked to default domain.
- Nothing
- Nothing
- Nothing
- Nothing
- #1373 Fixed incorrect config import when updating from Shlink 2.x using SQLite.
- #1369 Fixed slow regexps in
.htaccess
file.
- Nothing
- Nothing
- Nothing
- Nothing
- #1363 Fixed titles being resolved no matter what when
validateUrl
is not set or is explicitly set to true. - #1352 Updated to stable pdo_sqlsrv in docker image.
-
#767 Added full support to use emojis everywhere, whether it is custom slugs, titles, referrers, etc.
-
#1274 Added support to filter short URLs lists by all provided tags.
The
GET /short-urls
endpoint now accepts atagsMode=all
param which will make only short URLs matching all the tags in thetags[]
query param, to be returned.The
short-urls:list
command now accepts a-i
/--including-all-tags
flag which behaves the same. -
#1273 Added support for pagination in tags lists, allowing to improve performance by loading subsets of tags.
For backwards compatibility, lists continue returning all items by default, but the
GET /tags
endpoint now supportspage
anditemsPerPage
query params, to make sure only a subset of the tags is returned.This is supported both when invoking the endpoint with and without
withStats=true
query param.Additionally, the endpoint also supports filtering by
searchTerm
query param. When provided, only tags matching it will be returned. -
#1063 Added new endpoint that allows fetching all existing non-orphan visits, in case you need a global view of all visits received by your Shlink instance.
This can be achieved using the
GET /visits/non-orphan
endpoint.
- #1277 Reduced docker image size to 45% of the original size.
- #1268 Updated dependencies, including symfony/console 6 and mezzio/mezzio-swoole 4.
- #1283 Changed behavior of
DELETE_SHORT_URL_THRESHOLD
env var, disabling the feature if a value was not provided. - #1300 Changed default ordering for short URLs list, returning always from newest to oldest.
- #1299 Updated to the latest base docker images, based in PHP 8.1.1, and bumped openswoole to v4.9.1.
- #1282 Env vars now have precedence over installer options.
- #1328 Refactored ShortUrlsRepository to use DTOs in methods with too many arguments.
- #1315 Deprecated
GET /tags?withStats=true
endpoint. UseGET /tags/stats
instead.
-
#1275 Removed everything that was deprecated in Shlink 2.x.
See UPGRADE doc in order to get details on how to migrate to this version.
-
#1347 Dropped support for regular swoole in favor of openswoole.
Since openswoole support was introduced in the previous release version, Shlink will still consider the swoole extension as openswoole, as at the moment, functionality hasn't deviated too much, and will simplify migrating to Shlink 3.0.0
However, there's no longer active testing with regular swoole, and it is considered no longer supported. If some incompatibility arises, the only supported solution will be to migrate to openswoole.
- Nothing