Skip to content

Tags

Tags give the ability to mark specific points in history as being important
  • 2.2.5+tedomum.1
    b0dc80b2 · Update to 2.2.5 ·
    update to 2.2.5
    
  • 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`
    
  • 2.2.3+tedomum.2
    2.2.3+tedomum.2
    
  • 2.2.3+tedomum.1
    2.2.3+tedomum.1
    
  • 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+tedomum.1
    2.2.1+tedomum.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
    
  • 2.1.4
    b683756d · Update ChangeLog ·
    Miniflux 2.1.4
    
    * test: add unit tests for `IsModified()` behaviour
    * refactor: improve YouTube page feed detection
    * fix(ui): settings form is not populated correctly after validation errors
    * fix(ui): playback speed indicator precision
    * fix(ui): playback speed indicator on shared entries
    * fix(integration): preserve existing Pinboard bookmarks
    * fix(googlereader): set `CrawlTimeMsec` to the correct precision
    * fix(build): failed to solve container image `arm64v8/golang:1.22-bookworm`
    * fix(build): add `distroless` suffix on `latest` tag in GitHub workflow
    * fix: use `ETag` as a stronger validator than `Last-Modified`
    * fix: update `theverge.com` rewrite rule to avoid duplicate image
    * fix: incorrect Go package comment `reader/readingtime`
    * fix: error out for improper rewrite regexp when processing feed entries
    * fix: ensures that session cookies are not expiring before the session is cleaned up from the database as per `CLEANUP_REMOVE_SESSIONS_DAYS`
    * fix: `<img>` aspect ratio with `height: auto`
    * feat(ui): add `viewport-fit=cover`
    * feat(sanitizer): add support for HTML hidden attribute
    * feat(locale): update French translations
    * feat(integration): add Raindrop integration
    * feat(integration): add feed name to Telegram message
    * feat(integration): add Betula integration
    * feat: use of insecure TLS ciphers when "Allow self-signed or invalid certificates" is enabled to workaround some broken websites
    * feat: discover feeds from a Youtube playlist pages
    * feat: add navigation to last/first page
    * feat: add global block and keep filters
    * feat: add description field to feed settings
    * feat: add `pitchfork.com` scraping rule
    * feat: add `FETCH_NEBULA_WATCH_TIME` config option
    * Bump `github.com/PuerkitoBio/goquery` from` 1.9.1` to` 1.9.2`
    * Bump `github.com/prometheus/client_golang` from `1.19.0` to `1.19.1`
    * build(deps): bump `library/alpine` in `/packaging/docker/alpine`
    * build(deps): bump `golangci/golangci-lint-action` from `4` to `6`
    * build(deps): bump `golang.org/x/term` from `0.19.0` to `0.22.0`
    * build(deps): bump `golang.org/x/oauth2` from `0.19.0` to `0.21.0`
    * build(deps): bump `golang.org/x/net` from `0.22.0` to `0.27.0`
    * build(deps): bump `golang.org/x/crypto` from `0.24.0` to `0.25.0`
    * build(deps): bump `github.com/yuin/goldmark` from `1.7.1` to `1.7.4`
    * build(deps): bump `github.com/tdewolff/minify/v2` from `2.20.20` to `2.20.36`
    * build(deps): bump `github.com/coreos/go-oidc/v3` from `3.10.0` to `3.11.0`
    * build(deps): bump `docker/build-push-action` from `5` to `6`
    
  • 2.1.3
    Miniflux 2.1.3
    
    * `api`: `rand.Intn(math.MaxInt64)` causes tests to fail on 32-bit architectures (use `rand.Int()` instead)
    * `ci`: use `docker/metadata-action` instead of deprecated shell-scripts
    * `database`: remove `entries_feed_url_idx` index because entry URLs can exceeds btree index size limit
    * `finder`: find feeds from YouTube playlist
    * `http/response`: add brotli compression support
    * `integration/matrix`: fix function name in comment
    * `packaging`: specify container registry explicitly (e.g., Podman does not use `docker.io` by default)
    * `packaging`: use `make miniflux` instead of duplicating `go build` arguments (this leverages Go's PIE build mode)
    * `reader/fetcher`: add brotli content encoding support
    * `reader/processor`: minimize feed entries HTML content
    * `reader/rewrite`: add a rule for `oglaf.com`
    * `storage`: change `GetReadTime()` function to use `entries_feed_id_hash_key` index
    * `ui`: add seek and speed controls to media player
    * `ui`: add tag entries page
    * `ui`: fix JavaScript error when clicking on unread counter
    * `ui`: use `FORCE_REFRESH_INTERVAL` config for category refresh
    * Bump `github.com/tdewolff/minify/v2` from `2.20.19` to `2.20.20`
    * Bump `golang.org/x/net` from `0.22.0` to `0.24.0`
    * Bump `golang.org/x/term` from `0.18.0` to `0.19.0`
    * Bump `golang.org/x/oauth2` from `0.18.0` to `0.19.0`
    * Bump `github.com/yuin/goldmark` from `1.7.0` to `1.7.1`
    
  • v2.1.2
    0336774e · Update ChangeLog ·
    Miniflux 2.1.2
    
    * `api`: rewrite API integration tests without build tags
    * `ci`: add basic ESLinter checks
    * `ci`: enable go-critic linter and fix various issues detected
    * `ci`: fix JavaScript linter path in GitHub Actions
    * `cli`: avoid misleading error message when creating an admin user automatically
    * `config`: add `FILTER_ENTRY_MAX_AGE_DAYS` option
    * `config`: bump the number of simultaneous workers
    * `config`: rename `PROXY_*` options to `MEDIA_PROXY_*`
    * `config`: use `crypto.GenerateRandomBytes` instead of doing it by hand
    * `http/request`: refactor conditions to be more idiomatic
    * `http/response`: remove legacy `X-XSS-Protection` header
    * `integration/rssbrige`: fix rssbrige import
    * `integration/shaarli`: factorize the header+payload concatenation as data
    * `integration/shaarli`: no need to base64-encode then remove the padding when we can simply encode without padding
    * `integration/shaarli`: the JWT token was declared as using HS256 as algorithm, but was using HS512
    * `integration/webhook`: add category title to request body
    * `locale`: update Turkish translations
    * `man page`: sort config options in alphabetical order
    * `mediaproxy`: reduce the internal indentation of `ProxifiedUrl` by inverting some conditions
    * `mediaproxy`: simplify and refactor the package
    * `model`: replace` Optional{Int,Int64,Float64}` with a generic function `OptionalNumber()`
    * `model`: use struct embedding for `FeedCreationRequestFromSubscriptionDiscovery` to reduce code duplication
    * `reader/atom`: avoid debug message when the date is empty
    * `reader/atom`: change `if !a { a = } if !a {a = }` constructs into `if !a { a = ; if !a {a = }}` to reduce the number of comparisons and improve readability
    * `reader/atom`: Move the population of the feed's entries into a new function, to make BuildFeed easier to understand/separate concerns/implementation details
    * `reader/atom`: refactor Atom parser to use an adapter
    * `reader/atom`: use `sort+compact` instead of `compact+sort` to remove duplicates
    * `reader/atom`: when detecting the format, detect its version as well
    * `reader/encoding`: inline a one-liner function
    * `reader/handler`: fix force refresh feature
    * `reader/json`: refactor JSON Feed parser to use an adapter
    * `reader/media`: remove a superfluous error-check: `strconv.ParseInt` returns `0` when passed an empty string
    * `reader/media`: simplify switch-case by moving a common condition above it
    * `reader/processor`: compile block/keep regex only once per feed
    * `reader/rdf`: refactor RDF parser to use an adapter
    * `reader/rewrite`: inline some one-line functions
    * `reader/rewrite`: simplify `removeClickbait`
    * `reader/rewrite`: transform a free-standing function into a method
    * `reader/rewrite`: use a proper constant instead of a magic number in `applyFuncOnTextContent`
    * `reader/rss`: add support for `<media:category>` element
    * `reader/rss`: don't add empty tags to RSS items
    * `reader/rss`: refactor RSS parser to use a default namespace to avoid some limitations of the Go XML parser
    * `reader/rss`: refactor RSS Parser to use an adapter
    * `reader/rss`: remove some duplicated code in RSS parser
    * `reader`: ensure that enclosure URLs are always absolute
    * `reader`: move iTunes and GooglePlay XML definitions to their own packages
    * `reader`: parse podcast categories
    * `reader`: remove trailing space in `SiteURL` and `FeedURL`
    * `storage`: do not store empty tags
    * `storage`: simplify `removeDuplicates()` to use a `sort`+`compact` construct instead of doing it by hand with a hashmap
    * `storage`: Use plain strings concatenation instead of building an array and then joining it
    * `timezone`: make sure the tests pass when the timezone database is not installed on the host
    * `ui/css`: align `min-width` with the other `min-width` values
    * `ui/css`: fix regression: "Add to Home Screen" button is unreadable
    * `ui/js`: don't use lambdas to return a function, use directly the function instead
    * `ui/js`: enable trusted-types
    * `ui/js`: fix download button loading label
    * `ui/js`: fix JavaScript error on the login page when the user not authenticated
    * `ui/js`: inline one-line functions
    * `ui/js`: inline some `querySelectorAll` calls
    * `ui/js`: reduce the scope of some variables
    * `ui/js`: remove a hack for "Chrome 67 and earlier" since it was released in 2018
    * `ui/js`: replace `DomHelper.findParent` with `.closest`
    * `ui/js`: replace `let` with `const`
    * `ui/js`: simplify `DomHelper.getVisibleElements` by using a `filter` instead of a loop with an index
    * `ui/js`: use a `Set` instead of an array in a `KeyboardHandler`'s member
    * `ui/js`: use some ternaries where it makes sense
    * `ui/static`: make use of `HashFromBytes` everywhere
    * `ui/static`: set minifier ECMAScript version
    * `ui`: add keyboard shortcuts for scrolling to top/bottom of the item list
    * `ui`: add media player control playback speed
    * `ui`: remove unused variables and improve JSON decoding in `saveEnclosureProgression()`
    * `validator`: display an error message on edit feed page when the feed URL is not unique
    * Bump `github.com/coreos/go-oidc/v3` from `3.9.0` to `3.10.0`
    * Bump `github.com/go-webauthn/webauthn` from `0.10.1` to `0.10.2`
    * Bump `github.com/tdewolff/minify/v2` from `2.20.18` to `2.20.19`
    * Bump `google.golang.org/protobuf` from `1.32.0` to `1.33.0`
    
  • 2.1.2
    0336774e · Update ChangeLog ·
    Miniflux 2.1.2
    
    * `api`: rewrite API integration tests without build tags
    * `ci`: add basic ESLinter checks
    * `ci`: enable go-critic linter and fix various issues detected
    * `ci`: fix JavaScript linter path in GitHub Actions
    * `cli`: avoid misleading error message when creating an admin user automatically
    * `config`: add `FILTER_ENTRY_MAX_AGE_DAYS` option
    * `config`: bump the number of simultaneous workers
    * `config`: rename `PROXY_*` options to `MEDIA_PROXY_*`
    * `config`: use `crypto.GenerateRandomBytes` instead of doing it by hand
    * `http/request`: refactor conditions to be more idiomatic
    * `http/response`: remove legacy `X-XSS-Protection` header
    * `integration/rssbrige`: fix rssbrige import
    * `integration/shaarli`: factorize the header+payload concatenation as data
    * `integration/shaarli`: no need to base64-encode then remove the padding when we can simply encode without padding
    * `integration/shaarli`: the JWT token was declared as using HS256 as algorithm, but was using HS512
    * `integration/webhook`: add category title to request body
    * `locale`: update Turkish translations
    * `man page`: sort config options in alphabetical order
    * `mediaproxy`: reduce the internal indentation of `ProxifiedUrl` by inverting some conditions
    * `mediaproxy`: simplify and refactor the package
    * `model`: replace` Optional{Int,Int64,Float64}` with a generic function `OptionalNumber()`
    * `model`: use struct embedding for `FeedCreationRequestFromSubscriptionDiscovery` to reduce code duplication
    * `reader/atom`: avoid debug message when the date is empty
    * `reader/atom`: change `if !a { a = } if !a {a = }` constructs into `if !a { a = ; if !a {a = }}` to reduce the number of comparisons and improve readability
    * `reader/atom`: Move the population of the feed's entries into a new function, to make BuildFeed easier to understand/separate concerns/implementation details
    * `reader/atom`: refactor Atom parser to use an adapter
    * `reader/atom`: use `sort+compact` instead of `compact+sort` to remove duplicates
    * `reader/atom`: when detecting the format, detect its version as well
    * `reader/encoding`: inline a one-liner function
    * `reader/handler`: fix force refresh feature
    * `reader/json`: refactor JSON Feed parser to use an adapter
    * `reader/media`: remove a superfluous error-check: `strconv.ParseInt` returns `0` when passed an empty string
    * `reader/media`: simplify switch-case by moving a common condition above it
    * `reader/processor`: compile block/keep regex only once per feed
    * `reader/rdf`: refactor RDF parser to use an adapter
    * `reader/rewrite`: inline some one-line functions
    * `reader/rewrite`: simplify `removeClickbait`
    * `reader/rewrite`: transform a free-standing function into a method
    * `reader/rewrite`: use a proper constant instead of a magic number in `applyFuncOnTextContent`
    * `reader/rss`: add support for `<media:category>` element
    * `reader/rss`: don't add empty tags to RSS items
    * `reader/rss`: refactor RSS parser to use a default namespace to avoid some limitations of the Go XML parser
    * `reader/rss`: refactor RSS Parser to use an adapter
    * `reader/rss`: remove some duplicated code in RSS parser
    * `reader`: ensure that enclosure URLs are always absolute
    * `reader`: move iTunes and GooglePlay XML definitions to their own packages
    * `reader`: parse podcast categories
    * `reader`: remove trailing space in `SiteURL` and `FeedURL`
    * `storage`: do not store empty tags
    * `storage`: simplify `removeDuplicates()` to use a `sort`+`compact` construct instead of doing it by hand with a hashmap
    * `storage`: Use plain strings concatenation instead of building an array and then joining it
    * `timezone`: make sure the tests pass when the timezone database is not installed on the host
    * `ui/css`: align `min-width` with the other `min-width` values
    * `ui/css`: fix regression: "Add to Home Screen" button is unreadable
    * `ui/js`: don't use lambdas to return a function, use directly the function instead
    * `ui/js`: enable trusted-types
    * `ui/js`: fix download button loading label
    * `ui/js`: fix JavaScript error on the login page when the user not authenticated
    * `ui/js`: inline one-line functions
    * `ui/js`: inline some `querySelectorAll` calls
    * `ui/js`: reduce the scope of some variables
    * `ui/js`: remove a hack for "Chrome 67 and earlier" since it was released in 2018
    * `ui/js`: replace `DomHelper.findParent` with `.closest`
    * `ui/js`: replace `let` with `const`
    * `ui/js`: simplify `DomHelper.getVisibleElements` by using a `filter` instead of a loop with an index
    * `ui/js`: use a `Set` instead of an array in a `KeyboardHandler`'s member
    * `ui/js`: use some ternaries where it makes sense
    * `ui/static`: make use of `HashFromBytes` everywhere
    * `ui/static`: set minifier ECMAScript version
    * `ui`: add keyboard shortcuts for scrolling to top/bottom of the item list
    * `ui`: add media player control playback speed
    * `ui`: remove unused variables and improve JSON decoding in `saveEnclosureProgression()`
    * `validator`: display an error message on edit feed page when the feed URL is not unique
    * Bump `github.com/coreos/go-oidc/v3` from `3.9.0` to `3.10.0`
    * Bump `github.com/go-webauthn/webauthn` from `0.10.1` to `0.10.2`
    * Bump `github.com/tdewolff/minify/v2` from `2.20.18` to `2.20.19`
    * Bump `google.golang.org/protobuf` from `1.32.0` to `1.33.0`
    
  • v2.1.1
    382885f1 · Update changeLog ·
    Miniflux 2.1.1
    
    * Move search form to a dedicated page
    * Add Readeck integration
    * Add feed option to disable HTTP/2 to avoid fingerprinting
    * Add `Enter` key as a hotkey to open selected item
    * Proxify `video` element `poster` attribute
    * Add a couple of new possible locations for feeds
        * Hugo likes to generate `index.xml`
        * `feed.atom` and `feed.rss` are used by enterprise-scale/old-school gigantic CMS
    * Fix categories import from Thunderbird's OPML
    * Fix logo misalignment when using languages that are more verbose than English
    * Google Reader: Do not return a 500 error when no items is returned
    * Handle RDF feeds with duplicated `<title>` elements
    * Sort integrations alphabetically
    * Add more URL validation in media proxy
    * Add unit test to ensure each translation has the correct number of plurals
    * Add missing plurals for some languages
    * Makefile: quiet `git describe` and `rev-parse` stderr: When building from a tarball instead of a cloned git repo, there would be two `fatal: not a git repository` errors emitted even though the build succeeds. This is because of how `VERSION` and `COMMIT` are set in the Makefile. This PR suppresses the stderr for these variable assignments.
    * Makefile: do not force `CGO_ENABLED=0` for `miniflux` target
    * Add GitHub Action pipeline to build packages on-demand
    * Remove Golint (deprecated), use `staticcheck` and `golangci-lint` instead
    * Build amd64/arm64 Debian packages with CGO disabled
    * Update `go.mod` and add `.exe` suffix to Windows binary
    * Add a couple of fuzzers
    * Fix CodeQL workflow
    * Code and performance improvements:
        * Use an `io.ReadSeeker` instead of an `io.Reader` to parse feeds
        * Speed up the sanitizer:
            - Allow Youtube URLs to start with `www`
            - Use `strings.Builder` instead of a `bytes.Buffer`
            - Use a `strings.NewReader` instead of a `bytes.NewBufferString`
            - Sprinkles a couple of `continue` to make the code-flow more obvious
            - Inline calls to `inList`, and put their parameters in the right order
            - Simplify `isPixelTracker`
            - Simplify `isValidIframeSource`, by extracting the hostname and comparing it directly, instead of using the full url and checking if it starts with multiple variations of the same one (`//`, `http:`, `https://` multiplied by `/www.`)
            - Add a benchmark
            - Instead of having to allocate a ~100 keys map containing possibly dynamic values (at least to the go compiler), allocate it once in a global variable. This significantly speeds things up, by reducing the garbage
            - Use constant time access for maps instead of iterating on them
            - Build a ~large whitelist map inline instead of constructing it item by item (and remove a duplicate key/value pair)
            - Use `slices` instead of hand-rolled loops
        collector/allocator involvements.
        * Reuse a `Reader` instead of copying to a buffer when parsing an Atom feed
        * Preallocate memory when exporting to OPML: This should marginally increase performance when exporting a large amount of feeds to OPML
        * Delay call of `view.New` after logging the user in: There is no need to do extra work like creating a session and its associated view until the user has been properly identified and as many possibly-failing sql request have been successfully run
        * Use constant-time comparison for anti-csrf tokens: This is probably completely overkill, but since anti-csrf tokens are secrets, they should be compared against untrusted inputs in constant time
        * Simplify and optimize `genericProxyRewriter`
            - Reduce the amount of nested loops: it's preferable to search the whole page once and filter on it (even with filters that should always be false), than searching it again for every element we're looking for.
            - Factorize the proxying conditions into a `shouldProxy` function to reduce the copy-pasta.
        * Speed up `removeUnlikelyCandidates`: `.Not` returns a brand new `Selection`, copied element by element
        * Improve `EstimateReadingTime`'s speed by a factor 7
            - Refactorise the tests and add some
            - Use 250 signs instead of the whole text
            - Only check for Korean, Chinese and Japanese script
            - Add a benchmark
            - Use a more idiomatic control flow
        * Don't compute reading-time when unused: If the user doesn't display reading times, there is no need to compute them. This should speed things up a bit, since `whatlanggo.Detect` is abysmally slow.
        * Simplify `username` generation for the integration tests: No need to generate random numbers 10 times, generate a single big-enough one. A single int64 should be more than enough
        * Add missing regex anchor detected by CodeQL
        * Don't mix up slices capacity and length
        * Use prepared statements for intervals, `ArchiveEntries` and `updateEnclosures`
        * Use modern for-loops introduced with Go 1.22
        * Remove a superfluous condition: No need to check if the length of `line` is positive since we're checking afterwards that it contains the `=` sign
        * Close resources as soon as possible, instead of using `defer()` in a loop
        * Remove superfluous escaping in a regex
        * Use `strings.ReplaceAll` instead of `strings.Replace(…, -1)`
        * Use `strings.EqualFold` instead of `strings.ToLower(…) ==`
        * Use `.WriteString(` instead of `.Write([]byte(…`
        * Use `%q` instead of `"%s"`
        * Make `internal/worker/worker.go` read-only
        * Use a switch-case construct in `internal/locale/plural.go` instead of an avalanche of `if`
        * Template functions: simplify `formatFileSize` and `duration` implementation
        * Inline some templating functions
        * Make use of `printer.Print` when possible
        * Add a `printer.Print` to `internal/locale/printer.go`: No need to use variadic functions with string format interpolation to generate static strings
        * Minor code simplification in `internal/ui/view/view.go`: No need to create the map item by item when we can create it in one go
        * Build the map inline in `CountAllFeeds()`: No need to build an empty map to then add more fields in it one by one
        * Miscellaneous improvements to `internal/reader/subscription/finder.go`:
            - Surface `localizedError` in `FindSubscriptionsFromWellKnownURLs` via `slog`
            - Use an inline declaration for new subscriptions, like done elsewhere in the
            file, if only for consistency's sake
            - Preallocate the `subscriptions` slice when using an RSS-bridge,
        * Use an update-where for `MarkCategoryAsRead` instead of a subquery
        * Simplify `CleanOldUserSessions`' query: No need for a subquery, filtering on `created_at` directly is enough
        * Simplify `cleanupEntries`' query
            - `NOT (hash=ANY(%4))` can be expressed as `hash NOT IN $4`
            - There is no need for a subquery operating on the same table, moving the conditions out is equivalent.
        * Reformat `ArchiveEntries`'s query for consistency's sake and replace the `=ANY` with an `IN`
        * Reformat the query in `GetEntryIDs` and `GetReadTime`'s query for consistency's sake
        * Simplify `WeeklyFeedEntryCount`: No need for a `BETWEEN`: we want to filter on entries published in the last week, no need to express is as "entries published between now and last week", "entries published after last week" is enough
        * Add some tests for `add_image_title`
        * Remove `github.com/google/uuid` dependencies: Replace it with a hand-rolled implementation. Heck, an UUID isn't even a requirement according to Omnivore API docs
        * Simplify `internal/reader/icon/finder.go`:
            - Use a simple regex to parse data uri instead of a hand-rolled parser, and document what fields are considered mandatory.
            - Use case-insensitive matching to find (fav)icons, instead of doing the same query twice with different letter cases
            - Add `apple-touch-icon-precomposed.png` as a fallback `favicon`
            - Reorder the queries to have `icon` first, since it seems to be the most popular one. It used to be last, meaning that pages had to be parsed completely 4 times, instead of one now.
            - Minor factorisation in `findIconURLsFromHTMLDocument`
        * Small refactoring of `internal/reader/date/parser.go`:
            - Split dates formats into those that require local times and those who don't, so that there is no need to have a switch-case in the for loop with around 250 iterations at most.
            - Be more strict when it comes to timezones, previously invalid ones like -13 were accepted. Also add a test for this.
            - Bail out early if the date is an empty string.
        * Make use of Go ≥ 1.21 slices package instead of hand-rolled loops
        * Reorder the fields of the `Entry` struct to save some memory
    * Dependencies update:
        * Bump `golang.org/x/oauth2` from `0.17.0` to `0.18.0`
        * Bump `github.com/prometheus/client_golang` from `1.18.0` to `1.19.0`
        * Bump `github.com/tdewolff/minify/v2` from `2.20.16` to `2.20.18`
        * Bump `github.com/PuerkitoBio/goquery` from `1.8.1` to `1.9.1`
        * Bump `golang.org/x/crypto` from `0.19.0` to `0.20.0`
        * Bump `github.com/go-jose/go-jose/v3` from `3.0.1` to `3.0.3`
    
  • 2.1.1
    382885f1 · Update changeLog ·
    Miniflux 2.1.1
    
    * Move search form to a dedicated page
    * Add Readeck integration
    * Add feed option to disable HTTP/2 to avoid fingerprinting
    * Add `Enter` key as a hotkey to open selected item
    * Proxify `video` element `poster` attribute
    * Add a couple of new possible locations for feeds
        * Hugo likes to generate `index.xml`
        * `feed.atom` and `feed.rss` are used by enterprise-scale/old-school gigantic CMS
    * Fix categories import from Thunderbird's OPML
    * Fix logo misalignment when using languages that are more verbose than English
    * Google Reader: Do not return a 500 error when no items is returned
    * Handle RDF feeds with duplicated `<title>` elements
    * Sort integrations alphabetically
    * Add more URL validation in media proxy
    * Add unit test to ensure each translation has the correct number of plurals
    * Add missing plurals for some languages
    * Makefile: quiet `git describe` and `rev-parse` stderr: When building from a tarball instead of a cloned git repo, there would be two `fatal: not a git repository` errors emitted even though the build succeeds. This is because of how `VERSION` and `COMMIT` are set in the Makefile. This PR suppresses the stderr for these variable assignments.
    * Makefile: do not force `CGO_ENABLED=0` for `miniflux` target
    * Add GitHub Action pipeline to build packages on-demand
    * Remove Golint (deprecated), use `staticcheck` and `golangci-lint` instead
    * Build amd64/arm64 Debian packages with CGO disabled
    * Update `go.mod` and add `.exe` suffix to Windows binary
    * Add a couple of fuzzers
    * Fix CodeQL workflow
    * Code and performance improvements:
        * Use an `io.ReadSeeker` instead of an `io.Reader` to parse feeds
        * Speed up the sanitizer:
            - Allow Youtube URLs to start with `www`
            - Use `strings.Builder` instead of a `bytes.Buffer`
            - Use a `strings.NewReader` instead of a `bytes.NewBufferString`
            - Sprinkles a couple of `continue` to make the code-flow more obvious
            - Inline calls to `inList`, and put their parameters in the right order
            - Simplify `isPixelTracker`
            - Simplify `isValidIframeSource`, by extracting the hostname and comparing it directly, instead of using the full url and checking if it starts with multiple variations of the same one (`//`, `http:`, `https://` multiplied by `/www.`)
            - Add a benchmark
            - Instead of having to allocate a ~100 keys map containing possibly dynamic values (at least to the go compiler), allocate it once in a global variable. This significantly speeds things up, by reducing the garbage
            - Use constant time access for maps instead of iterating on them
            - Build a ~large whitelist map inline instead of constructing it item by item (and remove a duplicate key/value pair)
            - Use `slices` instead of hand-rolled loops
        collector/allocator involvements.
        * Reuse a `Reader` instead of copying to a buffer when parsing an Atom feed
        * Preallocate memory when exporting to OPML: This should marginally increase performance when exporting a large amount of feeds to OPML
        * Delay call of `view.New` after logging the user in: There is no need to do extra work like creating a session and its associated view until the user has been properly identified and as many possibly-failing sql request have been successfully run
        * Use constant-time comparison for anti-csrf tokens: This is probably completely overkill, but since anti-csrf tokens are secrets, they should be compared against untrusted inputs in constant time
        * Simplify and optimize `genericProxyRewriter`
            - Reduce the amount of nested loops: it's preferable to search the whole page once and filter on it (even with filters that should always be false), than searching it again for every element we're looking for.
            - Factorize the proxying conditions into a `shouldProxy` function to reduce the copy-pasta.
        * Speed up `removeUnlikelyCandidates`: `.Not` returns a brand new `Selection`, copied element by element
        * Improve `EstimateReadingTime`'s speed by a factor 7
            - Refactorise the tests and add some
            - Use 250 signs instead of the whole text
            - Only check for Korean, Chinese and Japanese script
            - Add a benchmark
            - Use a more idiomatic control flow
        * Don't compute reading-time when unused: If the user doesn't display reading times, there is no need to compute them. This should speed things up a bit, since `whatlanggo.Detect` is abysmally slow.
        * Simplify `username` generation for the integration tests: No need to generate random numbers 10 times, generate a single big-enough one. A single int64 should be more than enough
        * Add missing regex anchor detected by CodeQL
        * Don't mix up slices capacity and length
        * Use prepared statements for intervals, `ArchiveEntries` and `updateEnclosures`
        * Use modern for-loops introduced with Go 1.22
        * Remove a superfluous condition: No need to check if the length of `line` is positive since we're checking afterwards that it contains the `=` sign
        * Close resources as soon as possible, instead of using `defer()` in a loop
        * Remove superfluous escaping in a regex
        * Use `strings.ReplaceAll` instead of `strings.Replace(…, -1)`
        * Use `strings.EqualFold` instead of `strings.ToLower(…) ==`
        * Use `.WriteString(` instead of `.Write([]byte(…`
        * Use `%q` instead of `"%s"`
        * Make `internal/worker/worker.go` read-only
        * Use a switch-case construct in `internal/locale/plural.go` instead of an avalanche of `if`
        * Template functions: simplify `formatFileSize` and `duration` implementation
        * Inline some templating functions
        * Make use of `printer.Print` when possible
        * Add a `printer.Print` to `internal/locale/printer.go`: No need to use variadic functions with string format interpolation to generate static strings
        * Minor code simplification in `internal/ui/view/view.go`: No need to create the map item by item when we can create it in one go
        * Build the map inline in `CountAllFeeds()`: No need to build an empty map to then add more fields in it one by one
        * Miscellaneous improvements to `internal/reader/subscription/finder.go`:
            - Surface `localizedError` in `FindSubscriptionsFromWellKnownURLs` via `slog`
            - Use an inline declaration for new subscriptions, like done elsewhere in the
            file, if only for consistency's sake
            - Preallocate the `subscriptions` slice when using an RSS-bridge,
        * Use an update-where for `MarkCategoryAsRead` instead of a subquery
        * Simplify `CleanOldUserSessions`' query: No need for a subquery, filtering on `created_at` directly is enough
        * Simplify `cleanupEntries`' query
            - `NOT (hash=ANY(%4))` can be expressed as `hash NOT IN $4`
            - There is no need for a subquery operating on the same table, moving the conditions out is equivalent.
        * Reformat `ArchiveEntries`'s query for consistency's sake and replace the `=ANY` with an `IN`
        * Reformat the query in `GetEntryIDs` and `GetReadTime`'s query for consistency's sake
        * Simplify `WeeklyFeedEntryCount`: No need for a `BETWEEN`: we want to filter on entries published in the last week, no need to express is as "entries published between now and last week", "entries published after last week" is enough
        * Add some tests for `add_image_title`
        * Remove `github.com/google/uuid` dependencies: Replace it with a hand-rolled implementation. Heck, an UUID isn't even a requirement according to Omnivore API docs
        * Simplify `internal/reader/icon/finder.go`:
            - Use a simple regex to parse data uri instead of a hand-rolled parser, and document what fields are considered mandatory.
            - Use case-insensitive matching to find (fav)icons, instead of doing the same query twice with different letter cases
            - Add `apple-touch-icon-precomposed.png` as a fallback `favicon`
            - Reorder the queries to have `icon` first, since it seems to be the most popular one. It used to be last, meaning that pages had to be parsed completely 4 times, instead of one now.
            - Minor factorisation in `findIconURLsFromHTMLDocument`
        * Small refactoring of `internal/reader/date/parser.go`:
            - Split dates formats into those that require local times and those who don't, so that there is no need to have a switch-case in the for loop with around 250 iterations at most.
            - Be more strict when it comes to timezones, previously invalid ones like -13 were accepted. Also add a test for this.
            - Bail out early if the date is an empty string.
        * Make use of Go ≥ 1.21 slices package instead of hand-rolled loops
        * Reorder the fields of the `Entry` struct to save some memory
    * Dependencies update:
        * Bump `golang.org/x/oauth2` from `0.17.0` to `0.18.0`
        * Bump `github.com/prometheus/client_golang` from `1.18.0` to `1.19.0`
        * Bump `github.com/tdewolff/minify/v2` from `2.20.16` to `2.20.18`
        * Bump `github.com/PuerkitoBio/goquery` from `1.8.1` to `1.9.1`
        * Bump `golang.org/x/crypto` from `0.19.0` to `0.20.0`
        * Bump `github.com/go-jose/go-jose/v3` from `3.0.1` to `3.0.3`
    
  • 2.1.0
    8b467580 · Update ChangeLog ·
    Miniflux 2.1.0
    
    * Add Linkwarden integration
    * Add LinkAce integration
    * Add `FORCE_REFRESH_INTERVAL` config option
    * Add `item-meta-info-reading-time` CSS class
    * Add `add_dynamic_iframe` rewrite function
    * Add attribute `data-original-mos` to `add_dynamic_image` rewrite candidates
    * Update entry processor to allow blocking/keeping entries by tags and/or authors
    * Change default `Accept` header when fetching feeds
    * Rewrite relative RSS Bridge URL to absolute URL
    * Use numeric user ID in Alpine and distroless container image (avoid `securityContext` error in Kubernetes)
    * Always try to use HTTP/2 when fetching feeds if available
    * Add `type` attribute in OPML export as per OPML 2.0 specs
    * Fix missing translation argument for the key `error.unable_to_parse_feed`
    * Fix Debian package builder when using Go 1.12 and `armhf` architecture
    * Fix typo in log message
    * Fix incorrect label shown when saving an article
    * Fix incorrect condition in refresh feeds cli
    * Fix incorrect label `for` attribute
    * Add missing label ID for custom CSS field
    * Accessibility improvements:
        * Add workaround for macOS VoiceOver that didn't announce `details` and `summary` when expanded
        * Add `alert` role to alert message element
        * Add a `h2` heading to the article element so that the screen reader users can navigate the article through the heading level
        * Add an `aria-label` attribute for the article element for screen readers
        * Remove the icon image `alt` attribute in feeds list to prevent screen reader to announce it before entry title
        * Add `sr-only` CSS class for screen reader users (provides more context)
        * Differentiate between buttons and links
        * Change links that could perform actions to buttons
        * Improve translation of hidden Aria elements
        * Remove the redundant article role
        * Add a search landmark for the search form so that the screen reader users can navigate to it
        * Add skip to content link
        * Add `nav` landmark to page header links
    * Limit feed/category entry pagination to unread entries when coming from unread entry list
    * Update German translation
    * Update GitHub Actions to Go 1.12
    * Bump `golang.org/x/term` from `0.16.0` to `0.17.0`
    * Bump `github.com/google/uuid` from `1.5.0` to `1.6.0`
    * Bump `github.com/yuin/goldmark` from `1.6.0` to `1.7.0`
    * Bump `golang.org/x/oauth2` from `0.15.0` to `0.17.0`
    * Bump `github.com/tdewolff/minify/v2` from `2.20.10` to `2.20.12`
    * Bump `golang.org/x/term` from `0.15.0` to `0.16.0`
    * Bump `github.com/prometheus/client_golang` from `1.17.0` to `1.18.0`
    * Bump `github.com/tdewolff/minify/v2` from `2.20.9` to `2.20.16`
    * Bump `golang.org/x/crypto` from `0.16.0` to `0.19.0`
    * Bump `github.com/go-webauthn/webauthn` from `0.9.4` to` 0.10.1`
    * Bump `golang.org/x/net` from `0.20.0` to `0.21.0`
    
  • 2.0.51
    7990edd3 · Update ChangeLog ·
    Miniflux 2.0.51
    
    * Add Omnivore integration
    * Fixes for the regressions introduced in version 2.0.50:
        * Ensure all HTML documents are encoded in UTF-8
        * Send default User-Agent and HTTP caching headers when making HTTP requests
    * Allow Youtube links to be opened outside the `iframe` (avoid `ERR_BLOCKED_BY_RESPONSE` error)
    * Fix inaccessible metrics endpoint when listening on Unix socket
    * Allow renaming and moving feed at the same time in the Google Reader API
    * Log `nb_jobs` only when number of jobs is larger than 0 in background scheduler
    * Deduplicate feed URLs when parsing HTML document during discovery process
    * Calculate a virtual weekly count based on the average updating frequency (`POLLING_SCHEDULER=entry_frequency`)
    * Update GitHub Actions workflow to be able to run the linter and tests on-demand
    * Add `SCHEDULER_ROUND_ROBIN_MIN_INTERVAL` config option
    * Add links to GitHub for the commit hash and the version in the about page
    * Use "starred" rather than "bookmarked" in English translation
    * Update Chinese (CN & TW) translation
    * Bump `github.com/google/uuid` from `1.4.0` to `1.5.0`
    * Bump `github.com/coreos/go-oidc/v3` from `3.7.0` to `3.9.0`
    * Bump `github.com/tdewolff/minify/v2` from `2.20.6` to `2.20.9`
    * Bump `github.com/go-webauthn/webauthn` from `0.8.6` to `0.9.4`
    * Bump `golang.org/x/oauth2` from `0.14.0` to `0.15.0`