Miniflux Versions Save

Minimalist and opinionated feed reader

2.1.2

1 month ago
  • 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.1

1 month ago
  • 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

2 months ago
  • 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.22 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.22
  • 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

4 months ago
  • 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.50

5 months ago
  • 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

2.0.49

6 months ago
  • 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.48

7 months ago
  • 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.

2.0.47

8 months ago
  • Update rules for webtoons.com
  • Use HTTP client from the standard library for third-party integrations
  • Rename internal url package to urllib to avoid overlap with net/url
  • Add Shaarli integration
  • Add Shiori integration
  • Add Apprise integration
  • Add Readwise Reader integration
  • Consider base path when generating third-party services API endpoint
  • Use podcast duration tag as reading time
  • Move internal packages to an internal folder
  • Rename Miniflux package name to follow Go module naming convention
  • Update RockyLinux image from 8 to 9 (used to build RPM package)
  • Add force refresh in feed edit and feed entries page
  • Use Odysee video duration as read time
  • Upgrade to Go 1.21
  • Use details disclosure element to show the list of third-party services
  • Use Web Share API for sharing entry
  • Add a workaround for parsing some invalid date format
  • Add Thunder Client API collection into contrib folder
  • Add new API endpoint: /entries/{entryID}/save
  • Trigger Docker and packages workflows only for semantic tags
    • Go module versioning expect Git tags to start with the letter v.
    • The goal is to keep the existing naming convention for generated artifacts and have proper versioning for the Go module.
  • Bump golang.org/x/* dependencies
  • Bump github.com/yuin/goldmark
  • Bump github.com/tdewolff/minify/v2
  • Bump github.com/mccutchen/go-httpbin/v2

2.0.46

9 months ago
  • Add scraper and rewrite rules for Webtoons
  • Fix regression in integration page and simplify SQL query
  • Wallabag integration: add more information in log messages
  • Add support for custom Youtube embed URL
  • Fix accessibility issues in modal component
    • Fix modal aria role
    • Trap focusing with tab / shift+tab inside the modal
    • Restore keyboard focus when closing modal
    • Automatically move keyboard focus to first focusable element unless specified otherwise
    • Keyboard shortcut help modal: move keyboard focus to modal title
    • Keyboard shortcut help modal: change close control from link to button
  • Add Notion integration
  • Update golang.org/x/* dependencies and go-oidc to v3.6.0
  • Improve responsive design
  • Add user setting for marking entry as read on view
  • Improve Russian translation
  • Add the possibility to run cleanup tasks from the command line
  • Add the possibility to run Miniflux as a cronjob
  • Use go-httpbin to run tests locally and avoid remote calls to httpbin.org
  • Display tags when viewing entries
  • Update categories API endpoint to return total_unread and feed_count
  • Improve date parser to handle various broken date formats
  • Avoid pq: time zone displacement out of range errors
  • Improve entry existance check to make better use of index
  • Add unique index enclosures_user_entry_url_idx
  • Add mark as unread for Linkding integration
  • Add sub-folder support for Wallabag integration
  • Use RockyLinux to build RPM package
  • Disable CGO when building RPM package
  • Disable CGO when building Docker images

2.0.45

10 months ago
  • Add media player to listen to audio and video podcasts with the possiblity to resume to last playback position
  • Add default tag names for Linkding integration
  • Mark only globally visible entries when marking all entries from UI
  • Use image included in feeds as feed icon when available
  • Order history by changed_at and published_at
  • Remove title attribute from entry title links
  • Fix reading time that is not aligned correctly with the latest version of Safari
  • Use glyphs of the same size on keyboard shortcuts page
  • Add maskable versions of the PWA icon
  • Replace copyright header with SPDX identifier
  • Remove the "í" letter from the Portuguese "lido" word
  • Increase golangci-lint timeout value
  • Bump github.com/tdewolff/minify/v2, github.com/prometheus/client_golang, golang.org/x/* dependencies