Minimalist and opinionated feed reader
api
: rewrite API integration tests without build tagsci
: add basic ESLinter checksci
: enable go-critic linter and fix various issues detectedci
: fix JavaScript linter path in GitHub Actionscli
: avoid misleading error message when creating an admin user automaticallyconfig
: add FILTER_ENTRY_MAX_AGE_DAYS
optionconfig
: bump the number of simultaneous workersconfig
: rename PROXY_*
options to MEDIA_PROXY_*
config
: use crypto.GenerateRandomBytes
instead of doing it by handhttp/request
: refactor conditions to be more idiomatichttp/response
: remove legacy X-XSS-Protection
headerintegration/rssbrige
: fix rssbrige importintegration/shaarli
: factorize the header+payload concatenation as dataintegration/shaarli
: no need to base64-encode then remove the padding when we can simply encode without paddingintegration/shaarli
: the JWT token was declared as using HS256 as algorithm, but was using HS512integration/webhook
: add category title to request bodylocale
: update Turkish translationsman page
: sort config options in alphabetical ordermediaproxy
: reduce the internal indentation of ProxifiedUrl
by inverting some conditionsmediaproxy
: simplify and refactor the packagemodel
: replace Optional{Int,Int64,Float64}
with a generic function OptionalNumber()
model
: use struct embedding for FeedCreationRequestFromSubscriptionDiscovery
to reduce code duplicationreader/atom
: avoid debug message when the date is emptyreader/atom
: change if !a { a = } if !a {a = }
constructs into if !a { a = ; if !a {a = }}
to reduce the number of comparisons and improve readabilityreader/atom
: Move the population of the feed's entries into a new function, to make BuildFeed easier to understand/separate concerns/implementation detailsreader/atom
: refactor Atom parser to use an adapterreader/atom
: use sort+compact
instead of compact+sort
to remove duplicatesreader/atom
: when detecting the format, detect its version as wellreader/encoding
: inline a one-liner functionreader/handler
: fix force refresh featurereader/json
: refactor JSON Feed parser to use an adapterreader/media
: remove a superfluous error-check: strconv.ParseInt
returns 0
when passed an empty stringreader/media
: simplify switch-case by moving a common condition above itreader/processor
: compile block/keep regex only once per feedreader/rdf
: refactor RDF parser to use an adapterreader/rewrite
: inline some one-line functionsreader/rewrite
: simplify removeClickbait
reader/rewrite
: transform a free-standing function into a methodreader/rewrite
: use a proper constant instead of a magic number in applyFuncOnTextContent
reader/rss
: add support for <media:category>
elementreader/rss
: don't add empty tags to RSS itemsreader/rss
: refactor RSS parser to use a default namespace to avoid some limitations of the Go XML parserreader/rss
: refactor RSS Parser to use an adapterreader/rss
: remove some duplicated code in RSS parserreader
: ensure that enclosure URLs are always absolutereader
: move iTunes and GooglePlay XML definitions to their own packagesreader
: parse podcast categoriesreader
: remove trailing space in SiteURL
and FeedURL
storage
: do not store empty tagsstorage
: simplify removeDuplicates()
to use a sort
+compact
construct instead of doing it by hand with a hashmapstorage
: Use plain strings concatenation instead of building an array and then joining ittimezone
: make sure the tests pass when the timezone database is not installed on the hostui/css
: align min-width
with the other min-width
valuesui/css
: fix regression: "Add to Home Screen" button is unreadableui/js
: don't use lambdas to return a function, use directly the function insteadui/js
: enable trusted-typesui/js
: fix download button loading labelui/js
: fix JavaScript error on the login page when the user not authenticatedui/js
: inline one-line functionsui/js
: inline some querySelectorAll
callsui/js
: reduce the scope of some variablesui/js
: remove a hack for "Chrome 67 and earlier" since it was released in 2018ui/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 indexui/js
: use a Set
instead of an array in a KeyboardHandler
's memberui/js
: use some ternaries where it makes senseui/static
: make use of HashFromBytes
everywhereui/static
: set minifier ECMAScript versionui
: add keyboard shortcuts for scrolling to top/bottom of the item listui
: add media player control playback speedui
: remove unused variables and improve JSON decoding in saveEnclosureProgression()
validator
: display an error message on edit feed page when the feed URL is not uniquegithub.com/coreos/go-oidc/v3
from 3.9.0
to 3.10.0
github.com/go-webauthn/webauthn
from 0.10.1
to 0.10.2
github.com/tdewolff/minify/v2
from 2.20.18
to 2.20.19
google.golang.org/protobuf
from 1.32.0
to 1.33.0
Enter
key as a hotkey to open selected itemvideo
element poster
attributeindex.xml
feed.atom
and feed.rss
are used by enterprise-scale/old-school gigantic CMS<title>
elementsgit 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.CGO_ENABLED=0
for miniflux
targetstaticcheck
and golangci-lint
insteadgo.mod
and add .exe
suffix to Windows binaryio.ReadSeeker
instead of an io.Reader
to parse feedswww
strings.Builder
instead of a bytes.Buffer
strings.NewReader
instead of a bytes.NewBufferString
continue
to make the code-flow more obviousinList
, and put their parameters in the right orderisPixelTracker
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.
)slices
instead of hand-rolled loops
collector/allocator involvements.Reader
instead of copying to a buffer when parsing an Atom feedview.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 rungenericProxyRewriter
shouldProxy
function to reduce the copy-pasta.removeUnlikelyCandidates
: .Not
returns a brand new Selection
, copied element by elementEstimateReadingTime
's speed by a factor 7
whatlanggo.Detect
is abysmally slow.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 enoughArchiveEntries
and updateEnclosures
line
is positive since we're checking afterwards that it contains the =
signdefer()
in a loopstrings.ReplaceAll
instead of strings.Replace(…, -1)
strings.EqualFold
instead of strings.ToLower(…) ==
.WriteString(
instead of .Write([]byte(…
%q
instead of "%s"
internal/worker/worker.go
read-onlyinternal/locale/plural.go
instead of an avalanche of if
formatFileSize
and duration
implementationprinter.Print
when possibleprinter.Print
to internal/locale/printer.go
: No need to use variadic functions with string format interpolation to generate static stringsinternal/ui/view/view.go
: No need to create the map item by item when we can create it in one goCountAllFeeds()
: No need to build an empty map to then add more fields in it one by oneinternal/reader/subscription/finder.go
:
localizedError
in FindSubscriptionsFromWellKnownURLs
via slog
subscriptions
slice when using an RSS-bridge,MarkCategoryAsRead
instead of a subqueryCleanOldUserSessions
' query: No need for a subquery, filtering on created_at
directly is enoughcleanupEntries
' query
NOT (hash=ANY(%4))
can be expressed as hash NOT IN $4
ArchiveEntries
's query for consistency's sake and replace the =ANY
with an IN
GetEntryIDs
and GetReadTime
's query for consistency's sakeWeeklyFeedEntryCount
: 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 enoughadd_image_title
github.com/google/uuid
dependencies: Replace it with a hand-rolled implementation. Heck, an UUID isn't even a requirement according to Omnivore API docsinternal/reader/icon/finder.go
:
apple-touch-icon-precomposed.png
as a fallback favicon
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.findIconURLsFromHTMLDocument
internal/reader/date/parser.go
:
Entry
struct to save some memorygolang.org/x/oauth2
from 0.17.0
to 0.18.0
github.com/prometheus/client_golang
from 1.18.0
to 1.19.0
github.com/tdewolff/minify/v2
from 2.20.16
to 2.20.18
github.com/PuerkitoBio/goquery
from 1.8.1
to 1.9.1
golang.org/x/crypto
from 0.19.0
to 0.20.0
github.com/go-jose/go-jose/v3
from 3.0.1
to 3.0.3
FORCE_REFRESH_INTERVAL
config optionitem-meta-info-reading-time
CSS classadd_dynamic_iframe
rewrite functiondata-original-mos
to add_dynamic_image
rewrite candidatesAccept
header when fetching feedssecurityContext
error in Kubernetes)type
attribute in OPML export as per OPML 2.0 specserror.unable_to_parse_feed
armhf
architecturefor
attributedetails
and summary
when expandedalert
role to alert message elementh2
heading to the article element so that the screen reader users can navigate the article through the heading levelaria-label
attribute for the article element for screen readersalt
attribute in feeds list to prevent screen reader to announce it before entry titlesr-only
CSS class for screen reader users (provides more context)nav
landmark to page header linksgolang.org/x/term
from 0.16.0
to 0.17.0
github.com/google/uuid
from 1.5.0
to 1.6.0
github.com/yuin/goldmark
from 1.6.0
to 1.7.0
golang.org/x/oauth2
from 0.15.0
to 0.17.0
github.com/tdewolff/minify/v2
from 2.20.10
to 2.20.12
golang.org/x/term
from 0.15.0
to 0.16.0
github.com/prometheus/client_golang
from 1.17.0
to 1.18.0
github.com/tdewolff/minify/v2
from 2.20.9
to 2.20.16
golang.org/x/crypto
from 0.16.0
to 0.19.0
github.com/go-webauthn/webauthn
from 0.9.4
to 0.10.1
golang.org/x/net
from 0.20.0
to 0.21.0
iframe
(avoid ERR_BLOCKED_BY_RESPONSE
error)nb_jobs
only when number of jobs is larger than 0 in background schedulerPOLLING_SCHEDULER=entry_frequency
)SCHEDULER_ROUND_ROBIN_MIN_INTERVAL
config optiongithub.com/google/uuid
from 1.4.0
to 1.5.0
github.com/coreos/go-oidc/v3
from 3.7.0
to 3.9.0
github.com/tdewolff/minify/v2
from 2.20.6
to 2.20.9
github.com/go-webauthn/webauthn
from 0.8.6
to 0.9.4
golang.org/x/oauth2
from 0.14.0
to 0.15.0
user/{userID}/state/com.google/read
is missing in categories section for read entriesExcludeTargets
into consideration in feed stream handlerhide_globally
property defined for categories in /v1/entries
API endpointLocalizedError
packagesnext_check_at
in the web ui and APIgithub-cli
and docker-outside-of-docker
features to devcontainergolang.org/x/*
dependenciesgithub.com/gorilla/mux
from 1.8.0
to 1.8.1
github.com/tdewolff/minify/v2
from 2.19.9
to 2.20.6
github.com/yuin/goldmark
from 1.5.6
to 1.6.0
github.com/coreos/go-oidc/v3
from 3.6.0
to 3.7.0
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 pathDEBUG
option is now deprecated in favor of LOG_LEVEL
/v1/version
PUT /v1/entries
to update entry title and content/v1/icons/{iconID}
/v1/flush-history
to flush historyGET /v1/entries
endpointpublished_after
, published_before
, changed_after
and changed_before
options to /v1/entries
endpointcontrib
folder (Bruno is an open source alternative to Postman/Insomnia)add_hn_links_using_hack
and add_hn_links_using_opener
to open HN comments with iOS appsExpires
response headerPreferServerCipherSuites
TLS optiongithub.com/rylans/getlang
with github.com/abadojack/whatlanggo
because getlang
doesn't seems to be updated anymoregithub.com/mccutchen/go-httpbin/v2
from 2.11.0
to 2.11.1
golang.org/x/*
dependenciesgo-telegram-bot-api
librarygomatrix
libraryprofile
scope to OIDC integration to support accounts without email addressfactor
for entry_frequency
scheduler:
entry_frequency
scheduler by a configurable factor in order to shorten the time between
updates.username
and password
form fieldsreturn
statement in fetchContent
UI handlerreplace_title
rewrite rule to adjust entry titleshide_globally
property to use it with third-party clients.webtoons.com
url
package to urllib
to avoid overlap with net/url
internal
folder
/entries/{entryID}/save
golang.org/x/*
dependenciesgithub.com/yuin/goldmark
github.com/tdewolff/minify/v2
github.com/mccutchen/go-httpbin/v2
golang.org/x/*
dependencies and go-oidc
to v3.6.0go-httpbin
to run tests locally and avoid remote calls to httpbin.org
total_unread
and feed_count
pq: time zone displacement out of range
errorsenclosures_user_entry_url_idx
changed_at
and published_at
github.com/tdewolff/minify/v2
, github.com/prometheus/client_golang
, golang.org/x/*
dependencies