jvoisin
112494bb66
perf(feed): save 16 bytes in the Feed struct
...
before:
```
// feed.go:25 | Size: 560 (Optimal: 544)
type Feed struct {
ID int64 ■ ■ ■ ■ ■ ■ ■ ■
UserID int64 ■ ■ ■ ■ ■ ■ ■ ■
FeedURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
SiteURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Title string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Description string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
CheckedAt time.Time ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
NextCheckAt time.Time ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
EtagHeader string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
LastModifiedHeader string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
ParsingErrorMsg string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
ParsingErrorCount int ■ ■ ■ ■ ■ ■ ■ ■
ScraperRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
RewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Crawler bool ■ □ □ □ □ □ □ □
BlocklistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeeplistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlockFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeepFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UrlRewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UserAgent string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Cookie string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Username string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Password string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Disabled bool ■
NoMediaPlayer bool ■
IgnoreHTTPCache bool ■
AllowSelfSignedCertificates bool ■
FetchViaProxy bool ■
HideGlobally bool ■
DisableHTTP2 bool ■ □
AppriseServiceURLs string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
WebhookURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
NtfyEnabled bool ■ □ □ □ □ □ □ □
NtfyPriority int ■ ■ ■ ■ ■ ■ ■ ■
NtfyTopic string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
PushoverEnabled bool ■ □ □ □ □ □ □ □
PushoverPriority int ■ ■ ■ ■ ■ ■ ■ ■
ProxyURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Category *Category ■ ■ ■ ■ ■ ■ ■ ■
Icon *FeedIcon ■ ■ ■ ■ ■ ■ ■ ■
Entries Entries ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
TTL int ■ ■ ■ ■ ■ ■ ■ ■
IconURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UnreadCount int ■ ■ ■ ■ ■ ■ ■ ■
ReadCount int ■ ■ ■ ■ ■ ■ ■ ■
NumberOfVisibleEntries int ■ ■ ■ ■ ■ ■ ■ ■
}
```
after:
```
// feed.go:25 | Size: 544
type Feed struct {
ID int64 ■ ■ ■ ■ ■ ■ ■ ■
UserID int64 ■ ■ ■ ■ ■ ■ ■ ■
FeedURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
SiteURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Title string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Description string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
CheckedAt time.Time ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
NextCheckAt time.Time ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
EtagHeader string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
LastModifiedHeader string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
ParsingErrorMsg string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
ParsingErrorCount int ■ ■ ■ ■ ■ ■ ■ ■
ScraperRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
RewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlocklistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeeplistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlockFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeepFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UrlRewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UserAgent string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Cookie string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Username string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Password string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Disabled bool ■
NoMediaPlayer bool ■
IgnoreHTTPCache bool ■
AllowSelfSignedCertificates bool ■
FetchViaProxy bool ■
HideGlobally bool ■
DisableHTTP2 bool ■
PushoverEnabled bool ■
NtfyEnabled bool ■
Crawler bool ■ □ □ □ □ □ □
AppriseServiceURLs string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
WebhookURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
NtfyPriority int ■ ■ ■ ■ ■ ■ ■ ■
NtfyTopic string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
PushoverPriority int ■ ■ ■ ■ ■ ■ ■ ■
ProxyURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Category *Category ■ ■ ■ ■ ■ ■ ■ ■
Icon *FeedIcon ■ ■ ■ ■ ■ ■ ■ ■
Entries Entries ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
TTL int ■ ■ ■ ■ ■ ■ ■ ■
IconURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UnreadCount int ■ ■ ■ ■ ■ ■ ■ ■
ReadCount int ■ ■ ■ ■ ■ ■ ■ ■
NumberOfVisibleEntries int ■ ■ ■ ■ ■ ■ ■ ■
}
```
2025-06-29 16:10:35 -07:00
jvoisin
9f7ecdb75a
perf(model): save 16 bytes in the FeedCreationRequest struct
...
before:
```
// feed.go:154 | Size: 240 (Optimal: 224)
type FeedCreationRequest struct {
FeedURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
CategoryID int64 ■ ■ ■ ■ ■ ■ ■ ■
UserAgent string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Cookie string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Username string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Password string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Crawler bool ■
Disabled bool ■
NoMediaPlayer bool ■
IgnoreHTTPCache bool ■
AllowSelfSignedCertificates bool ■
FetchViaProxy bool ■ □ □
UrlRewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
DisableHTTP2 bool ■ □ □ □ □ □ □ □
ScraperRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
RewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlocklistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeeplistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlockFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeepFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
HideGlobally bool ■ □ □ □ □ □ □ □
ProxyURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
}
```
after:
```
// feed.go:154 | Size: 224
type FeedCreationRequest struct {
FeedURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
CategoryID int64 ■ ■ ■ ■ ■ ■ ■ ■
UserAgent string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Cookie string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Username string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Password string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
Crawler bool ■
Disabled bool ■
NoMediaPlayer bool ■
IgnoreHTTPCache bool ■
AllowSelfSignedCertificates bool ■
FetchViaProxy bool ■
HideGlobally bool ■
DisableHTTP2 bool ■
ScraperRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
RewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlocklistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeeplistRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
BlockFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
KeepFilterEntryRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
UrlRewriteRules string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
ProxyURL string ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
}
```
2025-06-29 16:10:35 -07:00
jvoisin
4e1f836266
refactor(readability): simplify a bit getArticle
...
- Use a proper division instead of multiplying by a float.
- Extract a condition in the parent scope
- Use an else-if construct instead of a simple if
2025-06-29 16:06:34 -07:00
Frédéric Guillot
a68de4ee6a
test(readability): add tests for getArticle
function
2025-06-29 16:03:17 -07:00
jvoisin
c064891314
perf(readability): Simplify removeUnlikelyCandidates
...
- Use an array of strings instead of a regex, like done in ef13756b1a7a7ba30fd34174a5367381fd8b4849
- Extract the `shouldRemove` function from `removeUnlikelyCandidates`, as there
is no reason to have it there instead of being a proper standalone function.
- Improve a condition, where the goquery selection would have its `id`
attribute left unchecked if a `class` one was present, regardless of if
`class` was a candidate to removal or not.
- Add some comments
2025-06-29 15:31:01 -07:00
Frédéric Guillot
5129f53d58
test(readability): add tests for removeUnlikelyCandidates
function
2025-06-29 15:23:56 -07:00
Frédéric Guillot
e60f0fd142
test(readability): add tests for getClassWeight
function
2025-06-29 13:24:06 -07:00
Julien Voisin
2b26a345cd
perf(processor): minify content even further
...
There is no need to keep comments (conditionals or not, as IE isn't a thing
anymore), nor default attribute values.
2025-06-29 12:55:34 -07:00
Frédéric Guillot
3de31a1a4d
test(processor): add more unit tests for minifyContent
function
2025-06-29 12:53:23 -07:00
jvoisin
560be66147
refactor(misc): Use proper slog.XXX instead of slog.Any
...
This has close to no impact for now, as our slog.Debug/Info/... are leaking
their parameters to the heap, but using proper typing instead of Any allows
to skip some reflection-based computation, making things marginally faster,
and removing the corresponding heap leak.
2025-06-29 12:30:17 -07:00
Ingmar Stein
fcf86e33b9
feat: TLS support for Unix socket listeners
...
This change enables Miniflux to serve TLS over Unix domain sockets.
If `CERT_FILE` and `KEY_FILE` are configured, Unix socket listeners
specified via `LISTEN_ADDR` will now automatically start with TLS enabled,
using the provided certificates. This uses the existing `http.Server.ServeTLS`
method.
If no certificates are provided, Unix socket listeners will continue to
operate as plain, non-TLS sockets.
2025-06-24 21:25:55 -07:00
jvoisin
cbdcf1a56c
Revert "perf(storage): take advantage of entries_feed_id_hash_key in updateEntry"
...
This reverts commit 6527c04307
.
2025-06-24 19:51:21 -07:00
jvoisin
643b89ec89
perf(storage): take advantage of entries_feed_id_hash_key in updateEntry
2025-06-23 17:59:17 -07:00
jvoisin
8641f5f2a3
refactor(database): drop 3 columns in a single transaction
2025-06-20 16:23:20 -07:00
jvoisin
93b17af78b
refactor(appjs): no need to check if always present elements are always present
2025-06-20 13:16:57 -07:00
Frédéric Guillot
92876a0c61
refactor(http): rename package from httpd to server for consistency
2025-06-20 13:15:13 -07:00
Frédéric Guillot
d62df4e02a
refactor(server): avoid double call to Sprintf
2025-06-20 13:05:21 -07:00
Ingmar Stein
8fa5041c37
feat: Allow multiple listen addresses
...
This change implements the ability to specify multiple listen addresses.
This allows the application to listen on different interfaces or ports simultaneously,
or a combination of IP addresses and Unix sockets.
Closes #3343
2025-06-20 12:46:34 -07:00
Julien Voisin
dc05965895
chore(template): remove X-UA-Compatible
meta tag specific to Internet Explorer
2025-06-20 11:59:08 -07:00
jvoisin
109e668ac7
perf(storage): pre-allocate a slice in RefreshFeedEntries
2025-06-20 11:57:04 -07:00
Frédéric Guillot
6d58052504
fix(readability): do not remove elements within code blocks
...
`<span class="hljs-comment"># exit 1</span>` will match the `unlikelyCandidatesRegexp` because it contains the `comment` string.
2025-06-19 21:03:53 -07:00
Matthaiks
491d51c95f
feat(locale): update Polish translation
2025-06-19 18:47:28 -07:00
Frédéric Guillot
db49e41acf
refactor(processor): move FilterEntryMaxAgeDays filter to filter package
2025-06-19 17:56:45 -07:00
Frédéric Guillot
e6b814199b
feat(filter): add EntryDate=max-age:duration
filter
...
Example: `EntryDate=max-age:30d` or `EntryDate=max-age:1h`
Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h", "d".
2025-06-19 17:25:19 -07:00
Frédéric Guillot
b0a10f02fd
feat(css): add margin-bottom to input for consistent spacing
2025-06-19 16:35:17 -07:00
Frédéric Guillot
9c05c3c493
feat(filter): merge user and feed entry filter rules
2025-06-19 16:24:57 -07:00
Frédéric Guillot
2a9d91c783
feat: add entry filters at the feed level
2025-06-19 15:15:16 -07:00
Frédéric Guillot
cb59944d6b
refactor(processor): move RewriteEntryURL
function to rewrite
package
2025-06-19 13:22:29 -07:00
Frédéric Guillot
c12476c1a9
refactor(filter): avoid code duplication between IsBlockedEntry and IsAllowedEntry functions
2025-06-19 12:55:00 -07:00
Frédéric Guillot
bc6ab44ff2
fix(filter): skip invalid rules instead of exiting the loop
2025-06-19 12:36:35 -07:00
Frédéric Guillot
6282ac1f38
refactor(processor): move filters to a filter
package
2025-06-19 12:06:30 -07:00
jvoisin
96c0ef4efd
refactor(processor): massive refactoring of filters.go
...
- Use proper variable names for `key=value` strings parts
- Explicitly assign false to the `match` boolean
- Use an explicit `len(parts) == 2` assertion to help the compiler remove
`isSliceInBounds` calls.
- Refactor identical code into a containsRegexPattern function.
- Early exit when parsing the first date fails when using the `Between`
operator, instead of trying to parse the second one.
2025-06-19 11:43:47 -07:00
jvoisin
b139ac4a2c
refactor(youtube): Remove a regex and make use of fetchWatchTime
2025-06-19 11:43:47 -07:00
jvoisin
c818d5bbb8
refactor(youtube): initiliaze two maps to the proper length
2025-06-19 11:43:47 -07:00
jvoisin
e366710529
refactor(processor): remove a useless type declaration
2025-06-19 11:43:47 -07:00
jvoisin
5cff4d7117
refactor(processor): remove a duplication function call
...
As youtubeVideoID is assigned to getVideoIDFromYouTubeURL(entry.URL),
there is no need to call the latter again when we can simly use youtubeVideoID
instead.
2025-06-19 11:43:47 -07:00
jvoisin
f31a784eaa
refactor(processor): refactor common code into a fetchWatchTime function
...
Both nebula and odysee were using the same function to parse time.
2025-06-19 11:43:47 -07:00
jvoisin
7edfcc3cf7
refactor(processor): remove a useless type declaration
2025-06-19 11:43:47 -07:00
jvoisin
fe4b00b9f8
refactor(processor): extract some functions into an utils.go file
2025-06-19 11:43:47 -07:00
jvoisin
46b159ac58
refactor(processor): simplify bilibili processing
...
- Use strings.Contains instead of a regex
- Use strings concatenation instead of a call to fmt.Sprintf
- Use `any` instead of `interface{}`
2025-06-19 11:43:47 -07:00
jvoisin
86c58e11f6
perf(reader): use a non-cryptographic hash when possible
...
There is no need to use SHA256 everywhere, especially on small inputs where we
don't care about its cryptographic properties. We're using FNV as it's the
faster available hash in go's standard library, and we're picking its "a"
version as it's slightly better avalanche characteristics, which are
relevant for small inputs.
This commit has the side-effect of invalidating all favicons saved in the
database, which is desirable to benefit from the resize process implemented in
777d0dd2
, as it didn't apply retro-actively.
We're also making use of hex.EncodeToString instead of fmt.Sprintf, as it's
marginally faster.
Note that we can't change the usage of sha256 for feed.Hash as it's used to
deduplicate entries in the database.
2025-06-18 20:28:23 -07:00
jvoisin
9a1d9593b3
refactor(crypto): use rand.Text() instead of a custom implementation
...
Go 1.24 provides the helpful rand.Text() function, returning a base32-encoded
string containing at least 128 bits of randomness. We should make use of it
everywhere it makes sense to do so, if only to not having to think about much
entropy do we need for each cases, and just trust the go crypto team.
Also, rand.Read() can't fail, so no need to check its return value:
https://pkg.go.dev/crypto/rand#Read This behaviour is consistent with go's
standard library itself.
2025-06-18 20:12:55 -07:00
jvoisin
43546976d2
refactor(tests): use b.Loop() instead of for range b.N
...
See https://tip.golang.org/doc/go1.24#new-benchmark-function
2025-06-18 20:12:55 -07:00
jvoisin
3ab9ca9e4d
refactor(http): Don't hardcode TLS configuration
...
- TLS 1.2 is used as MinVersion by default
- With regard to CipherSuites, in Go 1.22 RSA key exchange based cipher suites
were removed from the default list, and in Go 1.23 3DES cipher suites were
removed as well. Ciphers for TLS1.3 aren't configurable.
- No need to specify CurveP25, as the servers will likely disable the weird
ones like CurveP384 and CurveP521. Removing the explicit specification also
enables the post-quantum X25519MLKEM768, wow!
I trust the go team to make better choices on the long term than us keeping
miniflux up to date with the latest TLS trend.
2025-06-18 20:12:55 -07:00
jvoisin
1af6df7cb9
perf(api): use math/rand/v2
2025-06-18 20:12:55 -07:00
Frédéric Guillot
6af4d69c39
test(sanitizer): add test case to cover Vimeo iframe rewrite without query string
2025-06-17 17:55:39 -07:00
Frédéric Guillot
27015a5e34
test(sanitizer): add unit test for 0x0 pixel tracker
2025-06-17 17:42:55 -07:00
jvoisin
cdb57b3843
perf(sanitizer): minor simplifications of the sanitizer
...
- Factorize some conditions
- Remove useless `default` case and move the return at the end of the functions
- Use strings.CutPrefix instead of strings.HasPrefix + strings.TrimPrefix
- Use switch-case constructs instead of slices.Contains, as this reduces the
complexity of the functions and allows them to be inlined, as well as helping
the compiler to optimize them, as it sucks at interprocedural optimizations.
2025-06-17 17:42:45 -07:00
jvoisin
152ef578d2
feat(sanitizer): consider images of size 0x0 as pixel trackers
2025-06-17 17:32:00 -07:00
jvoisin
72486b9bd1
refactor(processor): minor simplification of a loop
...
This makes the code a tad clearer.
2025-06-17 17:30:13 -07:00