-
2.2.1faa70f30 · ·
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.03e0e8dda · ·
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.03e0e8dda · ·
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.4b683756d · ·
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.34d3ee0d1 · ·
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.20336774e · ·
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.20336774e · ·
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.1382885f1 · ·
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.1382885f1 · ·
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.08b467580 · ·
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.517990edd3 · ·
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`
-
-
2.0.50d195ce63 · ·
Miniflux 2.0.50 * Add WebAuthn / Passkey integration * Add RSS-Bridge integration * Take RSS TTL field into consideration to schedule next check date * Show number of visible entries instead of number of read entries in feed list * OpenID Connect: Redirect to configured user home page after successful authentication * Google Reader API fixes: * `user/{userID}/state/com.google/read` is missing in categories section for read entries * Take `ExcludeTargets` into consideration in feed stream handler * Allow iframes pointing to Twitch videos * Filter feed entries based on URL or title * Take into consideration `hide_globally` property defined for categories in `/v1/entries` API endpoint * Add category ID to webhooks request body * Update date parser to parse more invalid date formats * Refactor feed discovery handler, and avoid an extra HTTP request if the URL provided is the feed * Refactor HTTP Client and `LocalizedError` packages * Refactor Batch Builder, and prevent accidental and excessive refreshes from the web UI * Refactor icon finder: - Continue the discovery process when the feed icon is invalid - Search all icons from the HTML document and do not stop on the first one * Add support for SVG icons with data URL without encoding * Expose `next_check_at` in the web ui and API * Add database indexes to improve performance * Change log level to warning for failed feeds refresh in cronjob * Do not log website without icon as warning * Add GitHub workflow to build binaries * Add GitHub extensions to devcontainer * Make sure to pull the latest base image when building the Docker image * Strip version prefix when building Debian package * Add `github-cli` and `docker-outside-of-docker` features to devcontainer * Bump `golang.org/x/*` dependencies * Bump `github.com/gorilla/mux` from `1.8.0` to `1.8.1` * Bump `github.com/tdewolff/minify/v2` from `2.19.9` to `2.20.6` * Bump `github.com/yuin/goldmark` from `1.5.6` to `1.6.0` * Bump `github.com/coreos/go-oidc/v3` from `3.6.0` to `3.7.0`
-
v2.0.4954eb5003 · ·
Miniflux 2.0.49 * Implement structured logging using `log/slog` package. New config options available: * `LOG_FORMAT`: `json` or `text` * `LOG_LEVEL`: `debug`, `info`, `warning`, or `error` * `LOG_FILE`: `sdterr`, `stdout`, or a file path * The `DEBUG` option is now deprecated in favor of `LOG_LEVEL` * API Improvements: * Add endpoint `/v1/version` * Add endpoint `PUT /v1/entries` to update entry title and content * Add endpoint `/v1/icons/{iconID}` * Add endpoint `/v1/flush-history` to flush history * Make the category optional when creating feeds for API clients who don't support categories * Add enclosures to `GET /v1/entries` endpoint * Add `published_after`, `published_before`, `changed_after` and `changed_before` options to `/v1/entries` endpoint * Telegram integration improvements: * Replace feed HTML link with a button to avoid page preview issues * Add the possibility to disable buttons * Add Bruno Miniflux API collection in `contrib` folder (Bruno is an open source alternative to Postman/Insomnia) * Add command line argument to export user feeds as OPML * Add new rewrite rules `add_hn_links_using_hack` and `add_hn_links_using_opener` to open HN comments with iOS apps * Fix timestamp format for `Expires` response header * Fix Javascript error when reading time option is disabled * Fix Apprise logic to handle feed service URLs * Fix missing word in force refresh message * Remove deprecated `PreferServerCipherSuites` TLS option * Replace `github.com/rylans/getlang` with `github.com/abadojack/whatlanggo` because `getlang` doesn't seems to be updated anymore * Bump `github.com/mccutchen/go-httpbin/v2` from `2.11.0` to `2.11.1` * Bump `golang.org/x/*` dependencies
-
2.0.4954eb5003 · ·
Miniflux 2.0.49 * Implement structured logging using `log/slog` package. New config options available: * `LOG_FORMAT`: `json` or `text` * `LOG_LEVEL`: `debug`, `info`, `warning`, or `error` * `LOG_FILE`: `sdterr`, `stdout`, or a file path * The `DEBUG` option is now deprecated in favor of `LOG_LEVEL` * API Improvements: * Add endpoint `/v1/version` * Add endpoint `PUT /v1/entries` to update entry title and content * Add endpoint `/v1/icons/{iconID}` * Add endpoint `/v1/flush-history` to flush history * Make the category optional when creating feeds for API clients who don't support categories * Add enclosures to `GET /v1/entries` endpoint * Add `published_after`, `published_before`, `changed_after` and `changed_before` options to `/v1/entries` endpoint * Telegram integration improvements: * Replace feed HTML link with a button to avoid page preview issues * Add the possibility to disable buttons * Add Bruno Miniflux API collection in `contrib` folder (Bruno is an open source alternative to Postman/Insomnia) * Add command line argument to export user feeds as OPML * Add new rewrite rules `add_hn_links_using_hack` and `add_hn_links_using_opener` to open HN comments with iOS apps * Fix timestamp format for `Expires` response header * Fix Javascript error when reading time option is disabled * Fix Apprise logic to handle feed service URLs * Fix missing word in force refresh message * Remove deprecated `PreferServerCipherSuites` TLS option * Replace `github.com/rylans/getlang` with `github.com/abadojack/whatlanggo` because `getlang` doesn't seems to be updated anymore * Bump `github.com/mccutchen/go-httpbin/v2` from `2.11.0` to `2.11.1` * Bump `golang.org/x/*` dependencies
-
2.0.48545c68a0 · ·
Miniflux 2.0.48 * Add generic webhook integration * Send webhook events when new entries are detected * Send wehbook events when saving an entry * Sign the outgoing requests with HMAC-SHA256 * Improve Telegram integration * Add built-in Telegram client * Remove dependency on `go-telegram-bot-api` library * Add new options: * Optional topic ID * Disable page preview * Disable notifications * Add new button to go to article * Improve Matrix integration * Add built-in Matrix client * Remove dependency on `gomatrix` library * Send HTML formatted messages to Matrix * OpenID Connect authentication improvements: * Add OAuth2 PKCE support * Add `profile` scope to OIDC integration to support accounts without email address * Prevent empty username when using the OIDC integration * Add `factor` for `entry_frequency` scheduler: * Allow the user to increase the frequency of the `entry_frequency` scheduler by a configurable factor in order to shorten the time between updates. * Fix: status bar is unreadable when using PWA in dark mode on Firefox Android * Group form fields into fieldsets to improve page layout * Update Russian translation * Make sure icon URLs are always absolute * Add Apprise service URLs per feed * Trim `username` and `password` form fields * Strip HTML tags from DublinCore Creator tags * Fix scroll up behavior on Firefox Android * Add missing `return` statement in `fetchContent` UI handler * Add `replace_title` rewrite rule to adjust entry titles * Fix Pocket integration redirect URL and Google Reader API HREF * Fix feed `hide_globally` property to use it with third-party clients.
-
v2.0.48b454d93c · ·
Miniflux 2.0.48 * Add generic webhook integration * Send webhook events when new entries are detected * Send wehbook events when saving an entry * Sign the outgoing requests with HMAC-SHA256 * Improve Telegram integration * Add built-in Telegram client * Remove dependency on `go-telegram-bot-api` library * Add new options: * Optional topic ID * Disable page preview * Disable notifications * Add new button to go to article * Improve Matrix integration * Add built-in Matrix client * Remove dependency on `gomatrix` library * Send HTML formatted messages to Matrix * OpenID Connect authentication improvements: * Add OAuth2 PKCE support * Add `profile` scope to OIDC integration to support accounts without email address * Prevent empty username when using the OIDC integration * Add `factor` for `entry_frequency` scheduler: * Allow the user to increase the frequency of the `entry_frequency` scheduler by a configurable factor in order to shorten the time between updates. * Fix: status bar is unreadable when using PWA in dark mode on Firefox Android * Group form fields into fieldsets to improve page layout * Update Russian translation * Make sure icon URLs are always absolute * Add Apprise service URLs per feed * Trim `username` and `password` form fields * Strip HTML tags from DublinCore Creator tags * Fix scroll up behavior on Firefox Android * Add missing `return` statement in `fetchContent` UI handler * Add `replace_title` write rule to adjust entry titles * Fix Pocket integration redirect URL and Google Reader API HREF * Fix feed `hide_globally` property to use it with third-party clients.