v0.23.1
Update cdproto to v0.160.1. The README section on termcast describes its new API: termcast has no flags, Start detects the terminal, and in kitty and Ghostty the stream draws with no flicker.
v14.0.1
Version 14 release notes and reference: https://github.com/kataras/iris/releases/tag/v14.0.0 (read this first).
In-short, all valid opened issues are fixed.
Changelog: https://github.com/kataras/iris/blob/v14.0.1/HISTORY.md#fri-13-november-2026--v1401
v2.15.0
This release contains new features, improvements and bug fixes.
- US-1713 Password protection and encryption for Office documents: open and save password-encrypted DOCX, XLSX and PPTX files through
OpenWithOptions,ReadWithOptions,SaveWithOptionsandSaveToFileWithOptions(reads agile and standard AES encryption, writes agile AES-256), salted SHA-512 hashes for spreadsheet sheet and workbook protection, and a Word Restrict Editing API onSettings.DocumentProtection(). Opening with a wrong password returnsErrIncorrectPassword, and an unsupported scheme returnsErrUnsupportedEncryption - US-1748 PPTX slide transitions API:
Slide.SetTransition,Slide.TransitionandSlide.RemoveTransition, covering 21 transition effects plus a timing-only transition, with direction, speed, automatic advance and click advance - US-1800 PPTX hyperlinks: external links on text runs, text boxes and images, slide-to-slide jumps (
Slide.AddHyperlink,Slide.AddSlideJump), slide-show navigation jumps (first, last, next, previous, last viewed, end show) and tooltips - US-1799 Spreadsheet row and column grouping:
Sheet.GroupRows/GroupColumns,SetOutlineLevel/SetCollapsedon rows and columns, andSheet.SetSummaryBelow/SetSummaryRight. Also adds data validation prompt and error messages (SetPrompt,SetError), lock/unlock for each of the 14 sheet protection flags, strike and superscript/subscript for rich text, and hyperlink tooltips, display text and links within the workbook (Cell.AddInternalHyperlink)
- US-1836 PPTX slides, layouts and masters keep their
mc:AlternateContenttransitions through open and save, and animation timing values (dur,delay,repeatCount,tm,dir) are no longer blanked on save - US-1063 DOCX to PDF wrapping text around anchored images the way Word does, including images anchored later in the document than the text they overlap
- US-1978 UniPDF dependency update to v5.2.0
- US-1946
golang.org/x/imageupdate to v0.45.0 andgolang.org/x/textupdate to v0.41.0, fixing reachable security advisories (GO-2026-5032, GO-2026-5062, GO-2026-5066, GO-2026-5970). The minimum Go version stays at 1.25.0 - US-1941 Test golden files are no longer rewritten when only zip metadata such as timestamps changes
- US-1980 Render tests now detect changes in black content, and the OpenXML SDK validation gate runs and fails in CI
- US-2057 CI test runs no longer fail because of too many license check-ins
- US-2028 Release packaging fix for generic declarations the source obfuscator cannot handle, with a CI check that rejects new ones
- US-1838 Metered license state file written in place, so parallel processes sharing an API key failed with "ciphertext too short" or "invalid data" and overwrote each other's document counts fix. The file is now written atomically and locked across processes
- US-2041
SaveToFile,SaveToFileWithOptionsandPresentation.SaveToFileAsTemplateignoring the error from closing the written file, andPresentation.Saveignoring the zip writer's close error, so a truncated file was reported as saved fix - US-1801 Open and save corrupting packages whose media parts are renamed, leaving stale relationships and content types fix
- US-1969 Chart parts renumbered on open and save losing their relationships and content type in DOCX, XLSX and PPTX fix
- US-1970 DOCX image fixes:
Openpanicking on media parts without a file extension,AddImagewith an uppercase format (for example"PNG") producing a broken image (also fixed for XLSX and PPTX), andGetImageByRelIDnot finding an image right afterAddImage - US-1916 PPTX decks created with
New()missing threepresentation.xml.relsentries, so reopening and saving them produced a corrupt package fix. Decks saved by earlier releases are repaired on open - US-1959 PPTX open and save writing a notes master referenced from several parts more than once, producing a package the OpenXML SDK and LibreOffice reject, fix. PPTX to PDF conversion no longer panics on a deck without a slide master
- US-1981 DOCX to PDF conversion modifying the
Document, so converting the same document twice gave different output fix - US-1992 DOCX to PDF conversion writing resolved run and paragraph properties into styles, so output depended on document order (for example a paragraph mark color leaking into later paragraphs, or list levels taking another level's indent) fix
- US-1978 DOCX to PDF fixes for
Options.DefaultFontSizecarrying over to later XLSX and PPTX conversions in the same process, and table cell paragraphs losing the Normal style - US-1802
_xlfn.function names fix: functions added after Excel 2007 (such asXOR,IFNA,UNICHARandCEILING.MATH) now evaluate by their normal spelling, andSetFormulaRaw,SetFormulaArrayandSetFormulaSharedstore them with the prefix Excel expects, so they no longer show#NAME?in Excel - US-1966 Spreadsheet stylesheet
<font>children written in API-call order, which the OpenXML SDK rejects, fix. Chart data labels are written in schema order too - US-1957
RecalculateFormulascomputing every cell of a shared formula from the anchor cell's inputs fix - US-2019 Shared formula recalculation overwriting cells inside the formula's range that are not part of the group, and leaving stale values in the other cells when the anchor cell evaluates to an error fix
- US-2027 Shared formulas that read later cells of their own group evaluating to
#VALUE!, slow recalculation of chained shared formula groups,CompressImagesbreaking images used by charts, and copied DOCX headers and footers keeping the source document's numbering definitions fix - US-1958
Sheet.Sortrenumbering rows into index order and sorting the whole sheet when the first row does not exist, andRemoveColumnpanicking on cells and rows without a reference fix - US-1911 Sheet operations (
Sort,RemoveColumn,InsertRow,RecalculateFormulas,ExtractTextand others) and formula evaluation filling empty cells into sparse rows fix. Inline rich-text cells are no longer read as empty - US-1799
CELL("width")panicking on sheets without column definitions fix
- US-1713
SetPasswordon spreadsheet sheet and workbook protection now writes a salted SHA-512 hash instead of the legacy 16-bit hash. Files that must be unlocked in Excel 2007 or earlier needSetLegacyPassword. - US-1911, US-1958
Sheet.Sortnow matches Excel: the sort is stable, blank keys go last in both ascending and descending order, and rows keep their row numbers instead of being renumbered into index order. Code that relied on the previous order or numbering may see different results.
v14.0.0
Iris v14 is the first new major version since v12. The module path is github.com/kataras/iris/v14 and it requires Go 1.27 or later.
go get github.com/kataras/iris/v14@v14.0.0
package main
import "github.com/kataras/iris/v14"
type Book struct {
Title string `json:"title"`
}
func main() {
app := iris.New()
app.Get("/books/{id:uuid}", func(ctx iris.Context) {
ctx.JSON(iris.Map{"id": ctx.Params().GetString("id")})
})
app.Post("/books", func(ctx iris.Context) {
book, ok := ctx.BindJSON[Book]()
if !ok {
return
}
ctx.StatusCode(iris.StatusCreated)
ctx.JSON(book)
})
app.Listen(":8080")
}
ctx.BindJSON[Book]() is a generic method, which is why v14 needs Go 1.27. It decodes the body, runs Validate() error when the type has one, and answers the client itself when either step fails.
iris.NewBuilderassembles an application in one compile-checked chain: CORS, compression, access logging, a health endpoint, error mapping, services and API groups.- Typed request binding on generic methods (
ctx.BindJSON[T](),ctx.BindUpdate[T]()) replaces hand-written decode blocks. rest/errors: handlers report errors and one central map turns them into canonical, machine-readable responses. Internal details go to the server log and never to the client.- A dependency injection container is built in and replaces
hero. Constructors declare what they need,Initializerhooks run at startup and closers run at shutdown. - JSON runs on
encoding/json/v2. - Thirty-one built-in middleware, API keys being the newest. Sessions, cache, i18n, versioning and websocket now live under
middleware/. - Authentication at every scale: Basic Auth typed by your own user type, API keys, a generic JWT SDK, an identity server and an OAuth2 provider.
ai: renders and relays streamed model output over HTTP (text deltas, reasoning traces, tool-call fragments, usage). It is provider-agnostic and ships no vendor SDK.client: an HTTP client for calling other services under the same JSON rules the server side uses.- Views are a middleware.
middleware/viewholds a one-methodEngineinterface. The HTML, Django, Handlebars, Jet, Pug and Ace engines moved to iris-contrib/views, and kataras/blocks works as it is. - Server options:
app.Run(iris.ServerOptions{...})replacesiris.Addr,iris.TLSandiris.AutoTLS. ngrok tunneling is opt-in through a blank import ofcore/server/ngrok. - MVC controllers on Go generics, in
controller/mvc.
Every removed v12 name fails at compile time, so the compiler's error list is your to-do list. MIGRATION.md maps each name to its replacement. It opens with a prompt that you can paste into a coding agent, which then does the mechanical part.
The replacements most applications meet first:
| v12 | v14 |
|---|---|
github.com/kataras/iris/v12 |
github.com/kataras/iris/v14 |
iris.Party, app.Party(prefix) |
iris.Router, app.Router(prefix) |
iris.Configuration, iris.With... |
iris.Options |
iris.Addr, iris.TLS, iris.AutoTLS |
app.Run(iris.ServerOptions{...}) |
ctx.URLParam("q") |
ctx.Query().Get("q") |
ctx.Params().Get("id") |
ctx.Params().GetString("id") |
ctx.Header(k, v) to set, ctx.GetHeader(k) to read |
ctx.SetHeader(k, v) to set, ctx.Header(k) to read |
app.RegisterView(engine), ctx.View(...) |
app.Use(view.Handler(engine)), view.Render(ctx, ...) |
hero |
the built-in DI container |
middleware/logger |
middleware/accesslog |
middleware/recover |
middleware/recovery |
sessions, cache, websocket, i18n, view, versioning |
the same names under middleware/ |
mvc |
controller/mvc |
x/errors, x/client, x/jsonx |
rest/errors, client, rest/types |
The compiler does not flag these, so read them before you deploy:
- Session cookies are
SecureandSameSite=Lax. - JWT tokens are read from the
Authorizationheader only. - CORS no longer advertises credentials together with a wildcard origin.
ctx.SetCookiereplaces a cookie with the same name, path and domain, andctx.AddCookiedefaults toSameSite=Lax.- JSON is encoded and decoded by
encoding/json/v2.
MIGRATION.md explains each one, and lists the v12 bugs whose fixes change what you observe.
Nothing changes for an application that imports github.com/kataras/iris/v12. That code stays on the v12 branch, and v12.2.12 is its latest release.
- The Iris book: 24 chapters, free to read at iris-go.com/docs and to download as a PDF.
- TUTORIAL.md builds a Bookshelf service one idea at a time.
- 78 runnable examples in the order of the book.
- HISTORY.md lists every change in this release.
skill/iris: 21 reference documents written for coding agents.
- iris-contrib/views: the template engines.
- iris-contrib/middleware: 13 community middleware modules, updated for v14.
- kataras/blocks v0.1.0:
html/templatewith layouts and partials.
Found a problem? Open an issue.
v12.2.12
This release tags everything that landed on main since v12.2.11. From now on the v12 code lives on the v12 branch, and main moves on to v14, which has its own import path. Nothing changes for your imports: v12 is still github.com/kataras/iris/v12.
Upgrade with go get github.com/kataras/iris/v12@latest.
- The module now requires Go 1.26 (v12.2.11 required 1.22).
- Dependencies are at their newest versions.
golang.org/x/cryptogoes from v0.31.0 to v0.59.0 andgolang.org/x/netfrom v0.26.0 to v0.62.0, which brings in their security fixes. sessions/sessiondb/badgermoves from badger v2 to v4. Its import is nowgithub.com/dgraph-io/badger/v4.x/jsonx:ISO8601parses timestamps with an unconventional offset, such as2024-05-21T18:06:07.000000-04:01:19.x/jsonx: newSeasonbitmask type and aGetSeasonByDate(SimpleDate)helper.x/errors: when a response body cannot be encoded because of aNaNvalue, the error reports which field holds it.macro/interpreter/token:Typehas aString()method. A token type prints as its name (LBRACE) instead of a number.- New Arabic translation of the README: README_AR.md (#2539).
- Documentation and example links point to the
v12branch, and CI runs on it.
Keep github.com/kataras/golog at v0.1.12 and github.com/kataras/pio at v0.0.13 (#2587). Running go get -u in your app pulls golog v0.2.0 and pio v0.0.14, and Iris v12 does not compile against them. If your build breaks after an upgrade, run go get github.com/kataras/golog@v0.1.12 github.com/kataras/pio@v0.0.13.
Full changelog: https://github.com/kataras/iris/compare/v12.2.11...v12.2.12
v5.4.5
Security
- Redirect middleware:
HTTPSRedirect,HTTPSWWWRedirect,HTTPSNonWWWRedirect,WWWRedirectandNonWWWRedirectnow return400 Bad Requestinstead of redirecting when the host is empty, starts with:or., contains%, or is empty after removingwww.. Before this change, such hosts could produce an open redirect. The middleware no longer redirectsOPTIONS *requests, mapswsandwsstohttpandhttpsin redirect targets, and matches thewww.prefix case-insensitively. Fixes GHSA-3f6j-cw5h-qw9c (#3217) in #3220.
Fixes
- Trailing slash middleware:
AddTrailingSlashandRemoveTrailingSlashkeep escaped path segments such as%2Fin redirect and forward targets, so the request still matches its original route. Fixes #3206 in #3221. - IPv6 zones:
ExtractIPFromXFFHeaderandExtractIPFromRealIPHeadertrust zoned link-local proxy peers such as[fe80::1%eth0]:8080, with or without a port. Fixes #3179 in #3222. - Header binding:
BindHeadersno longer panics on nil or empty header value slices. Fixes #3169 in #3223.
Behavior change
Context.RealIP() and ExtractIPDirect() now return a zoned link-local peer without its zone: fe80::1, not fe80::1%eth0. Update logs, allowlists or rate-limit keys that store the zoned form.
No public API, dependency or minimum Go-version changes.
v4.16.4
Security
- Redirect middleware:
HTTPSRedirect,HTTPSWWWRedirect,HTTPSNonWWWRedirect,WWWRedirectandNonWWWRedirectnow return400 Bad Requestinstead of redirecting when the host is empty, starts with:or., contains%, or is empty after removingwww.. Before this change, such hosts could produce an open redirect. The middleware no longer redirectsOPTIONS *requests, mapswsandwsstohttpandhttpsin redirect targets, and matches thewww.prefix case-insensitively. Fixes GHSA-3f6j-cw5h-qw9c (#3217) in #3224.
Fixes
- Trailing slash middleware:
AddTrailingSlashandRemoveTrailingSlashkeep escaped path segments such as%2Fin redirect and forward targets, so the request still matches its original route. Fixes #3206 in #3225. - IPv6 zones:
ExtractIPFromXFFHeaderandExtractIPFromRealIPHeadertrust zoned link-local proxy peers such as[fe80::1%eth0]:8080, with or without a port. Fixes #3179 in #3226. - Header binding:
BindHeadersno longer panics on nil or empty header value slices. Fixes #3169 in #3227.
Behavior changes
Context.RealIP()andExtractIPDirect()now return a zoned link-local peer without its zone:fe80::1, notfe80::1%eth0. Update logs, allowlists or rate-limit keys that store the zoned form.HTTPSWWWRedirectkeeps its v4 behavior: it does not redirect plain HTTP requests for hosts that already start withwww.. v5 redirects these requests.
No public API, dependency or minimum Go-version changes; Go 1.26 or later remains required.
v1.68.0
- struct: map slices of struct pointers by @team-humaki in https://github.com/go-ini/ini/pull/396
- struct: map slices of pointers by @team-humaki in https://github.com/go-ini/ini/pull/406
- MapTo: error on nil struct pointer instead of panic by @team-humaki in https://github.com/go-ini/ini/pull/392
- Apply insensitive key name when deleting a key by @viraatdas in https://github.com/go-ini/ini/pull/386
- struct: keep reflecting fields after StructReflector by @team-humaki in https://github.com/go-ini/ini/pull/398
- parser: mark empty unparseable sections as raw by @yuefdev in https://github.com/go-ini/ini/pull/417
- Strip all leading BOMs, not just the first (#390) by @youdie006 in https://github.com/go-ini/ini/pull/391
- Fix indentation for shadow key values by @utkarshalpha in https://github.com/go-ini/ini/pull/388
- Fix error message for missing key by @bewuethr in https://github.com/go-ini/ini/pull/339
- fix(key): prevent stack overflow on cyclic key variable references by @AdamMagued in https://github.com/go-ini/ini/pull/415
- Cut SpaceBeforeInlineComment values at the earlier marker by @sarankumar1325 in https://github.com/go-ini/ini/pull/430
- Preserve comment markers inside quoted values by @rupayon123 in https://github.com/go-ini/ini/pull/414
- parser: keep trailing comments after last section by @team-humaki in https://github.com/go-ini/ini/pull/401
- section: return a zero-value Key for empty names by @team-humaki in https://github.com/go-ini/ini/pull/395
- key: keep empty shadows when PreserveEmptyShadows is set by @team-humaki in https://github.com/go-ini/ini/pull/399
- struct: escape delimiter in string slices on ReflectFrom by @team-humaki in https://github.com/go-ini/ini/pull/402
- file: escape written values the default reader would alter by @binggao1230 in https://github.com/go-ini/ini/pull/389
- perf: Replace O(n) slice scans with O(1) map lookups in NewKey() and NewSection() by @Liudon in https://github.com/go-ini/ini/pull/378
- @team-humaki made their first contribution in https://github.com/go-ini/ini/pull/396
- @viraatdas made their first contribution in https://github.com/go-ini/ini/pull/386
- @yuefdev made their first contribution in https://github.com/go-ini/ini/pull/417
- @youdie006 made their first contribution in https://github.com/go-ini/ini/pull/391
- @utkarshalpha made their first contribution in https://github.com/go-ini/ini/pull/388
- @bewuethr made their first contribution in https://github.com/go-ini/ini/pull/339
- @AdamMagued made their first contribution in https://github.com/go-ini/ini/pull/415
- @sarankumar1325 made their first contribution in https://github.com/go-ini/ini/pull/430
- @rupayon123 made their first contribution in https://github.com/go-ini/ini/pull/414
- @binggao1230 made their first contribution in https://github.com/go-ini/ini/pull/389
- @Liudon made their first contribution in https://github.com/go-ini/ini/pull/378
Full Changelog: https://github.com/go-ini/ini/compare/v1.67.3...v1.68.0