Releases: miniflux/v2
Release list
Miniflux 2.3.3
New features
-
Feed and entry language detection
- Miniflux now reads the language declared by feeds and entries and stores it on both feeds and entries. Supported sources are the RSS
<language>and<dc:language>elements,xml:langon Atom 1.0 and 0.3 documents,dc:languagein RDF/RSS 1.0 feeds, and thelanguagefield of JSON Feed. - Entries without their own language now inherit the language declared by the feed.
- Article titles and content are rendered with a matching
langattribute, which improves screen reader pronunciation, hyphenation, and browser translation prompts. - The
languagefield is exposed through the API and the Go client for both feeds and entries.
- Miniflux now reads the language declared by feeds and entries and stores it on both feeds and entries. Supported sources are the RSS
-
Other additions
- Feed discovery now finds the feeds offered by GitHub pages.
- TLS certificates are reloaded when the process receives
SIGHUP, so renewed certificates can be picked up without a restart. - The browser favicon is now served as SVG for a sharper icon on high-density displays.
- Compressed responses are negotiated with a much more standard-compliant
Accept-Encodingparser, including quality values and wildcards.
Performance improvements
- Long entry and feed lists render noticeably faster: off-screen rows no longer cost layout and paint work on initial render.
- Reduced memory allocations when stripping and truncating HTML, roughly halving the time spent on tag-heavy content.
- Compression writers are now pooled instead of being allocated for every compressed response, which significantly reduces garbage collection pressure on busy instances.
Security
- Fixed an information disclosure issue where any authenticated user could read favicons belonging to other users' feeds through
GET /v1/icons/{iconID}. - Unix sockets are now created with
0660permissions instead of being world-writable. Deployments where the reverse proxy runs as a different user now require that user to share a group with the Miniflux process. - Fixed an issue where
limit=0in entry queries bypassed the 1000-entry cap and returned every matching entry. - Feed-declared language values are now validated before being stored, keeping oversized values and control characters out of the database and the rendered HTML.
Bug fixes
- Fixed a crash caused by concurrent writes to the translation catalog when several requests used a not-yet-loaded language.
- Fixed a race condition during template rendering that could return a page translated in another user's language.
- Fixed a panic during graceful shutdown when feed refresh jobs were queued while workers were draining.
- Fixed a division-by-zero crash with the
entry_frequencyscheduler whenSCHEDULER_ENTRY_FREQUENCY_FACTORwas set to0; the value must now be greater than or equal to1. - Fixed an upgrade failure of migration 127 on databases containing entries whose feed no longer exists.
MEDIA_PROXY_RESOURCE_TYPESandTRUSTED_REVERSE_PROXY_NETWORKSnow accept spaces and trailing commas in their list values instead of refusing to start.- Fixed "Mark all as read" on the unread page, which marked entries from categories hidden from the global unread list.
- Fixed a category deletion check that could remove all of a user's categories.
- Fixed pagination in the Entries API: the total count is now correct when the requested offset is past the last entry.
- Fixed the
no_media_playeroption being ignored when creating a feed. - A feed proxy URL can now be cleared once it has been configured.
- Fixed
entry_sorting_ordervalidation on user modification, which returned a server error instead of a validation error for unsupported values. - Fixed the
fetch_via_proxycheckbox disappearing when the subscription page was re-rendered after an error. - Fixed the
remove_tablesrewrite rule reordering article content. - Fixed plain text
content_textandsummaryvalues from JSON Feed being mangled when they contained markup-like characters. - Fixed empty tags being sent to Raindrop when no tag was configured.
- Fixed overlapping article headings that wrap onto multiple lines.
- Fixed Atom language parsing to only consider namespace-qualified
xml:langattributes.
Dependencies
Updated several Go modules and GitHub Actions dependencies, including:
github.com/andybalholm/brotli1.2.2github.com/coreos/go-oidc/v33.20.0github.com/prometheus/client_golang1.24.0golang.org/x/crypto0.54.0golang.org/x/net0.57.0golang.org/x/text0.40.0
As always, thank you to all contributors who helped improve Miniflux in this release.
Miniflux 2.3.2
New features
-
Improved full-text search
- Search queries now use PostgreSQL's
websearch_to_tsquery, allowing quoted phrases,ORoperators, and negation (-term) in search expressions.
- Search queries now use PostgreSQL's
-
API improvements
- Added
GET /v1/entries/idsto efficiently retrieve paginated entry IDs. - Added support for updating the starred status of multiple entries through
PUT /v1/entries. - API clients can now filter entries by tags.
- The Go client now exposes additional feed fields (
description,icon,next_check_at, notification settings,no_media_player, etc.) and supports the new tag filter.
- Added
-
Atom feed improvements
- When an Atom entry
idcontains an HTTP URL, it is now used as the entry URL when no dedicated link is available.
- When an Atom entry
Performance improvements
- Improved full-text search performance by caching compiled regular expressions used by filtering rules.
- Reduced database work when computing category statistics.
- Improved browser caching of static assets.
- Reduced template rendering overhead by precomputing static icon URLs.
Security
- Prevent username enumeration through login timing differences.
- PostgreSQL installations running in FIPS mode are now fully supported by replacing MD5 with SHA-256 for enclosure uniqueness. This change raises the minimum supported PostgreSQL version to 11.
Bug fixes
- Fixed validation of per-feed entry filter rules in the web interface.
- SOCKS proxy URLs can once again be configured for individual feeds.
- Fixed enclosure URL proxying consistency across API endpoints.
- Fixed several API handlers that incorrectly returned
404 Not Foundor400 Bad Requestinstead of proper server errors. - Fixed inconsistent handling of invalid category filters in the Entries API.
- Fixed user lookup edge cases that could result in nil pointer dereferences.
- Fixed enclosure lookup to correctly scope results by user.
- Fixed the Google Reader Quick Add endpoint to honor the configured HTTP user agent.
- Fixed refresh-all keyboard shortcut (
R) to correctly display the success notification. - Fixed localization formatting issues affecting several languages.
- Fixed request builder state leaking during feed discovery.
- Improved accessibility by correcting an
aria-labelledbyissue.
Localization
- Updated German (
de_DE) translations. - Updated Galician (
gl_ES) translations.
Documentation
- Clarified the units for
POLLING_FREQUENCY. - Improved documentation for
TRUSTED_REVERSE_PROXY_NETWORKS.
Dependencies
- Updated several Go modules and GitHub Actions dependencies.
Miniflux 2.3.1
Security
- Fixed an OAuth account binding vulnerability that could allow users to associate arbitrary OAuth identities with their account.
- Fixed an open redirect vulnerability caused by backslashes in relative redirect URLs.
- Fixed a potential SQL injection vulnerability in dynamically generated
ORDER BYclauses. - Hardened metrics endpoint authentication by using constant-time credential comparisons.
Bug Fixes
- Fixed an issue where the stdlib cross-origin protection middleware could block legitimate requests in certain self-hosted environments. The middleware has been reverted.
Improvements
- Added Korean language support.
- Improved HTML truncation performance and reduced memory allocations.
- Optimized feed discovery, subscription detection, date parsing, and tag filtering.
- Simplified and refactored several storage and query-building components for better maintainability.
Dependencies
Updated several dependencies, including:
github.com/go-webauthn/webauthn0.17.4golang.org/x/crypto0.52.0golang.org/x/image0.41.0golang.org/x/net0.55.0
As always, thank you to all contributors who helped improve Miniflux in this release.
Miniflux 2.3.0
Security
- Only discoverable WebAuthn credentials (resident keys / passkeys) are supported for login.
- Non-resident credentials can no longer be used for first-factor authentication to prevent username enumeration before password verification. They are intended for post-password MFA flows, which Miniflux does not currently support.
- Persist WebAuthn backup eligibility/state and validated credential state after login.
- Require
POSTrequests for logout, feed refresh, and OAuth2 unlink actions. - Apply CSRF protection to all non-safe HTTP methods.
- Add
http.CrossOriginProtectionmiddleware for the web UI. - Validate redirect URL schemes in
HTMLRedirectto prevent unsafe redirects. - Restore URL scheme validation in templates for untrusted feed URLs.
- Sanitize filenames in
Content-Dispositionheaders to prevent header injection. - Reject empty OAuth2 state parameters when no authentication flow is in progress.
- Allow configured private proxies while still enforcing private-network restrictions for direct requests and redirects.
- Validate URI schemes case-insensitively according to RFC 3986.
- Pin third-party GitHub Actions to immutable commit SHAs to reduce supply-chain risks.
- Cap the maximum entry limit to 1000 across the UI, API, and storage layer.
Improvements
- Add support for exporting and importing Miniflux-specific feed settings in OPML files, allowing full feed configuration backups and restores.
- Add enclosure links rewrite rule to expose podcast/video enclosure URLs inside entry content for external RSS clients.
- Add support for the
shortcuts:iOS URL scheme in sanitized content. - Add Linux
riscv64builds. - Allow disabling local authentication without enabling automatic OAuth2/auth-proxy user creation.
- Improve Chinese Traditional (
zh-TW) translations. - Improve RSS parsing for feeds that reuse the same GUID across multiple entries.
- Improve UI consistency for authentication settings and external-link behavior.
- Automatically clean up orphaned feed icons from the database.
- Detect Cloudflare bot challenge pages during feed refresh and return a dedicated error message.
- Improve error handling and cleanup in WebAuthn login flows.
- Simplify large feed and user deletions using
ON DELETE CASCADE.
Performance
- Improve sanitizer performance significantly and reduce allocations in multiple hot paths.
- Optimize reading-time calculation to avoid unnecessary allocations.
- Improve feed parsing performance by preallocating slices/maps and reducing string allocations.
- Optimize ISO8601 duration parsing for YouTube and podcast feeds.
- Reduce database queries for navigation metadata and storage operations.
- Optimize template rendering for icons and CSP generation.
- Avoid loading entry content from PostgreSQL when not needed.
- Reuse a singleton HTML minifier instance instead of allocating one per request.
- Optimize string handling in the reader and sanitizer packages.
Bug Fixes
- Fix incorrect read/starred toggling in Google Reader API.
- Prevent archived/deleted entries from reappearing as unread by using a tombstone table and removing the
removedentry status. - Fix handling of slow HTTP headers.
- Fix "open in new tab" behavior for redirected external entry links.
- Fix Wallabag integration typo in error messages.
Dependency Updates
- Update
github.com/go-webauthn/webauthntov0.17.3. - Update various
golang.org/x/*packages. - Update
github.com/coreos/go-oidc/v3tov3.18.0. - Update
github.com/tdewolff/minify/v2tov2.24.13.
As always, thank you to all contributors who helped improve Miniflux in this release.
Miniflux 2.2.19
Security
- Remove sensitive values (CSRF tokens, OAuth state, session cookies) from log messages.
- Improve OAuth2 security:
- Verify OIDC ID token signatures and claims.
- Prevent OAuth identity overwrite when already linked.
- Clear PKCE verifier and CSRF state after use.
- Validate HTTP status from Google userinfo endpoint.
- Use HMAC-SHA256 instead of SHA1 for Google Reader API authentication.
- Use constant-time comparison for token validation.
- Fix potential DoS when truncating large untrusted input in templates.
- Reject oversized favicons.
Improvements
- Improve configuration validation with cross-field consistency checks.
- OAuth2:
- Explicit provider selection via
OAUTH2_PROVIDER. - Better separation between Google and OIDC providers.
- Updated Google OAuth endpoints to v2.
- Explicit provider selection via
- UI:
- Add cache-busting for static assets (JS, CSS, icons).
- Add
Cache-Control: immutablefor static resources.
- Sanitizer:
- Allow iframes from
framatube.org. - Improve performance and parsing behavior.
- Allow iframes from
- Metrics and workers:
- Graceful shutdown support for worker pool and metrics collector.
- Better error reporting for metrics.
- API / HTTP:
- Support weak ETag comparison.
- Improve response helpers and headers handling.
Performance
- Reduce number of SQL queries for unread entries and UI pages.
- Optimize database queries and locking behavior:
- Use
SKIP LOCKEDin archive operations. - Reduce unnecessary queries and connections.
- Use
- Improve UI performance:
- Cache keymaps instead of recomputing on each keypress.
- Batch DOM updates when marking entries as read.
- Optimize sanitizer, media proxy, routing, and template rendering.
- Reduce allocations in various hot paths.
Bug Fixes
- Fix category update validation rendering.
- Fix redirect after marking a feed as read from category view.
- Fix timezone comparison logic.
- Fix Arabic pluralization rules (
ar_SA). - Fix validator behavior when clearing user filters.
- Fix CLI behavior for
--infoand--version. - Fix CORS preflight responses (return 204).
- Ensure 204 responses do not include
Content-Type. - Ignore unsupported media proxy targets and handle MIME types correctly.
Refactoring
- Remove dependency on
gorilla/muxacross the codebase. - Improve code structure and naming consistency (API, OAuth2, config, validators).
- Simplify timezone and server setup logic.
- Improve testability and documentation (GoDoc updates).
Dependencies
-
Update multiple dependencies, including:
github.com/lib/pqgithub.com/go-jose/go-jose/v4github.com/go-webauthn/webauthngithub.com/andybalholm/brotligithub.com/tdewolff/minify/v2golang.org/x/imagegithub.com/PuerkitoBio/goquery
Miniflux 2.2.18
Security
- Block outbound requests to private networks made by the fetcher by default.
- Add SSRF protection for integration HTTP clients by blocking connections to private network addresses at connect time.
- Fix a possible SSRF TOCTOU / DNS-rebinding issue in the fetcher private network check.
- Ensure private network protections also apply to redirect targets.
- Treat RFC 6598 shared address space (
100.64.0.0/10) as non-public.
Breaking Changes
To prevent potential SSRF, Miniflux now blocks access to services hosted on private networks by default.
FETCHER_ALLOW_PRIVATE_NETWORKS=1must now be enabled to access feeds hosted on a local network.INTEGRATION_ALLOW_PRIVATE_NETWORKS=1must now be enabled to access third-party integration services hosted on a local network.
Improvements
- Apply entry blocking rules both before and after scraping to avoid unnecessary requests and allow matching on fetched content.
- Add
ignore_entry_updatesfeed option to skip updating existing entries during scheduled polling. - Add Arabic (
ar_SA) translation. - Add Galician (
gl_ES) translation. - Update Polish translation.
- Various performance improvements across multiple components (fetcher, parser, sanitizer, readability, URL cleaner, feed discovery, and Google Reader API).
- Simplify parts of the Google Reader code and reduce allocations in several hot paths.
- Reduce fetcher request size slightly to improve packet efficiency.
Bug Fixes
- Fix multiple bugs and inconsistencies across integration sub-packages (error handling, logging, status checks, and naming).
- Fix potential panic in the Omnivore integration when handling empty error arrays.
- Correct error prefixes and typos in several integrations.
Dependencies
- Update
golang.org/x/netto 0.52.0. - Update
golang.org/x/cryptoto 0.49.0. - Update
golang.org/x/imageto 0.37.0. - Update
golang.org/x/oauth2to 0.36.0. - Update
github.com/go-webauthn/webauthnto 0.16.1. - Update
github.com/tdewolff/minify/v2to 2.24.10.
Other Changes
- Upgrade to Go 1.26.
- Add
go:fixdirective for deprecatedclient.New()to ease migration toNewClient(). - Add KOI8-R encoding tests with a sample XML feed.
- Add additional tests for
CharsetReader. - Update several GitHub Actions used for CI and container builds.
- Avoid building Debian packages bi-weekly on forks.
As always, thank you to all contributors who helped improve Miniflux in this release.
Miniflux 2.2.17
Security
- Do not expose the Miniflux version on unauthenticated endpoints (deprecated since version 2.0.49).
- Improve HTML sanitizer by switching from the tokenizer to the
golang.org/x/net/htmlparser to better match browser behavior and reduce the risk of injection issues. - Enforce blocked resource checks on
srcsetURLs. - Improve blocked resource handling (including updates to blocked URL substrings).
- Add validation for
TRUSTED_REVERSE_PROXY_NETWORKSconfiguration to prevent silent misconfiguration. - Prevent possible deadlock when cleaning removed entries.
- Ensure HTTP response bodies are always closed, even on client errors.
Improvements
-
Rewrite
srcsetparser to follow HTML specifications (WebKit-style parsing) and handle edge cases more correctly. -
Improve sanitizer performance (various optimizations, including reduced allocations and better attribute handling).
-
Handle deeply nested HTML more robustly in the sanitizer.
-
Add scraper and rewrite rules for:
bleepingcomputer.comvnexpress.net
-
Improve JSON Feed support:
- Support malformed feeds with
authorobjects in theauthorsarray. - Avoid panic when parsing
nullfeeds. - Improve title fallback logic.
- Include
external_urlin JSON entry hash fallback.
- Support malformed feeds with
-
Ignore WordPress
wp-jsonAPI endpoint during JSON feed discovery. -
Add unread status filter to search results.
-
Improve timezone handling internals and performance.
-
Improve API payload structures and Godoc comments.
-
Improve JavaScript code readability and keyboard shortcut handling.
-
Restore cmd/ctrl/shift-click behavior on main navigation.
-
Fix Safari PWA behavior for the
vshortcut to open links in the main browser.
Bug Fixes
- Do not keep old enclosures when an updated entry has none.
- Handle
sql.ErrNoRowsproperly inIconByFeedID. - Change
FindRemoteIPto fall back to127.0.0.1.
Configuration Changes
- Removed
FILTER_ENTRY_MAX_AGE_DAYS.
This option can be replaced with a filter rule such asmax-age:<duration>.
Global environment variables should be reserved for process-level configuration.
Dependencies
-
Update
github.com/lib/pqto 1.11.2. -
Update:
golang.org/x/netto 0.50.0golang.org/x/cryptoto 0.48.0golang.org/x/imageto 0.36.0golang.org/x/oauth2to 0.35.0golang.org/x/termto 0.40.0
-
Update Debian packager Docker image to Trixie.
As always, thank you to all contributors who helped improve Miniflux in this release.
Miniflux 2.2.16
Security
- Disallow the media proxy from fetching resources on private networks to mitigate potential SSRF issues. This behavior is configurable at the instance level.
- Disallow fetching feed icons from private networks to reduce the SSRF attack surface. This is also configurable at the instance level.
- Add the
TRUSTED_REVERSE_PROXY_NETWORKSconfiguration option to prevent spoofing of HTTP headers such asX-Forwarded-For,X-Forwarded-Proto, andX-Real-Ip. This option must be configured whenAUTH_PROXY_HEADERis enabled. - Stop logging generated Google Reader API tokens, even when debug mode is enabled.
- Remove the CORS handler from the Google Reader API, as it is not intended to be used by web clients, reducing the overall attack surface.
Performance and Storage
- Avoid indexing the content of removed entries, significantly reducing database index size after cleanup.
- Minor storage and database refactoring to simplify code paths and reduce unnecessary formatting overhead.
API and Integrations
- Add a new API endpoint to import entries into an existing feed.
- Execute the content sanitizer when updating or importing entries through the API to ensure consistent sanitization.
- Improve Google Reader API compatibility by removing unnecessary output parameter checks and aligning behavior with other open-source RSS readers.
- Add an auto-push option to the Readeck integration.
User Interface
- Add smooth page transitions for a more polished navigation experience.
- Add a route to view individual starred entries directly from a category’s starred list.
- Add a link to the GitHub contributors page in templates.
- Update all translations.
Documentation and Tooling
- Improve consistency and fix typos in the
miniflux(1)manual page. - Remove the obsolete
versionkey from Docker Compose examples. - Update the Go devcontainer image to
go:1-trixie. - Update the Distroless container base image to Debian 13.
- Update GitHub Actions dependencies.
As always, thank you to all contributors who helped improve Miniflux in this release.
Miniflux 2.2.15
✨ New Features
- New configuration option to disable the Miniflux API
- Added option to save entries to a specific Linkwarden collection
- YouTube subscription improvements:
- Provide multiple feeds for YouTube content: Channel, videos only, short videos, live streams
- Better canonical URL detection (now has its own dedicated step)
- Improved YouTube channel parsing, including default playlists
- Allow feed entries with
<i>and<small>tags - URL Cleaner: Remove additional trackers from URLs
🐛 Bug Fixes
- YouTube embeds: Avoid Error 153 (
video player configuration error) in various scenarios - API:
fetchContentendpoint now properly rewrites media URLs when using the media proxy - Security: Only relative paths are now allowed for the
redirectURLparameter - CI fixes:
- Improved CodeQL workflow (language matrix + dynamic analysis)
- Fixed missing GitHub Actions permissions
- Fixed RPM package versioning for scheduled and pull_request triggers
🧹 Refactoring & Maintenance
- JavaScript optimizations: use
replaceinstead ofremove/add, minor regex cleanup - Performance improvement: removed string concatenation in loops
- Updated Polish translation
- Updated Postgres volume path in Docker Compose examples
- Added new CI workflow to mirror the Git repo to Codeberg
📦 Dependency Updates
This release includes updates to several dependencies:
golang.org/x/*modules (net,oauth2,image,crypto)github.com/tdewolff/minify/v2github.com/coreos/go-oidc/v3github.com/go-webauthn/webauthngithub.com/PuerkitoBio/goquery- Docker base image updates (Alpine 3.23)
- GitHub Actions:
actions/checkoutv6actions/upload-artifactv5golangci/golangci-lint-actionv9
For more details, look at the Git commit history.
Miniflux 2.2.14
✨ New Features
- Go Client: Allow passing a custom
http.Clientand add context support to API methods. - UI: Redirect users back to the original page after logging in.
- Template: Improved Content Security Policy: extracted CSP generation into a function, added systematic nonces, and changed
default-srcto'none'for stronger security. - Integrations:
- Added tags option for the Karakeep integration.
- Added new Archive.org integration.
- Rewrite Rules:
- Added
remove_img_blur_paramsrule. - Added
add_image_titlerule for explainxkcd.com.
- Added
🧰 Improvements & Refactoring
- Replaced custom modal with native
<dialog>element for simpler, more accessible UI. - Simplified date parsing in the reader and XML encoding logic.
- Optimized sanitizer functions (
hasRequiredAttributes,hasValidURIScheme,isBlockedResource). - Replaced
fmt.Errorfwitherrors.Newwhere applicable. - Removed dependency on
hstorein the database layer and relaxed implicitNOT NULLfor serial types. - Simplified Fever API slice sizing and various internal cleanups.
- Preallocated slices and optimized string/number conversions for better performance.
🧪 Tests
- Added test cases for XML encoding behavior.
🐛 Bug Fixes
- Fixed CSS layout overflow when external links are too long.
- Fixed JSON Feed parser to fallback to
external_urlwhenurlis missing. - Updated scraper rule for Dark Reading.
📚 Documentation
- Clarified the
POLLING_FREQUENCYenvironment variable in the documentation.
🏗️ Build & CI
-
Updated dependencies:
github.com/tdewolff/minify/v2→ 2.24.4golang.org/x/net→ 0.46.0golang.org/x/image→ 0.32.0golang.org/x/oauth2→ 0.32.0github.com/coreos/go-oidc/v3→ 3.16.0github/codeql-action→ 4
-
Updated
make lintand enabled additional Go linters (perfsprint,goheader).
📝 Additional Notes
If you are seeing this Postgres error: Error: pq: must be owner of extension hstore, you can fix it by running the following SQL command as a superuser for the Miniflux database:
DROP EXTENSION hstore;This error means you initially created the hstore extension as a different database user than the one you are currently using for Miniflux.
For more details, look at the Git commit history.