Tags

Tags give the ability to mark specific points in history as being important
  • 2.2.12

    Miniflux 2.2.12
    
    * Keep only metadata of removed entries to reduce database size.
    * Removed entry status is now immutable and cannot be changed back to `unread` or `read` status.
    * SVG favicons are now minified before storing them in the database.
    * Added support for resizing WebP images.
    * Main menu now includes icons.
    * Added Progressive Web App (PWA) shortcuts for quick access to common actions.
    * Added direct link to the Apache 2.0 license on the About page.
    * Feed-level webhook URLs now take priority when saving entries.
    * New option: `POLLING_LIMIT_PER_HOST` to limit concurrent requests per host.
      Limits the number of concurrent requests to the same hostname when polling feeds.
      This helps prevent overwhelming a single server during batch processing by the worker pool.
    * Added a rewrite rule to remove useless heading images on Phoronix articles.
    * Use Golang's built-in VCS feature to get commit and build date when not specified by `LDFLAGS`.
    * Disable OAuth2 and WebAuthn routes when the feature is not enabled.
    * Added request URI logging in authentication handlers.
    
    * Limited `tsvector` indexing to the first 500K characters to avoid PostgreSQL limits.
    * Use `rel=apple-touch-icon` instead of `rel=apple-touch-icon-precomposed.png`.
    * Fixed broken WebAuthn error alert message on the settings page.
    * Reverted `SameSiteStrict` cookie mode because it forces people to authenticate each time when using the PWA on Android.
    * Prevent stale data by forcing reload when navigating back from articles (fix for Chrome's **bfcache**).
    * Fixed URL detection capturing newlines in media descriptions.
    
    * Optimized SQL queries (`FetchJobs`, `markFeedAsRead`) by removing unnecessary joins and heavy-weight operations.
    * Improved memory usage by minimizing SVGs, static images, and templates.
    * WebAuthn script (`webauthn.js`) is no longer loaded when the feature is disabled.
    * Replaced regex-based YouTube and Invidious video ID extraction with URL parsing.
    * Introspect the translation files at load time.
    * Parse and merge filters only once per refresh.
    
    * Extensive refactoring across UI, templates, storage, and fetcher to simplify code and reduce memory allocations.
    * Replaced `interface{}` with `any` (Go 1.18+ idiomatic usage).
    * Reorganized JavaScript code: simplified functions, reduced duplication, and modernized handlers.
    * `app.js` bundle and service worker files are now loaded as a JavaScript module.
    * Use request builder in media proxy handler.
    
    * Fixed typos and updated default values in the man page.
    * Removed `ChangeLog` file (release notes are visible on GitHub and the official website - use the commit history for more details).
    
    * Updated GitHub Actions workflows to use Go version **1.25**.
    * Updated dependencies:
    
      * `golang.org/x/net` → 0.43.0
      * `golang.org/x/image` → 0.30.0
      * `golang.org/x/term` → 0.34.0
      * `github.com/tdewolff/minify/v2` → 2.23.11
      * `github.com/coreos/go-oidc/v3` → 3.15.0
      * `github.com/prometheus/client_golang` → 1.23.0
      * GitHub Actions: `actions/checkout` bumped to v5
    
    * Added API integration tests for fetching categories with counters.
    * Added tests for icon URL discovery, SVG minification error handling, and version format enforcement.
    * Added unit tests for `RequestBuilder`.
    * Avoided building a temporary binary for integration tests.
    
    For more details, look at the commit history.
    
  • 2.2.11

    Miniflux 2.2.11
    
    * **TLS support for Unix sockets**: Miniflux can now serve TLS over Unix domain sockets using `CERT_FILE` and `KEY_FILE` ([#fcf86e3](https://github.com/miniflux/v2/commit/fcf86e3)).
    * **RSS fallback**: If a feed entry has no URL, Miniflux now uses the enclosure URL as a fallback ([#d9de9d1](https://github.com/miniflux/v2/commit/d9de9d1)).
    * **Bearer token for Linkwarden**: The Linkwarden integration now uses Bearer token authorization instead of cookies ([#1d11623](https://github.com/miniflux/v2/commit/1d11623)).
    * **Cookie policy improvement**: `SameSiteStrictMode` is enforced for cookies when OAuth2/OIDC is not used ([#135ce1d](https://github.com/miniflux/v2/commit/135ce1d)).
    * **Readability engine**: Avoid removing elements with the `content` class during readability parsing ([#66b269e](https://github.com/miniflux/v2/commit/66b269e)).
    
    * **Massive readability engine refactoring** and performance optimizations:
    
      * Improved performance of `getClassWeight`, `getLinkDensity`, and `transformMisusedDivsIntoParagraphs`.
      * Simplified and optimized internal logic of `removeUnlikelyCandidates`, `getSelectionLength`, and `getArticle`.
      * Reduced memory allocation in sanitizer and readability components.
    * **Storage optimization**: Strings are now truncated on the Go side to respect `tsvector` limits, reducing DB load and ensuring valid UTF-8 ([#703f113](https://github.com/miniflux/v2/commit/703f113)).
    * **Simplified and clarified internal code structure**:
    
      * Major cleanup and size optimization of internal structs (`Feed`, `FeedCreationRequest`, etc.).
      * Reduced memory use and improved CPU cache locality.
      * Numerous refactors across `config`, `template`, `locale`, `subscription`, and `fetcher` modules.
    
    * Fixed an issue with feeds having excessive leading whitespace causing parser buffer issues ([#54abd0a](https://github.com/miniflux/v2/commit/54abd0a)).
    * Properly preserve UTF-8 when truncating strings for full-text search ([#703f113](https://github.com/miniflux/v2/commit/703f113)).
    * Fixed logic error in enclosure type detection ([#50d5cb9](https://github.com/miniflux/v2/commit/50d5cb9)).
    * Fixed incorrect filter rule parsing of Windows-style newlines ([#dc81725](https://github.com/miniflux/v2/commit/dc81725)).
    * Fixed a panic in `startAutoCertTLSServer` function when using Let's Encrypt automatic certificates ([#f7a6b02](https://github.com/miniflux/v2/commit/f7a6b02))
    * Improved UI spacing consistency around header/footer ([#32fbb4e](https://github.com/miniflux/v2/commit/32fbb4e)).
    
    * **Windows binary no longer distributed**: Windows is no longer a supported platform for binary distribution. Users must build from source if needed ([#b470b18](https://github.com/miniflux/v2/commit/b470b18)).
    
    * Test coverage significantly increased for modules like `readability`, `sanitizer`, `processor`, `locale`, and `storage`.
    * Commit linter updated to support new Git revert message format.
    
    * Base Docker image updated to Alpine 3.22.
    * PostgreSQL Docker example updated to use the latest version.
    
    * Updated Chinese and German translations.
    
    * Bumped `github.com/go-webauthn/webauthn` to `0.13.4`
    * Bumped `github.com/tdewolff/minify/v2` to `2.23.10`
    * Bumped `golang.org/x/*` modules: `image`, `net`, `term`, `crypto`
    * Bumped `github.com/andybalholm/brotli` to `1.2.0`
    
  • v2.2.11

    Miniflux 2.2.11
    
    * **TLS support for Unix sockets**: Miniflux can now serve TLS over Unix domain sockets using `CERT_FILE` and `KEY_FILE` ([#fcf86e3](https://github.com/miniflux/v2/commit/fcf86e3)).
    * **RSS fallback**: If a feed entry has no URL, Miniflux now uses the enclosure URL as a fallback ([#d9de9d1](https://github.com/miniflux/v2/commit/d9de9d1)).
    * **Bearer token for Linkwarden**: The Linkwarden integration now uses Bearer token authorization instead of cookies ([#1d11623](https://github.com/miniflux/v2/commit/1d11623)).
    * **Cookie policy improvement**: `SameSiteStrictMode` is enforced for cookies when OAuth2/OIDC is not used ([#135ce1d](https://github.com/miniflux/v2/commit/135ce1d)).
    * **Readability engine**: Avoid removing elements with the `content` class during readability parsing ([#66b269e](https://github.com/miniflux/v2/commit/66b269e)).
    
    * **Massive readability engine refactoring** and performance optimizations:
    
      * Improved performance of `getClassWeight`, `getLinkDensity`, and `transformMisusedDivsIntoParagraphs`.
      * Simplified and optimized internal logic of `removeUnlikelyCandidates`, `getSelectionLength`, and `getArticle`.
      * Reduced memory allocation in sanitizer and readability components.
    * **Storage optimization**: Strings are now truncated on the Go side to respect `tsvector` limits, reducing DB load and ensuring valid UTF-8 ([#703f113](https://github.com/miniflux/v2/commit/703f113)).
    * **Simplified and clarified internal code structure**:
    
      * Major cleanup and size optimization of internal structs (`Feed`, `FeedCreationRequest`, etc.).
      * Reduced memory use and improved CPU cache locality.
      * Numerous refactors across `config`, `template`, `locale`, `subscription`, and `fetcher` modules.
    
    * Fixed an issue with feeds having excessive leading whitespace causing parser buffer issues ([#54abd0a](https://github.com/miniflux/v2/commit/54abd0a)).
    * Properly preserve UTF-8 when truncating strings for full-text search ([#703f113](https://github.com/miniflux/v2/commit/703f113)).
    * Fixed logic error in enclosure type detection ([#50d5cb9](https://github.com/miniflux/v2/commit/50d5cb9)).
    * Fixed incorrect filter rule parsing of Windows-style newlines ([#dc81725](https://github.com/miniflux/v2/commit/dc81725)).
    * Fixed a panic in `startAutoCertTLSServer` function when using Let's Encrypt automatic certificates ([#f7a6b02](https://github.com/miniflux/v2/commit/f7a6b02))
    * Improved UI spacing consistency around header/footer ([#32fbb4e](https://github.com/miniflux/v2/commit/32fbb4e)).
    
    * **Windows binary no longer distributed**: Windows is no longer a supported platform for binary distribution. Users must build from source if needed ([#b470b18](https://github.com/miniflux/v2/commit/b470b18)).
    
    * Test coverage significantly increased for modules like `readability`, `sanitizer`, `processor`, `locale`, and `storage`.
    * Commit linter updated to support new Git revert message format.
    
    * Base Docker image updated to Alpine 3.22.
    * PostgreSQL Docker example updated to use the latest version.
    
    * Updated Chinese and German translations.
    
    * Bumped `github.com/go-webauthn/webauthn` to `0.13.4`
    * Bumped `github.com/tdewolff/minify/v2` to `2.23.10`
    * Bumped `golang.org/x/*` modules: `image`, `net`, `term`, `crypto`
    * Bumped `github.com/andybalholm/brotli` to `1.2.0`
    
  • v2.2.10

    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`
    
  • 2.2.10

    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`
    
  • 2.2.9

    Miniflux 2.2.9
    
    * refactor(googlereader): remove redundant log message
    * refactor(googlereader): move constants to separate files
    * fix(webauthn): correct argument in debug log
    * fix(sanitizer): MathML tags are not fully supported by `golang.org/x/net/html`
    * fix(migrations): prevent failure at version 45 with long entry URLs
    * fix(locale): localize Git commit label in about page
    * fix(googlereader): return a 400 instead of 500 for invalid edit requests
    * fix(googlereader): handle various item ID formats
    * fix(googlereader): avoid panic for inexisting feed or category
    * fix(googlereader): `/items/contents` should accept short form item IDs
    * feat(webauthn): prefer creation of a client-side discoverable credential
    * feat(urlcleaner): remove the `ref` parameter from url
    * feat(settings): replace `div.panel` with paragraph tags for OAuth2 links
    * feat(settings): add validation for entry order and categories sorting order
    * feat(settings): add option to always open articles externally
    * feat(server): add liveness and readiness probes
    * feat(sanitizer): add MathML tags to the sanitizer
    * feat(sanitized): allow Spotify iframes
    * feat(rssbridge): support authentication token for RSS-Bridge
    * feat(response): change error response content type to plain text and escape HTML
    * feat(reader): populate feed description automatically
    * feat(locale): update Russian translation
    * feat(locale): update Polish translation
    * feat(locale): update French translation
    * feat(googlereader): avoid SQL query to fetch username in streamItemContentsHandler
    * feat(googlereader): add `mark-all-as-read` endpoint
    * feat(api): add new endpoints to manage API keys
    * ci: remove deprecated `reviewers` field from `dependantbot.yml`
    * chore(gitignore): ignore miniflux binary in root directory
    * build(deps): bump `golangci/golangci-lint-action` from `7` to `8`
    * build(deps): bump `golang.org/x/oauth2` from `0.29.0` to `0.30.0`
    * build(deps): bump `golang.org/x/net` from `0.39.0` to `0.40.0`
    * build(deps): bump `golang.org/x/image` from `0.26.0` to `0.27.0`
    * build(deps): bump `golang.org/x/crypto` from `0.37.0` to `0.38.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.23.3` to `2.23.8`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.23.1` to `2.23.3`
    * build(deps): bump `github.com/go-webauthn/webauthn` from `0.12.3` to `0.13.0`
    
  • v2.2.8

    Miniflux 2.2.8
    
    * refactor(js): replace `DomHelper` methods with standalone functions
    * refactor: avoid logging twice the feed errors in the background worker
    * fix(api): `hide_globally` categories field should be a boolean
    * fix(ui): add missing `await` when calling `navigator.share()` method
    * fix(ui): replace share link with a form button for better accessibility
    * feat(telegrambot): replace "Go to website" button with "Go to Miniflux"
    * feat(locale): update Polish translation
    * feat(locale): update German translation
    * feat(locale): update Chinese translation
    * feat(config): add `SCHEDULER_ROUND_ROBIN_MAX_INTERVAL` option
    * feat(cli): add `-reset-feed-next-check-at` argument
    * feat(api): add `update_content` query parameter to `/entries/{entryID}/fetch-content` endpoint
    * feat: use `Cache-Control` max-age and `Expires` headers to calculate next check
    * feat: implement proxy URL per feed
    * feat: add proxy rotation functionality
    * ci(linter): replace commitlint with a Python script
    * ci: add documentation issue template
    * build(deps): bump `golang.org/x/oauth2` from `0.28.0` to `0.29.0`
    * build(deps): bump `golang.org/x/net` from `0.38.0` to `0.39.0`
    * build(deps): bump `golang.org/x/image` from `0.25.0` to `0.26.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.22.4` to `2.23.1`
    * build(deps): bump `github.com/PuerkitoBio/goquery` from `1.10.2` to `1.10.3`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build(deps): bump `github.com/mattn/go-sqlite3` from `1.14.24` to `1.14.28`
    * build(deps): bump `github.com/go-webauthn/webauthn` from `0.12.2` to `0.12.3`
    * build(deps): bump `github.com/coreos/go-oidc/v3` from `3.13.0` to `3.14.1`
    
  • 2.2.8

    Miniflux 2.2.8
    
    * refactor(js): replace `DomHelper` methods with standalone functions
    * refactor: avoid logging twice the feed errors in the background worker
    * fix(api): `hide_globally` categories field should be a boolean
    * fix(ui): add missing `await` when calling `navigator.share()` method
    * fix(ui): replace share link with a form button for better accessibility
    * feat(telegrambot): replace "Go to website" button with "Go to Miniflux"
    * feat(locale): update Polish translation
    * feat(locale): update German translation
    * feat(locale): update Chinese translation
    * feat(config): add `SCHEDULER_ROUND_ROBIN_MAX_INTERVAL` option
    * feat(cli): add `-reset-feed-next-check-at` argument
    * feat(api): add `update_content` query parameter to `/entries/{entryID}/fetch-content` endpoint
    * feat: use `Cache-Control` max-age and `Expires` headers to calculate next check
    * feat: implement proxy URL per feed
    * feat: add proxy rotation functionality
    * ci(linter): replace commitlint with a Python script
    * ci: add documentation issue template
    * build(deps): bump `golang.org/x/oauth2` from `0.28.0` to `0.29.0`
    * build(deps): bump `golang.org/x/net` from `0.38.0` to `0.39.0`
    * build(deps): bump `golang.org/x/image` from `0.25.0` to `0.26.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.22.4` to `2.23.1`
    * build(deps): bump `github.com/PuerkitoBio/goquery` from `1.10.2` to `1.10.3`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build(deps): bump `github.com/mattn/go-sqlite3` from `1.14.24` to `1.14.28`
    * build(deps): bump `github.com/go-webauthn/webauthn` from `0.12.2` to `0.12.3`
    * build(deps): bump `github.com/coreos/go-oidc/v3` from `3.13.0` to `3.14.1`
    
  • v2.2.7

    Miniflux 2.2.7
    
    * test(api): update base URL after upgrading Hugo
    * refactor(rewrite): reorganize referer rules and remove obsolete mappings
    * refactor: combine feed icon handlers to use only `externalIconID`
    * fix(ui): update share feature to correctly select the title element and handle empty titles
    * fix(ui): update entry tags display logic to show links based on user authentication
    * fix(ui): remove touch-action style to prevent horizontal scrolling issues
    * fix(ui): log a warning for an empty client secret
    * fix(ui): change labels from "Read / Unread" to "Mark as Read"
    * fix(ui): avoid 500 errors and NaN when marking a deleted entry as read
    * fix(subscription): add `/rss/feed.xml` to the list of known feed URLs
    * fix(security): use a more restrictive CSP for untrusted content
    * fix(rewrite): remove obsolete rule for `webtoons.com`
    * fix(processor): add missing quotation marks to import comments
    * fix(googlereader): return enclosures in the `streamItemContentsHandler` response
    * fix: address minor issues detected by Go linters
    * feat(urlcleaner): add more Google Analytics parameters
    * feat(storage): reduce the number of SQL queries when fetching entry enclosures
    * feat(sanitizer): allow the `<u>` tag in feeds
    * feat(sanitizer): allow the `<b>` tag
    * feat(locale): update Polish translation
    * feat(locale): add Romanian translation
    * feat(integrations/ntfy): make ntfy topics configurable per feed
    * feat(googlereader): add a feed icon endpoint
    * feat: show database size on the about page
    * feat: add a `make add string` command to add new localized strings
    * docs: update README
    * docs: update client README to remove references to deprecated functions
    * ci: replace GitHub Issue Markdown templates with YAML forms
    * build(deps): bump `golangci/golangci-lint-action` from `6` to `7`
    * build(deps): bump `golang.org/x/term` from `0.29.0` to `0.30.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.26.0` to` 0.28.0`
    * build(deps): bump `golang.org/x/net` from `0.35.0` to `0.38.0`
    * build(deps): bump `golang.org/x/image` from `0.24.0` to `0.25.0`
    * build(deps): bump `golang.org/x/crypto` from `0.33.0` to `0.36.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.21.3` to `2.22.4`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build(deps): bump `github.com/golang-jwt/jwt/v5` from `5.2.1` to `5.2.2`
    * build(deps): bump `github.com/go-webauthn/webauthn` from `0.11.2` to `0.12.2`
    * build(deps): bump `github.com/go-jose/go-jose/v4` from `4.0.2` to `4.0.5`
    * build(deps): bump `github.com/coreos/go-oidc/v3` from `3.12.0` to `3.13.0`
    
  • 2.2.7

    Miniflux 2.2.7
    
    * test(api): update base URL after upgrading Hugo
    * refactor(rewrite): reorganize referer rules and remove obsolete mappings
    * refactor: combine feed icon handlers to use only `externalIconID`
    * fix(ui): update share feature to correctly select the title element and handle empty titles
    * fix(ui): update entry tags display logic to show links based on user authentication
    * fix(ui): remove touch-action style to prevent horizontal scrolling issues
    * fix(ui): log a warning for an empty client secret
    * fix(ui): change labels from "Read / Unread" to "Mark as Read"
    * fix(ui): avoid 500 errors and NaN when marking a deleted entry as read
    * fix(subscription): add `/rss/feed.xml` to the list of known feed URLs
    * fix(security): use a more restrictive CSP for untrusted content
    * fix(rewrite): remove obsolete rule for `webtoons.com`
    * fix(processor): add missing quotation marks to import comments
    * fix(googlereader): return enclosures in the `streamItemContentsHandler` response
    * fix: address minor issues detected by Go linters
    * feat(urlcleaner): add more Google Analytics parameters
    * feat(storage): reduce the number of SQL queries when fetching entry enclosures
    * feat(sanitizer): allow the `<u>` tag in feeds
    * feat(sanitizer): allow the `<b>` tag
    * feat(locale): update Polish translation
    * feat(locale): add Romanian translation
    * feat(integrations/ntfy): make ntfy topics configurable per feed
    * feat(googlereader): add a feed icon endpoint
    * feat: show database size on the about page
    * feat: add a `make add string` command to add new localized strings
    * docs: update README
    * docs: update client README to remove references to deprecated functions
    * ci: replace GitHub Issue Markdown templates with YAML forms
    * build(deps): bump `golangci/golangci-lint-action` from `6` to `7`
    * build(deps): bump `golang.org/x/term` from `0.29.0` to `0.30.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.26.0` to` 0.28.0`
    * build(deps): bump `golang.org/x/net` from `0.35.0` to `0.38.0`
    * build(deps): bump `golang.org/x/image` from `0.24.0` to `0.25.0`
    * build(deps): bump `golang.org/x/crypto` from `0.33.0` to `0.36.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.21.3` to `2.22.4`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build(deps): bump `github.com/golang-jwt/jwt/v5` from `5.2.1` to `5.2.2`
    * build(deps): bump `github.com/go-webauthn/webauthn` from `0.11.2` to `0.12.2`
    * build(deps): bump `github.com/go-jose/go-jose/v4` from `4.0.2` to `4.0.5`
    * build(deps): bump `github.com/coreos/go-oidc/v3` from `3.12.0` to `3.13.0`
    
  • 2.2.6

    Miniflux 2.2.6
    
    * test(encoding): add unit tests for `CharsetReader` function
    * refactor(xml): improve the performances of `NewXMLDecoder`
    * refactor(ui): remove superfluous cast
    * refactor(request): broaden an error condition when parsing cookies
    * refactor(processor): remove superfluous parenthesis
    * refactor(opml): don't define receivers on both values and pointer
    * refactor(model): simplify a condition
    * refactor(model): don't define methods both on instance and pointer
    * refactor(locale): sort JSON documents alphabetically by keys
    * refactor(locale): remove superfluous parenthesis
    * refactor(js): use proper types in `app.js`
    * refactor(js): replace the deprecated `window.pageYOffset` with `window.scollY`
    * refactor(js): remove a useless `return`
    * refactor(js): anchor `=` removal in `webauthn_handler.js` regex
    * refactor(js): add default value for parameter `fallbackSelf` in `goToPage` function
    * refactor(integration): don't use `defer` in a loop
    * refactor(icon): guard against a potential `null` dereference
    * refactor(date): use an else-if instead of two if statements
    * refactor(css): use shortcuts to declare padding
    * refactor(client): remove a useless cast
    * perf(sanitizer): remove two useless calls to `strings.ReplaceAll`
    * fix(ui): Redirect correctly post feed removal from category feeds list
    * fix(scraper): update TechCrunch scraper rule
    * fix(scraper): avoid encoding issue if charset meta tag is after 1024 bytes
    * fix(sanitizer): non-allowed attributes are not properly stripped
    * fix(sanitizer): correct HTML tag name from `tfooter` to `tfoot`
    * fix(rss): handle item title with `CDATA` content correctly
    * fix(locale): missing hyphen in `de_DE.json`
    * fix(css): avoid aside overflow on the pagination menu
    * fix(css): `--entry-content-aside-border-color` is missing from `system.css`
    * fix(api): return 500 response when JSON serialization fails
    * fix(api): JSON encoding is failing with dates at OAD and negative timezone offset
    * feat(urlcleaner): add trackers to the blocklist
    * feat(ui): open the `<details>` tag in edit feed page when the feature is enabled
    * feat(sanitizer): improve text truncation with better space handling
    * feat(sanitizer): allow `img` tags with only a `srcset` and no `src` attribute
    * feat(rss): add workaround for RSS item title with HTML content
    * feat(pushover): add integration with pushover.net
    * feat(processor): fetch YouTube watch time in bulk using the API
    * feat(locale): update Traditional Chinese translation
    * feat(locale): update Polish translation
    * feat(locale): update French translation
    * feat(locale): add Taiwanese POJ (nan-Latn-pehoeji)
    * feat(integration): update Linkace integration to support API v2
    * feat(integration): add webhook URL per feed
    * feat(integration): add Slack integration
    * feat(css): improve aside element position on smartphone
    * ci: update GitHub Actions workflows to use Go 1.24
    * ci: trigger packaging tests on pull requests
    * ci: add `commitlint` to validate PR commit messages
    * build(deps): bump `golang` in `/packaging/debian`
    * build(deps): bump `golang.org/x/term` from `0.28.0` to `0.29.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.25.0` to `0.26.0`
    * build(deps): bump `golang.org/x/net` from `0.34.0` to `0.35.0`
    * build(deps): bump `golang.org/x/image` from `0.23.0` to `0.24.0`
    * build(deps): bump `golang.org/x/crypto` from `0.32.0` to `0.33.0`
    * build(deps): bump `github.com/PuerkitoBio/goquery` from `1.10.1` to `1.10.2`
    
  • 2.2.5

    Miniflux 2.2.5
    
    * tests(js): improve `.jshintrc` (strict comparison, etc...)
    * test(sanitizer): add a fuzzer
    * refactor(rewriter): use custom title case converter implementation instead of `golang.org/x/text/cases.Title()`
    * refactor(readingtime): replace `whatlanggo` package with an ad-hoc implementation
    * refactor(oauth2): no need to use `io.WriteString` when sha256 provides a way to obtain a sum in a single call
    * refactor(js): simplify a bit `keyboard_handler.js`
    * refactor(js): remove an outdated check for `{passive: true}`
    * refactor(js): minor refactoring of `touch_handler.js`
    * refactor(js): minor improvements in `app.js`
    * refactor(database): add special handling for PostgreSQL-specific migrations
    * fix(ui): reading preferences are reset if the form values are incorrect
    * fix(sanitizer): allow `<hr>` tags
    * fix(finder): do not add redirections to the list of subscriptions to avoid confusion
    * fix: update Wallabag URL label to avoid confusion
    * fix: improve pagination when having identical publication date
    * fix: do not strip tags in Atom entry title
    * feat(ntfy): Add option to use internal links
    * feat(locale): update Polish translation
    * feat(locale): update German translation
    * feat(integration): add Discord integration
    * feat(database): add optional build support for SQLite
    * feat: validate usernames upon creation
    * feat: replace `%{?systemd_requires}` with `%{?systemd_ordering}`
    * feat: bump linter and minifier from ECMAScript 2017 to 2020 (ES11)
    * feat: add `fix_ghost_cards` rewrite rule
    * ci: tighten the CodeQL rules
    * ci: run Docker tests only when the Dockerfiles are modified
    * ci: run `-race -cover` only on Ubuntu jobs
    * ci: don't specify languages for CodeQL
    * ci: don't run `go vet ./...` as it's run as part of `golangci-lint`
    * ci: checkout before installing Go to improve cache efficiency
    * ci: avoid building Linux packages for each pull-request
    * build(deps): bump `golang.org/x/oauth2` from `0.24.0` to `0.25.0`
    * build(deps): bump `golang.org/x/net` from `0.33.0` to `0.34.0`
    * build(deps): bump `golang.org/x/crypto` from `0.31.0` to `0.32.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.21.2` to `2.21.3`
    * build(deps): bump `github.com/PuerkitoBio/goquery` from `1.10.0` to `1.10.1`
    * build(deps): bump `github.com/coreos/go-oidc/v3` from `3.11.0` to `3.12.0`
    
  • 2.2.4

    Miniflux 2.2.4
    
    * test(rewrite): add unit test for referer rewrite function
    * refactor(subscription): use `strings.HasSuffix` instead of a regex in `FindSubscriptionsFromYouTubePlaylistPage`
    * refactor(sanitizer): use `token.String()` instead of `html.EscapeString(token.Data)`
    * refactor(sanitizer): simplify `isValidTag`
    * refactor(sanitizer): simplify `hasRequiredAttributes`
    * refactor(sanitizer): remove condition because `config.Opts` is guaranteed to never be nil
    * refactor(sanitizer): remove a now-useless function after refactoring
    * refactor(sanitizer): refactor conditions to highlight their similitude, enabling further refactoring
    * refactor(sanitizer): optimize `strip_tags.go`
    * refactor(sanitizer): micro-optimizations of `srcset.go`
    * refactor(sanitizer): merge two conditions
    * refactor(sanitizer): inline a function in `sanitizeAttributes` and fix a bug in it
    * refactor(sanitizer): inline a condition in `sanitizeSrcsetAttr`
    * refactor(sanitizer): improve `rewriteIframeURL()`
    * refactor(sanitizer): Google+ isn't a thing anymore
    * refactor(sanitizer): change the scope of a variable
    * refactor(rewriter): replace regex with URL parsing for referrer override
    * refactor(rewriter): avoid the use of regex in `addDynamicImage`
    * refactor(rewrite): remove unused function arguments
    * refactor(readability): various improvements and optimizations
    * refactor(readability): simplify the regexes in `readability.go`
    * refactor(processor): use URL parsing instead of a regex
    * refactor(processor): improve the `rewrite` URL rule regex
    * refactor(locale): delay parsing of translations until they're used
    * refactor(js): factorise a line in `app.js`
    * refactor(handler): delay `store.UserByID()` as much as possible
    * refactor(css): replace `-ms-text-size-adjust` with `text-size-adjust`
    * refactor(css): remove `-webkit-clip-path`
    * refactor(css): factorise `.pagination-next` and `.pagination-last` together
    * refactor: use a better construct than `doc.Find(…).First()`
    * refactor: use `min/max` instead of `math.Min/math.Max`
    * refactor: refactor `internal/reader/readability/testdata`
    * refactor: optimize `sanitizeAttributes`
    * refactor: get rid of `numberOfPluralFormsPerLanguage` test-only variable
    * fix(storage): replace timezone function call with view
    * fix(consistency): align feed modification behavior between API and UI
    * fix(ci): fix grammar in pull-request template
    * fix: load icon from site URL instead of feed URL
    * fix: feed icon from xml ignored during force refresh
    * feat(rewrite)!: remove `parse_markdown` rewrite rule
    * feat(mediaproxy): update predefined referer spoofing rules for restricted media resources
    * feat(locale): update translations to clarify readeck URL instead of readeck API endpoint
    * feat(locale): update German translations
    * feat(locale): update Chinese translations
    * feat(apprise): update `SendNotification` to handle multiple entries and add logging
    * feat(apprise): add title in notification request body
    * feat: resize favicons before storing them in the database
    * feat: optionally fetch watch time from YouTube API instead of website
    * feat: only show the commit URL if it's not empty on `/about`
    * feat: add predefined scraper rules for `arstechnica.com`
    * feat: add date-based entry filtering rules
    * chore: remove `blog.laravel.com` rewrite rule
    * build(deps): bump `library/alpine` in `/packaging/docker/alpine` to `3.21`
    * build(deps): bump `golang.org/x/term` from `0.26.0` to `0.27.0`
    * build(deps): bump `golang.org/x/net` from `0.31.0` to `0.33.0`
    * build(deps): bump `golang.org/x/crypto` from `0.30.0` to `0.31.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.21.1` to `2.21.2`
    
  • v2.2.3

    Miniflux 2.2.3
    
    * fix: unable to change password due to a typo in SQL parameter
    * fix: show only one player when there are several audio/video enclosures
    * feat(mediaproxy): pass original filename in `Content-Disposition` header
    * feat(mediaproxy): implement referer spoofing for restricted media resources
    * feat(integration): update Shiori integration to use new API endpoints for login/bookmark
    * build(deps): bump `golang.org/x/text` from `0.19.0` to `0.20.0`
    * build(deps): bump `golang.org/x/term` from `0.25.0` to `0.26.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.23.0` to `0.24.0`
    * build(deps): bump `golang.org/x/net` from `0.30.0` to `0.31.0`
    * build(deps): bump `golang.org/x/crypto` from `0.28.0` to `0.29.0`
    
  • 2.2.3

    Miniflux 2.2.3
    
    * fix: unable to change password due to a typo in SQL parameter
    * fix: show only one player when there are several audio/video enclosures
    * feat(mediaproxy): pass original filename in `Content-Disposition` header
    * feat(mediaproxy): implement referer spoofing for restricted media resources
    * feat(integration): update Shiori integration to use new API endpoints for login/bookmark
    * build(deps): bump `golang.org/x/text` from `0.19.0` to `0.20.0`
    * build(deps): bump `golang.org/x/term` from `0.25.0` to `0.26.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.23.0` to `0.24.0`
    * build(deps): bump `golang.org/x/net` from `0.30.0` to `0.31.0`
    * build(deps): bump `golang.org/x/crypto` from `0.28.0` to `0.29.0`
    
  • 2.2.2

    Miniflux 2.2.2
    
    * fix(webauthn): add backup eligibility flag workaround to avoid a 401 response
    * fix: update `Last-Modified` if it changes in a 304 response
    * feat(webauthn): show help message regarding username and non-discoverable credentials
    * feat(rss): calculate hash based on item title/content for feeds without GUID and link
    * feat(locale): update Chinese translations
    * feat(locale): update Polish translations
    * feat(integration): add Cubox integration
    * feat(client): add `custom_js` field to Go API client
    * feat(api): add endpoint for user integration status
    * feat: update feed icon during force refresh
    * feat: take `Retry-After` header into consideration for rate limited feeds
    * feat: set entry URL to rewritten URL if a rewrite rule is defined
    * feat: replace `xurls` third-party module with an ad-hoc regexp
    * feat: add new settings option to allow external fonts
    * feat: add custom user JavaScript similar to custom CSS
    * chore: update test case comment
    * build(deps): bump `golang.org/x/net` from `0.29.0` to `0.30.0`
    * build(deps): bump `github.com/yuin/goldmark` from `1.7.4` to `1.7.8`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.20.37` to `2.21.1`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build(deps): bump `github.com/andybalholm/brotli` from `1.1.0` to `1.1.1`
    
  • 2.2.1

    Miniflux 2.2.1
    
    * refactor: split processor package into smaller files
    * fix(mediaproxy): forward client user-agent to origin to bypass bot protection
    * fix: use root URL to generate absolute proxy URL
    * fix: remove progression save on shared entry
    * fix: add datasource variable and upgrade depecrated panels on the Grafana dashboard
    * feat(locale): update zh_CN translations
    * feat(locale): update Ukrainian translations
    * feat(locale): update Spanish translations
    * feat(locale): update Dutch translations
    * feat: use Bilibili API instead of web scraping to get videos watch time
    * feat: add pagination to shared entries listing
    * feat: add button to show only starred entries per category
    * build(deps): bump `golang.org/x/term` from `0.23.0` to `0.24.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.22.0` to `0.23.0`
    * build(deps): bump `golang.org/x/net` from `0.28.0` to `0.29.0`
    * build(deps): bump `github.com/PuerkitoBio/goquery` from `1.9.2` to `1.10.0`
    * build(deps): bump `github.com/prometheus/client_golang` from `1.20.3` to `1.20.4`
    * build(deps): bump `github.com/go-webauthn/webauthn` from `0.10.2` to `0.11.2`
    * build: update go.mod to Go 1.23
    * build: bump devcontainer version to Go 1.23
    
  • v2.2.0

    Miniflux 2.2.0
    
    * refactor: simplify Youtube feeds discovery
    * fix(integration): define content encoding explicitly when sending article body to Readeck
    * fix(fever): correct sorting direction when using `max_id` argument
    * fix(client): Return `nil` and error if endpoint is an empty string
    * fix: video poster image URL is encoded twice when using `MEDIA_PROXY_MODE=all`
    * fix: use `BASE_URL` instead of `r.Host` to generate absolute media proxy URL
    * fix: panic during YouTube channel feed discovery
    * fix: honor `hide_globally` when creating a new feed through the api
    * fix: align pagination correctly on small screens with non-English text
    * fix: `store.GetEnclosure()` should return `nil` if no rows are returned
    * feat(locale): update Turkish translations
    * feat(locale): update French translations
    * feat(locale): update Chinese` translations
    * feat(integration): add ntfy integration
    * feat(api): add API routes `/v1/enclosures/{enclosureID}`
    * feat: validate `OAUTH2_PROVIDER` config option value
    * feat: remove YouTube video page subscription finder because `meta[itemprop="channelId"]` no longer exists
    * feat: remove well-known URL parameter trackers
    * feat: mark media as read when playback reaches 90%
    * feat: change log level to info when running migrations
    * feat: allow customizing the display name of the OpenID Connect provider
    * feat: add support for `base` HTML element when discovering feeds
    * feat: add support for `aside` HTML element in entry content
    * feat: Add option to disable local auth form
    * feat: add license info to Javascript files for LibreJS compatibility
    * feat: add `FETCH_BILIBILI_WATCH_TIME` config option
    * docs: update links to filtering rules
    * chore: avoid using legacy key/value format in Dockerfile
    * build(deps): bump `golang.org/x/oauth2` from `0.21.0` to `0.22.0`
    * build(deps): bump `golang.org/x/net` from `0.27.0` to `0.28.0`
    * build(deps): bump `golang.org/x/crypto` from `0.25.0` to `0.26.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.20.36` to `2.20.37`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build: update GitHub Actions to Go 1.23
    * build: publish OCI images only if `PUBLISH_DOCKER_IMAGES=true`
    * build: bump Alpine Linux build image to v3.20
    * build: add sha256 checksum file for published binaries
    
  • 2.2.0

    Miniflux 2.2.0
    
    * refactor: simplify Youtube feeds discovery
    * fix(integration): define content encoding explicitly when sending article body to Readeck
    * fix(fever): correct sorting direction when using `max_id` argument
    * fix(client): Return `nil` and error if endpoint is an empty string
    * fix: video poster image URL is encoded twice when using `MEDIA_PROXY_MODE=all`
    * fix: use `BASE_URL` instead of `r.Host` to generate absolute media proxy URL
    * fix: panic during YouTube channel feed discovery
    * fix: honor `hide_globally` when creating a new feed through the api
    * fix: align pagination correctly on small screens with non-English text
    * fix: `store.GetEnclosure()` should return `nil` if no rows are returned
    * feat(locale): update Turkish translations
    * feat(locale): update French translations
    * feat(locale): update Chinese` translations
    * feat(integration): add ntfy integration
    * feat(api): add API routes `/v1/enclosures/{enclosureID}`
    * feat: validate `OAUTH2_PROVIDER` config option value
    * feat: remove YouTube video page subscription finder because `meta[itemprop="channelId"]` no longer exists
    * feat: remove well-known URL parameter trackers
    * feat: mark media as read when playback reaches 90%
    * feat: change log level to info when running migrations
    * feat: allow customizing the display name of the OpenID Connect provider
    * feat: add support for `base` HTML element when discovering feeds
    * feat: add support for `aside` HTML element in entry content
    * feat: Add option to disable local auth form
    * feat: add license info to Javascript files for LibreJS compatibility
    * feat: add `FETCH_BILIBILI_WATCH_TIME` config option
    * docs: update links to filtering rules
    * chore: avoid using legacy key/value format in Dockerfile
    * build(deps): bump `golang.org/x/oauth2` from `0.21.0` to `0.22.0`
    * build(deps): bump `golang.org/x/net` from `0.27.0` to `0.28.0`
    * build(deps): bump `golang.org/x/crypto` from `0.25.0` to `0.26.0`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.20.36` to `2.20.37`
    * build(deps): bump `github.com/prometheus/client_golang`
    * build: update GitHub Actions to Go 1.23
    * build: publish OCI images only if `PUBLISH_DOCKER_IMAGES=true`
    * build: bump Alpine Linux build image to v3.20
    * build: add sha256 checksum file for published binaries