v3.2.0
- Fix panic in peek() when stale index points to corrupt uvarint data @janisz (#427)
- Bump Go to 1.22, migrate to math/rand/v2, fix staticcheck SA1006 @janisz (#428)
- Fixed
go test -race -bench=. .when running in parallel systems to prevent data races @Aniruddhraam (#429) - Optimize map capacity allocation during shard initialization. #419 @xiaobai12011 (#420)
- Revert change to how expiration timings to calculated. @gurudesu (#403)
- Improve error handling in BytesQueue.Push function in queue.go @alonohana627 (#405)
- Fixing grammar in docs @SaschaPeukert (#393)
- Only print if Verbose is true @xyproto (#392)
- fix typo @chenyahui (#385)
- Avoid redundant key parsing from the wrappedEntry. @chenyahui (#388)
- check LifeWindow when CleanWindow is set @chenyahui (#386)
- fix typo @chenyahui (#384)
- changed to uint64 keys @raeidish (#377)
- Use errors.New instead of fmt.Errorf @chenyahui (#370)
- rename resetKeyFromEntry to resetHashFromEntry @yangtaoran (#361)
- Update used go versions @janisz (#352)
- Bump toolmantim/release-drafter from 6.0.0 to 6.1.0 @dependabot[bot] (#406)
- Bump golangci/golangci-lint-action from 9.1.0 to 9.3.0 @dependabot[bot] (#430)
- Bump actions/checkout from 6 to 7 @dependabot[bot] (#424)
- Bump actions/setup-go from 6 to 7 @dependabot[bot] (#425)
- Go defaults to "0"" so in case we want to return @jgheewala (#181)
- Bump actions/setup-go from 5 to 6 @dependabot[bot] (#413)
- Bump actions/checkout from 4 to 6 @dependabot[bot] (#417)
- Bump golangci/golangci-lint-action from 7 to 9 @dependabot[bot] (#416)
- Bump golangci/golangci-lint-action from 6 to 7 @dependabot[bot] (#408)
- Bump golangci/golangci-lint-action from 5 to 6 @dependabot[bot] (#395)
- Bump golangci/golangci-lint-action from 4 to 5 @dependabot[bot] (#394)
- Bump golangci/golangci-lint-action from 3 to 4 @dependabot[bot] (#391)
- Bump toolmantim/release-drafter from 5.25.0 to 6.0.0 @dependabot[bot] (#390)
- Bump actions/setup-go from 4 to 5 @dependabot[bot] (#387)
- Bump toolmantim/release-drafter from 5.24.0 to 5.25.0 @dependabot[bot] (#381)
- Bump actions/checkout from 3 to 4 @dependabot[bot] (#373)
- Bump toolmantim/release-drafter from 5.23.0 to 5.24.0 @dependabot[bot] (#367)
- Added extra endpoint for clear cache @agoalofalife (#366)
- Bump actions/setup-go from 3 to 4 @dependabot[bot] (#359)
- Bump toolmantim/release-drafter from 5.22.0 to 5.23.0 @dependabot[bot] (#358)
- Bump toolmantim/release-drafter from 5.21.1 to 5.22.0 @dependabot[bot] (#351)
- fix readme: missing import dependency library @chusyclub (#415)
v1.10.0
This release focuses on substantial performance improvements, concurrency correctness, and better interoperability with modern Go logging APIs.
Major improvements across TextFormatter, entry handling, and common logger paths:
- ~17% lower geomean runtime across the benchmark suite
- ~27% higher geomean formatter throughput
- Common enabled logging paths are ~30–44% faster
WithErroris ~40% faster- Chained fields are ~46% faster
TextFormatterpaths are up to ~40% faster- Allocation counts are reduced by ~25–74% across measured
TextFormattercases, with the largest reductions in colored output
The improvements also show up in complete logger paths:
- Logger +
TextFormatteris ~31% faster, with ~24% fewer allocations - Logger +
JSONFormatteris ~21% faster, with ~10% fewer allocations
JSONFormatter itself remains largely unchanged in runtime performance, with small allocation reductions.
v1.10 adds bidirectional interoperability between Logrus and Go's log/slog:
- A Logrus
sloghook can forward existing Logrus entries to ansloglogger. hooks/slog.NewHandlerimplementsslog.Handler, allowinglog/slogrecords to use an existing Logrus logger and its hooks, formatter, and output.- The handler preserves levels, fields, groups, context, record timestamps, and optionally caller information.
- Caller reporting is configured per handler, without requiring Logrus's logger-wide
ReportCalleroption. - Custom
sloglevels can be mapped to Logrus levels. - The hook and handler can be combined, providing a practical path for incrementally migrating from Logrus to
log/slogwithout requiring an all-at-once transition.
This allows applications to migrate their logging API and logging backend independently: existing Logrus call sites can start using an slog backend, while new slog code can continue using an established Logrus setup.
- Fix reentrant logging deadlocks, including logging from within
MarshalJSONor formatter code. - Fix generic
Log,Logf,Logln, andLogFnmethods unexpectedly panicking when called withPanicLevel, contrary to their documented behavior. - Eliminate race conditions in entry and formatter paths.
- Improve locking boundaries around formatters and hooks.
TextFormatternow automatically enables colors on Windows terminals with ANSI support, matching behavior on other platforms.Entry.Callercan now be set explicitly and is preserved across derived entries. When caller reporting is enabled, Logrus only detects and populates caller information when none was provided, allowing custom caller detection and wrapper-aware logging without adding additional caller configuration APIs.- Add minimal, composable logging interfaces for each log level, allowing consumers to depend on narrower interfaces and making logging implementations easier to substitute or adapt.
- Expand CI verification to include TinyGo and every cross-compile target reported by go tool dist list, improving coverage across alternative toolchains and platforms.
- Minimum supported Go version is now 1.23.
TextFormatternow renders[]byteas raw/quoted strings instead of numeric slices. If you relied on the previous slice-of-ints output, convert explicitly before logging.TextFormatternow uses dim cyan for debug output and dim white for trace output in colorized TTY output.Entry.HasCalleris now deprecated in favor of checkingEntry.Callerdirectly. A//go:fix inlinedirective was added so existing uses can be updated automatically.MutexWrap, which was unintentionally exposed as public API, is deprecated. It remains available as an alias for compatibility but should not be used directly.
v1.10 is primarily a performance, correctness, and interoperability release with no intentional breaking public API changes.
Benchmarks (sampled at 457e372460c7a80ca7c800b51ebeee5362aaa180)
goos: darwin
goarch: arm64
pkg: github.com/sirupsen/logrus/benches
cpu: Apple M3 Pro
│ v1.9.4.txt │ v1.10.0.txt │
│ sec/op │ sec/op vs base │
Entry_WithError 228.8n ± 4% 137.4n ± 5% -39.95% (p=0.000 n=10)
Entry_WithField_Chain 1346.5n ± 2% 733.5n ± 3% -45.53% (p=0.000 n=10)
Entry_WithFields/valid_fields_only 236.2n ± 6% 255.4n ± 1% +8.11% (p=0.001 n=10)
Entry_WithFields/contains_func 293.1n ± 3% 285.1n ± 3% -2.76% (p=0.043 n=10)
Entry_WithFields/contains_func_ptr 296.5n ± 3% 300.1n ± 5% ~ (p=0.529 n=10)
Entry_WithFields/mixed_valid_invalid 339.7n ± 4% 336.7n ± 2% ~ (p=0.315 n=10)
Entry_WithFields/larger_map 635.9n ± 4% 693.8n ± 2% +9.11% (p=0.000 n=10)
Entry_ReportCaller_NoCaller 933.4n ± 3% 924.0n ± 2% ~ (p=0.105 n=10)
Entry_ReportCaller_WithCaller 2.693µ ± 2% 3.050µ ± 3% +13.28% (p=0.000 n=10)
Entry_ReportCaller_NoCaller_Depth4 914.3n ± 2% 905.5n ± 3% ~ (p=0.481 n=10)
Entry_ReportCaller_WithCaller_Depth4 2.736µ ± 8% 3.048µ ± 5% +11.36% (p=0.000 n=10)
ZeroTextFormatter 457.6n ± 1% 369.3n ± 2% -19.31% (p=0.000 n=10)
OneStringTextFormatter 637.0n ± 1% 549.4n ± 2% -13.75% (p=0.000 n=10)
OneNumericTextFormatter 682.7n ± 1% 550.2n ± 1% -19.42% (p=0.000 n=10)
OneBoolTextFormatter 669.7n ± 1% 550.0n ± 1% -17.87% (p=0.000 n=10)
NumericTextFormatter 1.685µ ± 3% 1.261µ ± 2% -25.17% (p=0.000 n=10)
BoolTextFormatter 1.450µ ± 1% 1.082µ ± 3% -25.39% (p=0.000 n=10)
StringerTextFormatter 2.066µ ± 1% 1.323µ ± 1% -35.95% (p=0.000 n=10)
ErrorTextFormatter 924.7n ± 5% 686.7n ± 1% -25.74% (p=0.000 n=10)
SmallTextFormatter 944.4n ± 1% 862.6n ± 1% -8.66% (p=0.000 n=10)
LargeTextFormatter 5.527µ ± 5% 4.750µ ± 2% -14.07% (p=0.000 n=10)
SmallColoredTextFormatter 1337.0n ± 3% 838.6n ± 1% -37.28% (p=0.000 n=10)
LargeColoredTextFormatter 7.955µ ± 5% 4.749µ ± 3% -40.30% (p=0.000 n=10)
SmallJSONFormatter 1.627µ ± 1% 1.637µ ± 6% ~ (p=0.670 n=10)
LargeJSONFormatter 8.335µ ± 3% 8.172µ ± 1% -1.96% (p=0.000 n=10)
DummyLogger 1.843µ ± 3% 1.551µ ± 2% -15.82% (p=0.000 n=10)
DummyLoggerNoLock 1.840µ ± 3% 1.558µ ± 3% -15.30% (p=0.000 n=10)
LoggerLog/disabled_level 1.248n ± 11% 1.192n ± 11% -4.49% (p=0.011 n=10)
LoggerLog/enabled_log 223.9n ± 3% 157.7n ± 5% -29.57% (p=0.000 n=10)
LoggerLog/enabled_logln 284.2n ± 1% 158.9n ± 2% -44.09% (p=0.000 n=10)
LoggerJSONFormatter 2.177µ ± 1% 1.712µ ± 1% -21.34% (p=0.000 n=10)
LoggerTextFormatter 1.860µ ± 5% 1.282µ ± 3% -31.05% (p=0.000 n=10)
geomean 843.9n 698.9n -17.18%
│ v1.9.4.txt │ v1.10.0.txt │
│ B/op │ B/op vs base │
Entry_WithError 448.0 ± 0% 448.0 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithField_Chain 2.188Ki ± 0% 2.188Ki ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/valid_fields_only 448.0 ± 0% 448.0 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/contains_func 488.0 ± 0% 488.0 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/contains_func_ptr 488.0 ± 0% 488.0 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/mixed_valid_invalid 488.0 ± 0% 488.0 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/larger_map 1.320Ki ± 0% 1.320Ki ± 0% ~ (p=1.000 n=10) ¹
Entry_ReportCaller_NoCaller 821.0 ± 0% 800.0 ± 0% -2.56% (p=0.000 n=10)
Entry_ReportCaller_WithCaller 1.614Ki ± 0% 1.581Ki ± 0% -2.06% (p=0.000 n=10)
Entry_ReportCaller_NoCaller_Depth4 821.0 ± 0% 800.0 ± 0% -2.56% (p=0.000 n=10)
Entry_ReportCaller_WithCaller_Depth4 1.614Ki ± 0% 1.581Ki ± 0% -2.06% (p=0.000 n=10)
ZeroTextFormatter 272.0 ± 0% 232.0 ± 0% -14.71% (p=0.000 n=10)
OneStringTextFormatter 304.0 ± 0% 264.0 ± 0% -13.16% (p=0.000 n=10)
OneNumericTextFormatter 308.0 ± 0% 264.0 ± 0% -14.29% (p=0.000 n=10)
OneBoolTextFormatter 308.0 ± 0% 264.0 ± 0% -14.29% (p=0.000 n=10)
NumericTextFormatter 920.0 ± 0% 808.0 ± 0% -12.17% (p=0.000 n=10)
BoolTextFormatter 626.0 ± 0% 552.0 ± 0% -11.82% (p=0.000 n=10)
StringerTextFormatter 968.0 ± 0% 808.0 ± 0% -16.53% (p=0.000 n=10)
ErrorTextFormatter 472.0 ± 0% 424.0 ± 0% -10.17% (p=0.000 n=10)
SmallTextFormatter 528.0 ± 0% 488.0 ± 0% -7.58% (p=0.000 n=10)
LargeTextFormatter 3.773Ki ± 0% 3.156Ki ± 0% -16.36% (p=0.000 n=10)
SmallColoredTextFormatter 600.0 ± 0% 392.0 ± 0% -34.67% (p=0.000 n=10)
LargeColoredTextFormatter 4.406Ki ± 0% 2.859Ki ± 0% -35.11% (p=0.000 n=10)
SmallJSONFormatter 1.078Ki ± 0% 1.070Ki ± 0% -0.72% (p=0.000 n=10)
LargeJSONFormatter 5.086Ki ± 0% 5.078Ki ± 0% -0.15% (p=0.000 n=10)
DummyLogger 748.0 ± 0% 704.0 ± 0% -5.88% (p=0.000 n=10)
DummyLoggerNoLock 748.0 ± 0% 704.0 ± 0% -5.88% (p=0.000 n=10)
LoggerLog/disabled_level 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹
LoggerLog/enabled_log 212.0 ± 0% 208.0 ± 0% -1.89% (p=0.000 n=10)
LoggerLog/enabled_logln 240.0 ± 0% 208.0 ± 0% -13.33% (p=0.000 n=10)
LoggerJSONFormatter 2.156Ki ± 0% 2.125Ki ± 0% -1.45% (p=0.000 n=10)
LoggerTextFormatter 1.625Ki ± 0% 1.547Ki ± 0% -4.81% (p=0.000 n=10)
geomean ² -8.14% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
│ v1.9.4.txt │ v1.10.0.txt │
│ allocs/op │ allocs/op vs base │
Entry_WithError 3.000 ± 0% 3.000 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithField_Chain 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/valid_fields_only 3.000 ± 0% 3.000 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/contains_func 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/contains_func_ptr 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/mixed_valid_invalid 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹
Entry_WithFields/larger_map 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹
Entry_ReportCaller_NoCaller 18.00 ± 0% 15.00 ± 0% -16.67% (p=0.000 n=10)
Entry_ReportCaller_WithCaller 29.00 ± 0% 26.00 ± 0% -10.34% (p=0.000 n=10)
Entry_ReportCaller_NoCaller_Depth4 18.00 ± 0% 15.00 ± 0% -16.67% (p=0.000 n=10)
Entry_ReportCaller_WithCaller_Depth4 29.00 ± 0% 26.00 ± 0% -10.34% (p=0.000 n=10)
ZeroTextFormatter 10.000 ± 0% 7.000 ± 0% -30.00% (p=0.000 n=10)
OneStringTextFormatter 11.000 ± 0% 8.000 ± 0% -27.27% (p=0.000 n=10)
OneNumericTextFormatter 12.000 ± 0% 8.000 ± 0% -33.33% (p=0.000 n=10)
OneBoolTextFormatter 12.000 ± 0% 8.000 ± 0% -33.33% (p=0.000 n=10)
NumericTextFormatter 19.00 ± 0% 10.00 ± 0% -47.37% (p=0.000 n=10)
BoolTextFormatter 18.000 ± 0% 9.000 ± 0% -50.00% (p=0.000 n=10)
StringerTextFormatter 22.00 ± 0% 10.00 ± 0% -54.55% (p=0.000 n=10)
ErrorTextFormatter 14.000 ± 0% 9.000 ± 0% -35.71% (p=0.000 n=10)
SmallTextFormatter 12.000 ± 0% 9.000 ± 0% -25.00% (p=0.000 n=10)
LargeTextFormatter 19.00 ± 0% 14.00 ± 0% -26.32% (p=0.000 n=10)
SmallColoredTextFormatter 15.000 ± 0% 7.000 ± 0% -53.33% (p=0.000 n=10)
LargeColoredTextFormatter 46.00 ± 0% 12.00 ± 0% -73.91% (p=0.000 n=10)
SmallJSONFormatter 25.00 ± 0% 23.00 ± 0% -8.00% (p=0.000 n=10)
LargeJSONFormatter 75.00 ± 0% 73.00 ± 0% -2.67% (p=0.000 n=10)
DummyLogger 13.000 ± 0% 9.000 ± 0% -30.77% (p=0.000 n=10)
DummyLoggerNoLock 13.000 ± 0% 9.000 ± 0% -30.77% (p=0.000 n=10)
LoggerLog/disabled_level 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹
LoggerLog/enabled_log 4.000 ± 0% 3.000 ± 0% -25.00% (p=0.000 n=10)
LoggerLog/enabled_logln 6.000 ± 0% 3.000 ± 0% -50.00% (p=0.000 n=10)
LoggerJSONFormatter 30.00 ± 0% 27.00 ± 0% -10.00% (p=0.000 n=10)
LoggerTextFormatter 21.00 ± 0% 16.00 ± 0% -23.81% (p=0.000 n=10)
geomean ² -25.77% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
│ v1.9.4.txt │ v1.10.0.txt │
│ B/s │ B/s vs base │
ZeroTextFormatter 106.3Mi ± 1% 131.7Mi ± 2% +23.90% (p=0.000 n=10)
OneStringTextFormatter 88.34Mi ± 1% 102.42Mi ± 2% +15.95% (p=0.000 n=10)
OneNumericTextFormatter 78.23Mi ± 1% 97.08Mi ± 1% +24.09% (p=0.000 n=10)
OneBoolTextFormatter 82.59Mi ± 1% 100.57Mi ± 1% +21.77% (p=0.000 n=10)
NumericTextFormatter 74.74Mi ± 3% 99.85Mi ± 2% +33.60% (p=0.000 n=10)
BoolTextFormatter 65.15Mi ± 1% 87.32Mi ± 3% +34.04% (p=0.000 n=10)
StringerTextFormatter 64.64Mi ± 1% 100.90Mi ± 1% +56.10% (p=0.000 n=10)
ErrorTextFormatter 69.10Mi ± 5% 93.05Mi ± 1% +34.66% (p=0.000 n=10)
SmallTextFormatter 86.85Mi ± 1% 95.08Mi ± 1% +9.48% (p=0.000 n=10)
LargeTextFormatter 49.35Mi ± 5% 57.43Mi ± 2% +16.38% (p=0.000 n=10)
SmallColoredTextFormatter 102.7Mi ± 3% 163.8Mi ± 1% +59.42% (p=0.000 n=10)
LargeColoredTextFormatter 67.14Mi ± 5% 112.45Mi ± 3% +67.48% (p=0.000 n=10)
SmallJSONFormatter 66.84Mi ± 1% 66.44Mi ± 6% ~ (p=0.684 n=10)
LargeJSONFormatter 46.91Mi ± 3% 47.85Mi ± 1% +2.00% (p=0.000 n=10)
geomean 73.01Mi 92.67Mi +26.93%
Full Changelog: https://github.com/sirupsen/logrus/compare/v1.9.4...v1.10.0
v2.13.0
This release contains new features, improvements and bug fixes.
- US-1643 Print and page setup API for the spreadsheet package
- US-1642 Animation API for the presentation package (on-click entrance effects: Appear, Fade, Fly In)
- US-1639 Speaker notes API for the presentation package
- US-1659 Word section formatting API (columns, page borders, line numbering, page-number format, title page)
- US-1709 Support for tables inside a Structured Document Tag (SDT)
- US-1707 Support for threaded comment replies and comment metadata getters
- US-1708 Support for custom text highlight colors through the run shading API
- US-1393 DOCX to PDF rendering of table rows taller than a page improvement
- US-1671 DOCX to PDF rendering of vertically merged table cells taller than a page improvement
- US-1697 DOCX to PDF
XObjectdeduplication, reducing output file size - US-1689 UniPDF dependency update to v5
- US-1678 CI/CD pipeline publishing the latest SBOM files with each release
- US-1617 Negative chart axis IDs (
c:axId/c:crossAx) failing to read fix - US-1690 Table of contents not rendering until a manual field refresh fix
presentation.New()now emits a<p:sldSz>element with the standard 16:9 slide size, which previously was omitted. This changes the serialized bytes of every deck created byNew(), so byte-for-byte or golden-file comparisons against output from earlier versions need to be regenerated. See US-1642.
v3.5.0
- Harden proxy middleware (#4405) New
proxy.SecurityPolicywith secure defaults: private/loopback upstreams, non-http(s) schemes and HTTPS-to-HTTP redirect downgrades are rejected and hop-by-hop headers stripped.https://docs.gofiber.io/middleware/proxy#securityproxy.WithSecurityPolicy(proxy.SecurityPolicy{ AllowPrivateIPs: true, // internal upstreams are blocked by default })
- Add support for custom binding precedence (#4544) New
binding_sourcestruct tag overrides theBind().All()source order per struct; the resolved order is cached perreflect.Type.https://docs.gofiber.io/api/bind#custom-precedencetype SearchReq struct { Name string `binding_source:"query,header,cookie,body,uri" query:"name" header:"x-name" json:"name"` }
- Add SkipUnmatchedRoutes with two-tier 404/405 fast path (#4486) New
fiber.Configoption that answers unregistered paths with404/405before the middleware chain runs (CORS preflight exempt, off by default).https://docs.gofiber.io/api/fiber#skipunmatchedroutesapp := fiber.New(fiber.Config{ SkipUnmatchedRoutes: true, // default: false })
- Speed up route matching with a flat tree index, leading-byte candidate rejection and a specialized /const/:param matcher (#4558)
- Quick-reject routes on precomputed slash-count bounds (#4517)
- Restore Route inlining lost in the RFC 9110 changes (#4501)
- Skip the Accept join allocation in the Format emptiness check (#4503)
- Skip the ip.String() allocation in IsProxyTrusted for CIDR-only trust configs (#4500)
- Adopt SWAR-accelerated utils helpers in hot-path scanners (#4536)
- Adopt gofiber/utils v2.2.0 helpers across hot paths (#4542)
- Adopt gofiber/utils v2.4.0 helpers and optimize adaptor/proxy hot paths (#4557)
- adaptor: Cut allocations on the net/http bridge (#4559)
- cache: Optimize key generation and allocation (#4608)
- cors: Fold preflight Vary calls into one header scan (#4502)
- csrf: Optimize trusted subdomain matching (#4543)
- proxy: Optimize balancer round-robin (#4549)
- session: Use make() to preallocate relevantExtractors (#4562)
- De-flake the clock-sensitive tests (#4575)
- Fix open redirects in composed route URLs and redirect rules (#4584)
- Preserve published route buckets during rebuilds (#4579)
- URL-encode query values in
Redirect.Route(#4529) - Accept the full float64 range in the
floatroute constraint (#4528) - Match HTTP field names the way a recipient must (#4585)
- Honor Accept weights followed by whitespace before the comma (#4550)
- Compare Accept media types case-insensitively (#4493)
- Honor q=0 rejections in content negotiation (#4508)
- Honor duplicate Content-Encoding after empty values (#4514)
- Improve RFC 9110 compliance across req/res/ctx, helpers and middleware (#4494)
- Avoid reading omitted request bodies in Bind.All (#4565)
- Combine repeated proxy headers for client IP extraction (#4568)
- Close the listener on Listen error paths to avoid FD leaks (#4532)
- Fire OnPostShutdown once with the real shutdown error (#4531)
- Keep all
NewErrorfargs when the first isn't a format string (#4530) - adaptor: Preserve Connection tokens (#4606)
- cache: Honor only-if-cached for non-shareable entries (#4589)
- cache: Stop charging its own latency as response age (#4578)
- healthcheck: Answer HEAD probes with the GET status (#4577)
- limiter: Floor sub-second expiration in the sliding window (#4564)
- proxy: Classify IPv6 transition addresses correctly in upstream validation (#4553)
- proxy: Guard runtime helpers against DNS rebinding (#4518)
- proxy: Preserve empty-query URL semantics (#4513)
- redirect: Rank wildcards behind character classes in rule ordering (#4607)
- static: Fix leading-slash normalization for fs.FS root paths (#4507)
- Fix client redirect handling, TLS diagnostics and the JSONP callback (#4586)
- Fix correctness issues across log injection, cookie jar, routing and Content-Type handling (#4570)
22 changes
- bump github.com/klauspost/compress from 1.19.1 to 1.19.2 (#4602)
- bump DavidAnson/markdownlint-cli2-action from 24.1.0 to 24.2.0 (#4583)
- bump release-drafter/release-drafter from 7.6.0 to 7.7.0 (#4566)
- bump github.com/gofiber/utils/v2 from 2.4.0 to 2.4.1 (#4567)
- bump github.com/valyala/fasthttp from 1.72.0 to 1.73.0 in the fasthttp-modules group (#4561)
- bump github.com/mattn/go-isatty from 0.0.23 to 0.0.24 (#4556)
- bump actions/checkout from 7.0.0 to 7.0.1 (#4551)
- bump github.com/klauspost/compress from 1.19.0 to 1.19.1 (#4548)
- bump github.com/gofiber/schema from 1.8.2 to 1.8.3 (#4547)
- bump release-drafter/release-drafter from 7.5.1 to 7.6.0 (#4546)
- bump DavidAnson/markdownlint-cli2-action from 24.0.0 to 24.1.0 (#4545)
- bump actions/setup-go from 6.5.0 to 7.0.0 (#4541)
- bump github.com/mattn/go-isatty from 0.0.22 to 0.0.23 (#4540)
- bump github.com/shamaton/msgpack/v3 from 3.1.2 to 3.2.0 (#4538)
- bump actions/setup-node from 6.4.0 to 7.0.0 (#4537)
- bump github.com/gofiber/schema from 1.8.1 to 1.8.2 (#4535)
- bump github.com/gofiber/utils/v2 from 2.1.1 to 2.1.2 (#4520)
- bump the golang-modules group with 3 updates (#4515)
- bump DavidAnson/markdownlint-cli2-action from 23.2.0 to 24.0.0 (#4506)
- bump golang.org/x/sys from 0.46.0 to 0.47.0 in the golang-modules group (#4511)
- bump golang.org/x/text from 0.38.0 to 0.39.0 in the golang-modules group (#4509)
- bump github.com/gofiber/schema from 1.8.0 to 1.8.1 (#4510)
- Explain adjacent multi-param capture rules (#4597)
- Document Ctx as a never-cancelable context (#4560)
- Move README.md to the repo root so pkg.go.dev renders it (#4505)
- logger: Explain when the error tag is populated (#4592)
📒 Documentation: https://docs.gofiber.io/
💬 Discord: https://gofiber.io/discord
Full Changelog: https://github.com/gofiber/fiber/compare/v3.4.0...v3.5.0
Thank you @0xghost42, @ATKasem, @Rachit-Gandhi, @ReneWerner87, @RubenPari, @SivaPA08, @aryan-finbox, @aryan262, @gaby, @james-yusuke, @nikolauspschuetz, @sueun-dev and @sunghyun1999 for making this release possible.
v2.52.15
- idempotency: release MemoryLock keys on unlock #4569
Full Changelog: https://github.com/gofiber/fiber/compare/v2.52.14...v2.52.15
Wails v3.0.0-beta.8
- Add documentation URL generation to automatic changelog entries in PR by @taliesin-ai
- Add Streams: bidirectional byte streams between Go and JavaScript with the WebSocket programming model and no listening socket. Declare a stream in Go with
app.HandleStream(name, handler)and connect from the frontend withStream(name), which returns aWebSocket-shaped object. Go→JS is carried by one held poll per window over the asset server, JS→Go by a normal POST; nothing binds a TCP port and nothing goes throughevaluateJavaScript. In server builds (-tags server) the same handler is served over a real WebSocket instead, so application code is identical across builds. by @leaanthony - Move mailbox changelog entry to Unreleased in PR by @leaanthony
- Update docs sidebar autogeneration and blog author type derivation in PR by @leaanthony
- WebView2 initialization uses a deadline and message pump in PR by @leaanthony
- WebView2 cookie test skips in CI unless opt-in and locks execution to current OS thread in PR by @leaanthony
- Windows menu builders restore command IDs for submenu parent items in PR by @gilad-ch
- Align the official cross-compilation image with the GTK 4.14+ Linux support baseline (#5928)
- Configure iOS Xcode project to retain inherited linker flags and add -ObjC in PR by @mortenolsrud
- Fix excessive TCP connection churn in the
wails3 devasset proxy on large frontends, which could exhaust the host's ephemeral ports and make unrelated processes fail withEADDRNOTAVAIL - Queue per-window event JavaScript for ordered dispatch and backpressure in PR by @leaanthony
- Remove the desktop binary release pipeline: v3 releases are tag-only and the
wails3CLI is installed withgo install. Deletesrelease-v3.ymland the nightly step that dispatched it in PR by @leaanthony
🤖 This is an automated nightly release generated from the latest changes on master.
Installation:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.8
v0.15.0
This release is a focused follow-up to v0.14.0 improving diagnostics and observability for validating large PDF corpora. It also includes PDF processing hardening, CJK text wrapping for watermarks, and clearer signature-validation behavior.
v0.15.0 follows v0.14.0 by only one week because post-release corpus testing made an existing operational gap clear: large wildcard-driven validation runs delayed failure diagnostics until the full input set completed and provided no quiet-mode indication of the file currently being processed.
The changes are targeted and immediately useful to corpus testers, so holding them for a later feature release would unnecessarily delay feedback. The short interval is intentional and does not establish a weekly release routine.
Multi-file CLI validation now reports each failed input as soon as the failure is detected, continues with the remaining inputs, and exits nonzero with a compact summary:
validation failed: 66 of 463 files invalid
The new --progress flag identifies the active input during quiet validation runs. This is useful when a long-running corpus job stalls on a particular file:
pdfcpu validate -q --progress "**/*.pdf"
The quotes are intentional. They pass the recursive pattern to pdfcpu for internal expansion instead of asking the shell to expand thousands of paths into one command line, which may exceed the operating system's argument-size limit.
With -q --progress, progress and validation failures are written to standard error while standard output remains clean:
validating(mode=relaxed) path/to/input.pdf ...
validate path/to/input.pdf: validation error: ...
There is a new Corpus Validation guide documenting quick assessment, progress monitoring, logging, validation modes, result interpretation, and focused issue reporting.
A failed corpus run is diagnostic input, not an issue backlog. Public reports must isolate one manually verified and independently reproduced problem with the smallest shareable PDF. Include the relevant error and final summary, and attach large logs as compressed files instead of pasting them into an issue.
AI-generated, bulk-generated, or mechanically reformatted corpus reports will be closed immediately without investigation. Corpus-wide analysis, failure classification, confidential-file investigation, and scheduled remediation are separate engineering work and may require a paid engagement.
Limited corpus investigation and remediation work may be available by arrangement.
Malformed and inconsistent PDF structures now produce more contextual errors across reading, dereferencing, validation, optimization, fonts, forms, and XObjects. Integer conversion and encryption handling have been tightened, and additional guards reduce the risk of panics while processing damaged input.
This work is backed by expanded malformed-input, error-path, and optimization regression coverage.
Text watermarks now support automatic wrapping for CJK text, including long runs without spaces. Oversized text is wrapped to the configured width instead of forcing unintended font-size reduction. This resolves issue #1427 and includes expanded CJK wrapping and layout coverage.
Signature validation output is clearer for legacy and unsupported cases. Evidence handling, PKCS#1 and PKCS#7 processing, and related error classification have also been tightened.
The pkg/api multi-file validation contract is unchanged: API callers continue to receive joined errors after processing. The CLI now streams individual multi-file validation failures and returns a final summary, so scripts that compare complete stderr strings should be updated to rely on exit status and stable error classification instead.
Existing non-quiet validation already reports the active input. --progress extends that visibility to quiet corpus runs without duplicating normal progress output.
- f2686555086a2e76dc19f602ea1897f6e3baae4d bump version
- dcc168d28225f7f3266836668483a3cdaced729a update issue reporting guidelines
- f5f3edf37f9642c4403300db88109521085006f2 harden PDF validation and add progress reporting
- afc357e23773c32d61b8c18601f77aa8ffcb6dab clarify signature validation output and legacy handling
- c9c07d0fcd19439f967cfff96203ebe41a1e8327 harden crypto integer conversions
- 198382701afee53f783aaf425cc240ee26170ae4 upgrade gh workflows
- 4e5f3aba056aebb721d7334032b378aeba1708b8 harden crypto integer conversions
- b57300b5f79f9139a7a6534fce7cbc96633ae025 clean up for #1427
- a2c33719c6aa55593d0316e50247388a3763b5f2 add CJK auto-wrap support for text watermarks (#1427)
Wails v3.0.0-beta.7
- Add macOS autoplay preference to disable user action requirement for media playback in PR by @Eyalm321
- Move mailbox changelog entry to Unreleased in PR by @leaanthony
- macOS zoom animation uses CADisplayLink or NSTimer for smoother performance in PR by @savely-krasovsky
- Configure iOS Xcode project to retain inherited linker flags and add -ObjC in PR by @mortenolsrud
- Fix excessive TCP connection churn in the
wails3 devasset proxy on large frontends, which could exhaust the host's ephemeral ports and make unrelated processes fail withEADDRNOTAVAIL - Queue per-window event JavaScript for ordered dispatch and backpressure in PR by @leaanthony
🤖 This is an automated nightly release generated from the latest changes on master.
Installation:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.7
Wails v3.0.0-beta.6
- Implement bounded host-side storage for oversized events and ordered JavaScript delivery in PR by @leaanthony
- Implement macOS Dock bounce for window flashing in PR by @julianstorer
- Asset server preserves content-type sniffer errors and unwritten prefixes during flushing in PR by @leaanthony
- Prevent macOS applications from crashing when replacing the application menu from a Wails callback
- Fix unreadable native menus on Windows 10 1809 / Windows Server 2019 (build 17763). The dark-mode uxtheme exports were gated on build 18334, so the app-level dark-mode opt-in never ran on those hosts: the menu background was painted dark but Windows kept drawing menu text in the light theme, leaving dark text on a dark background. The ordinals exist from 17763, so the gate now matches.
- Fix
w32.GetStockObjectcallingGetDeviceCapsinstead ofGetStockObject, which made it return 0 for every stock object. - Improve WebView2 bootstrapper download error handling and reporting in PR by @jannskiee
🤖 This is an automated nightly release generated from the latest changes on master.
Installation:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.6