Miniflux 2.2.10 * test(sanitizer): add unit test for 0x0 pixel tracker * test(sanitizer): add test case to cover Vimeo iframe rewrite without query string * refactor(youtube): Remove a regex and make use of `fetchWatchTime` * refactor(youtube): initialize two maps to the proper length * refactor(tests): use `b.Loop()` instead of for range `b.N` * refactor(server): avoid double call to `Sprintf` * refactor(sanitizer): use global variables to avoid recreating slices on every call * refactor(sanitizer): use a map for iframe allow list * refactor(sanitizer): remove two useless `www.` prefixes * refactor(sanitizer): make `isValidAttribute()` check O(1) * refactor(rewrite): rename `Rewriter` function to `ApplyContentRewriteRules` * refactor(processor): simplify Bilibili processing * refactor(processor): remove a useless type declaration * refactor(processor): remove a duplicated function call * refactor(processor): refactor common code into a `fetchWatchTime` function * refactor(processor): move filters to a `filter` package * refactor(processor): move `FilterEntryMaxAgeDays` filter to filter package * refactor(processor): move `RewriteEntryURL` function to `rewrite` package * refactor(processor): minor simplification of a loop * refactor(internal): add an `urllib.DomainWithoutWWW` function * refactor(http): rename package from `httpd` to `server` for consistency * refactor(http): Don't hardcode TLS configuration * refactor(filter): avoid code duplication between `IsBlockedEntry` and `IsAllowedEntry` functions * refactor(database): drop 3 columns in a single transaction * refactor(crypto): use `rand.Text()` instead of a custom implementation * refactor(config): remove deprecated config options * refactor(appjs): no need to check if always present elements are always present * perf(xml): optimized `NewXMLDecoder` * perf(xml): optimize XML filtering * perf(validator): slightly optimize a regex * perf(timezone): cache `getLocation`'s results * perf(storage): pre-allocate a slice in `RefreshFeedEntries` * perf(storage): optimize away two `Sprintf` calls * perf(sanitizer): use a switch-case instead of a map * perf(sanitizer): minor simplifications of the sanitizer * perf(sanitizer): extract a call to `url.Parse` and make intensive use of it * perf(rss): optimize a bit `BuildFeed` * perf(rss): early return when looking for an item's author * perf(rewrite): make `getPredefinedRewriteRules` O(1) * perf(reader): use a non-cryptographic hash when possible * perf(reader): optimize `RemoveTrackingParameters` * perf(readability): minor regex improvement * perf(media): minor regex simplification * perf(fetcher): pre-allocate the cipherSuites * perf(database): use `TRUNCATE` instead of `DELETE FROM` in migrations * perf(database): marginally speeds migrations up * perf(api): use `math/rand/v2` instead of `math/rand` for better performance * fix(readability): do not remove elements within code blocks * fix(karakeep): correct method name and improve error handling in `SaveURL` * fix(filter): skip invalid rules instead of exiting the loop * feat(ui): display external link in single entry view because the URL was not visible on mobile (no mouse over) * feat(ui): avoid showing an excessive number of tags * feat(ui): add user setting to control `target="_blank"` on links * feat(sanitizer): validate MathML XML namespace * feat(sanitizer): consider images of size 0x0 as pixel trackers * feat(sanitizer): add validation for empty `width` and `height` attributes in img tags * feat(sanitizer): add support for `fetchpriority` and `decoding` attributes in img tags * feat(rewrite): add support for YouTube Shorts video URL pattern * feat(rewrite): add `parkablogs.com` to the referer override list * feat(oidc): use `preferred_username` first instead of `email` claim * feat(locale): update Polish translations * feat(locale): update locales using machine translation * feat(locale): update Indonesian translations * feat(locale): update German translations * feat(locale): update Chinese translations * feat(integration)!: remove Pocket integration (Pocket will no longer be available after July 8, 2025) * feat(filter): add `EntryDate=max-age:duration` filter * feat(css): add margin-bottom to input for consistent spacing * feat(config)!: remove `SERVER_TIMING_HEADER` config option * feat: Allow multiple listen addresses * feat: adding support for saving entries to Karakeep * feat: add entry filters at the feed level * docs(readme): document a couple of nifty features * docs: add `CONTRIBUTING.md` file * chore(template): remove `X-UA-Compatible` meta tag specific to Internet Explorer * build(go): bump to go 1.24 * build(deps): bump `library/alpine` in `/packaging/docker/alpine` * build(deps): bump `golang.org/x/net` from `0.40.0` to `0.41.0` * build(deps): bump `golang.org/x/image` from `0.27.0` to `0.28.0` * build(deps): bump `golang.org/x/crypto` from `0.38.0` to `0.39.0`