{"article":{"slug":"crystal-1-22-0-is-released","title":"Crystal 1.22.0 is released!","subtitle":null,"summary":"Crystal 1.22.0 ships 251 changes from 33 contributors: standard streams now exit on EPIPE like SIGPIPE, revamped DWARF parsing, a native event loop on all targets, LLVM 23 and 24 support, aarch64-linux promoted to Tier 1, and Process.fork removed.","content_type":"changelog","language":"en","canonical_url":"https://crystal-lang.org/2026/10/12/1.22.0-released/","author":{"name":"Johannes Müller","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"The Crystal Programming Language","url":"https://crystal-lang.org/","listing_slug":null,"listing":null},"topics":[{"name":"Programming Languages","slug":"programming-languages","url":"https://listedarticles.com/topics/programming-languages"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"},{"name":"Programming","slug":"programming","url":"https://listedarticles.com/topics/programming"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":808,"reading_minutes":4,"published_at":"2026-10-12T00:00:00.000Z","added_at":"2026-10-22T14:17:42.669Z","updated_at":"2026-10-22T14:17:42.669Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/crystal-1-22-0-is-released","markdown_url":"https://listedarticles.com/articles/crystal-1-22-0-is-released.md","example":false,"citation":"Johannes Müller, The Crystal Programming Language. \"Crystal 1.22.0 is released!.\" 12 Oct 2026. https://crystal-lang.org/2026/10/12/1.22.0-released/ (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://crystal-lang.org/2026/10/12/1.22.0-released/"},"body_markdown":"# Crystal 1.22.0 is released!\n\n12 Oct 2026\n\n- ![](https://crystal-lang.org/assets/authors/straight-shoota.jpg)\n\nJohannes Müller\n\n[API Docs](https://crystal-lang.org/api/1.22.0)\n[Changelog](https://github.com/crystal-lang/crystal/releases/tag/1.22.0)\n[Source](https://github.com/crystal-lang/crystal/tree/1.22.0)\n\n## Highlights\n\n- [Standard streams emulate SIGPIPE](#breaking-exit-on-pipe-error)\n  stdlib/runtime\n- [Revamped DWARF parsing for performance](#dwarf-refactor)\n  stdlib/runtime\n- [All targets support native event loop](#eventloop)\n  stdlib/runtime\n- [Support for LLVM 23 & 24](#dependencies)\n  stdlib/llvm\n- [`aarch64-linux` promoted to Tier 1](#aarch64-linux-promoted-to-tier-1)\n  platform/linux\n\nWe are announcing a new Crystal release 1.22.0 with several new features and bug\nfixes.\n\nPre-built packages are available on [GitHub\nReleases](https://github.com/crystal-lang/crystal/releases/tag/1.22.0) and our\nofficial distribution channels. See\n[crystal-lang.org/install](https://crystal-lang.org/install/) for installation\ninstructions.\n\n## Stats\n\nThis release includes [251 changes since\n1.21.1](https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.22.0)\nby 33 contributors. We thank all the contributors for all the effort put into\nimproving the language! ❤️\n\n## Changes\n\nBelow we list the most remarkable changes in the language, compiler, and stdlib.\nFor more details, visit the [full\nchangelog](https://github.com/crystal-lang/crystal/blob/master/doc/changelogs/v1.22.md).\n\n### Breaking: Exit on pipe error\n\nCrystal processes exit immediately when writing to STDOUT or STDERR fails with `EPIPE`.\nThis closely resembles the default behaviour of the `SIGPIPE` signal.\nPreviously, the failing write would raise `IO::Error`, which typically prints\nan error message and exits. This error message is now removed ([#17335](https://github.com/crystal-lang/crystal/issues/17335)).\n\nYou can opt out of this behaviour with `STDOUT.exit_on_broken_pipe = false`.\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota)*\n\n### Constants with type declarations\n\nConstants can have type declarations ([#16951](https://github.com/crystal-lang/crystal/issues/16951)).\nThey work exactly as you would expect the combination of constants and type declarations to be.\n\n```\nmodule Foo\n  BAR : Int32 = 1\n  BAZ : String = \"\"\n  QUX : Int64 = 123 # autocasts 123 to Int64\nend\n```\n\n*Thanks, [@stakach](https://github.com/stakach)*\n\n### `aarch64-linux` promoted to Tier 1\n\nThe targets `aarch64-linux-gnu` and `aarch64-linux-musl` moved from Tier 2 to Tier 1.\nThe only missing piece was that we were lacking official builds, but we have that since 1.19.\n\n### Breaking: `Process.fork` removed\n\n`Process.fork` had been deprecated sine before 1.0 and now we finally removed it ([#17367](https://github.com/crystal-lang/crystal/issues/17367))\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota)*\n\n### New Macros\n\n- New macros enable more text operations at compile time: `StringLiteral#bytesize` ([#17176](https://github.com/crystal-lang/crystal/issues/17176)), `NumberLiteral#chr` ([#17169](https://github.com/crystal-lang/crystal/issues/17169)) and `RangeLiteral#each` supports `CharLiteral` ([#17170](https://github.com/crystal-lang/crystal/issues/17170))\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota)*\n\n### Compiler\n\nNew constants `Crystal::ALL_FLAGS` and `Crystal::USER_FLAGS` provide access to the compile time flags ([#17392](https://github.com/crystal-lang/crystal/issues/17392)).\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota)*\n\n### DWARF refactor\n\nWe completely revamped DWARF parsing to enhance performance and reduce memory usage.\nThe DWARF parser now scans sections on demand ([#17283](https://github.com/crystal-lang/crystal/issues/17283)) and builds an efficient index table once ([#17410](https://github.com/crystal-lang/crystal/issues/17410), [#17455](https://github.com/crystal-lang/crystal/issues/17455)), which results in blazingly fast look ups.\nDecoded backtrace lines are cached in an LRU cache ([#17285](https://github.com/crystal-lang/crystal/issues/17285)).\n\nAlso added aupport for DWARF 5 features `DW_FORM_addrx<n>` and `DW_FORM_strx<n>` ([#17445](https://github.com/crystal-lang/crystal/issues/17445)).\n\n*Thanks, [@ysbaddaden](https://github.com/ysbaddaden)*\n\n### HTTP improvements\n\nWe merged numerous improvements and bug fixes for HTTP.\n\n- `#remote_address` and `#local_address` moved from `HTTP::Request` to `HTTP::Context` ([#17196](https://github.com/crystal-lang/crystal/issues/17196))\n- Add `HTTP::Headers#merge` ([#17326](https://github.com/crystal-lang/crystal/issues/17326))\n- Serialize `IO::Memory` in HTTP body with `Content-Length` header ([#17388](https://github.com/crystal-lang/crystal/issues/17388))\n\nBug fixes:\n\n- Reject unrecognized HTTP `Transfer-Encoding` header ([#17140](https://github.com/crystal-lang/crystal/issues/17140)), invalid `Content-Encoding` ([#17262](https://github.com/crystal-lang/crystal/issues/17262)), and invalid HTTP trailer ([#17337](https://github.com/crystal-lang/crystal/issues/17337))\n- **[breaking]** Fix the return values of `HTTP::Request#body=` and `#content_length=` ([#17257](https://github.com/crystal-lang/crystal/issues/17257), [#17273](https://github.com/crystal-lang/crystal/issues/17273))\n- Fix `HTTP.parse_headers_and_body` to not raise with `without_zlib` ([#17272](https://github.com/crystal-lang/crystal/issues/17272))\n- Validate properties of `HTTP::WebSocketHandler` ([#17235](https://github.com/crystal-lang/crystal/issues/17235)), `HTTP::Request` ([#17255](https://github.com/crystal-lang/crystal/issues/17255),[#17304](https://github.com/crystal-lang/crystal/issues/17304), [#17374](https://github.com/crystal-lang/crystal/issues/17374), [#17310](https://github.com/crystal-lang/crystal/issues/17310), [#17312](https://github.com/crystal-lang/crystal/issues/17312), [#17258](https://github.com/crystal-lang/crystal/issues/17258)), `HTTP::Headers` name ([#17317](https://github.com/crystal-lang/crystal/issues/17317))\n- Close `HTTP::Client` on `IO::Error` during request ([#17318](https://github.com/crystal-lang/crystal/issues/17318))\n- Fix `Content-Encoding: deflate` ([#17261](https://github.com/crystal-lang/crystal/issues/17261))\n- Fix `HTTP::Request.from_io` parsing empty header name ([#17254](https://github.com/crystal-lang/crystal/issues/17254))\n- Fix `HTTP::Request#form_params?` to ignore invalid content-type ([#17256](https://github.com/crystal-lang/crystal/issues/17256))\n\n*Thanks [@straight-shoota](https://github.com/straight-shoota), [@hahwul](https://github.com/hahwul), [@jgaskins](https://github.com/jgaskins), [@Sija](https://github.com/Sija)*\n\n### Eventloop\n\nAll targets support a native event loop based directly on the system selector and use it by default.\n\nWe enabled `epoll` on Solaris ([#17370](https://github.com/crystal-lang/crystal/issues/17370)) and `kqueue` on all remaining BSD targets ([#17421](https://github.com/crystal-lang/crystal/issues/17421), [#17420](https://github.com/crystal-lang/crystal/issues/17420)).\n`libevent` is still available as a fallback, but now it’s strictly opt-in and becoming technically obsolete. We expect to deprecate in a following release.\n\n*Thanks, [@ysbaddaden](https://github.com/ysbaddaden)*\n\n### KernelTLS\n\nWe finally enabled support for Kernel TLS in the OpenSSL bindings by default ([#17059](https://github.com/crystal-lang/crystal/issues/17059))\n\n*Thanks, [@ysbaddaden](https://github.com/ysbaddaden)*\n\n### Misc\n\n- `File.exists?` ([#17307](https://github.com/crystal-lang/crystal/issues/17307)), as well as `File::Info.readable?`, `.writable?`, `.executable?` now receive a `follow_symlinks: false` argument([#17391](https://github.com/crystal-lang/crystal/issues/17391))\n- Add `Char::Reader.new(Bytes)` ([#17428](https://github.com/crystal-lang/crystal/issues/17428))\n- Add `Time::Span#to_nanoseconds` etc. ([#17190](https://github.com/crystal-lang/crystal/issues/17190))\n- Add `GC.syscall(&)` ([#17150](https://github.com/crystal-lang/crystal/issues/17150))\n- Fixed backtraces when linking with `-static-pie` on musl-libc ([#17316](https://github.com/crystal-lang/crystal/issues/17316))\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota), [@ysbaddaden](https://github.com/ysbaddaden)*\n\n## Deprecations\n\n- Uppercase instance and class variables ([#17160](https://github.com/crystal-lang/crystal/issues/17160))\n- `HTTP::Request#local_address` and `#remote_address` ([#17260](https://github.com/crystal-lang/crystal/issues/17260))\n- `LLVM::Type#size` and `#alignment` ([#17494](https://github.com/crystal-lang/crystal/issues/17494))\n\n## Dependencies\n\n- Support for LLVM 23.1 and 24.0 ([#17432](https://github.com/crystal-lang/crystal/issues/17432))\n- Updated markd 0.6.0 ([#17269](https://github.com/crystal-lang/crystal/issues/17269))\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota), [@hertzdevil](https://github.com/hertzdevil)*\n\n## Packages\n\nUpdated distribution-scripts ([#17178](https://github.com/crystal-lang/crystal/issues/17178)) brings upgrades of package dependencies, docker base images etc.\n\n*Thanks, [@straight-shoota](https://github.com/straight-shoota)*\n\nThis is the first release featuring builds for `aarch64-windows-msvc`.\n\n*Thanks, [@hertzdevil](https://github.com/hertzdevil)*\n\n## Maintainers\n\nCrystal established a forward compatibility policy in [RFC 30](https://github.com/crystal-lang/rfcs/blob/master/text/0030-forward-compatibility.md): Building Crystal 1.22 requires a stage-0 compiler at 1.14 or higher.\n\n---\n\nThanks\n\nWe have been able to do all of this thanks to the continued support of\n[84codes](https://www.84codes.com/) and all other [sponsors](https://crystal-lang.org/sponsors/). To\nmaintain and increase the development pace, donations, and sponsorships are\nessential. [OpenCollective](https://opencollective.com/crystal-lang) is\navailable for that.\n\nReach out to [crystal@manas.tech](mailto:crystal@manas.tech) if you’d like to\nbecome a direct sponsor or find other ways to support Crystal. We thank you in\nadvance!\n\n[Contribute](https://crystal-lang.org/sponsors#contribute)\n","body_html":"<h1 id=\"crystal-1-22-0-is-released\">Crystal 1.22.0 is released!</h1>\n<p>12 Oct 2026</p>\n<ul><li><img src=\"https://crystal-lang.org/assets/authors/straight-shoota.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></li></ul>\n<p>Johannes Müller</p>\n<p><a href=\"https://crystal-lang.org/api/1.22.0\" rel=\"nofollow ugc noopener\">API Docs</a>\n<a href=\"https://github.com/crystal-lang/crystal/releases/tag/1.22.0\" rel=\"nofollow ugc noopener\">Changelog</a>\n<a href=\"https://github.com/crystal-lang/crystal/tree/1.22.0\" rel=\"nofollow ugc noopener\">Source</a></p>\n<h2 id=\"highlights\">Highlights</h2>\n<ul><li><p><a href=\"#breaking-exit-on-pipe-error\">Standard streams emulate SIGPIPE</a></p><p>stdlib/runtime</p></li><li><p><a href=\"#dwarf-refactor\">Revamped DWARF parsing for performance</a></p><p>stdlib/runtime</p></li><li><p><a href=\"#eventloop\">All targets support native event loop</a></p><p>stdlib/runtime</p></li><li><p><a href=\"#dependencies\">Support for LLVM 23 &amp; 24</a></p><p>stdlib/llvm</p></li><li><p><a href=\"#aarch64-linux-promoted-to-tier-1\"><code>aarch64-linux</code> promoted to Tier 1</a></p><p>platform/linux</p></li></ul>\n<p>We are announcing a new Crystal release 1.22.0 with several new features and bug\nfixes.</p>\n<p>Pre-built packages are available on <a href=\"https://github.com/crystal-lang/crystal/releases/tag/1.22.0\" rel=\"nofollow ugc noopener\">GitHub\nReleases</a> and our\nofficial distribution channels. See\n<a href=\"https://crystal-lang.org/install/\" rel=\"nofollow ugc noopener\">crystal-lang.org/install</a> for installation\ninstructions.</p>\n<h2 id=\"stats\">Stats</h2>\n<p>This release includes <a href=\"https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.22.0\" rel=\"nofollow ugc noopener\">251 changes since\n1.21.1</a>\nby 33 contributors. We thank all the contributors for all the effort put into\nimproving the language! ❤️</p>\n<h2 id=\"changes\">Changes</h2>\n<p>Below we list the most remarkable changes in the language, compiler, and stdlib.\nFor more details, visit the <a href=\"https://github.com/crystal-lang/crystal/blob/master/doc/changelogs/v1.22.md\" rel=\"nofollow ugc noopener\">full\nchangelog</a>.</p>\n<h3 id=\"breaking-exit-on-pipe-error\">Breaking: Exit on pipe error</h3>\n<p>Crystal processes exit immediately when writing to STDOUT or STDERR fails with <code>EPIPE</code>.\nThis closely resembles the default behaviour of the <code>SIGPIPE</code> signal.\nPreviously, the failing write would raise <code>IO::Error</code>, which typically prints\nan error message and exits. This error message is now removed (<a href=\"https://github.com/crystal-lang/crystal/issues/17335\" rel=\"nofollow ugc noopener\">#17335</a>).</p>\n<p>You can opt out of this behaviour with <code>STDOUT.exit_on_broken_pipe = false</code>.</p>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a></em></p>\n<h3 id=\"constants-with-type-declarations\">Constants with type declarations</h3>\n<p>Constants can have type declarations (<a href=\"https://github.com/crystal-lang/crystal/issues/16951\" rel=\"nofollow ugc noopener\">#16951</a>).\nThey work exactly as you would expect the combination of constants and type declarations to be.</p>\n<pre><code>module Foo\n  BAR : Int32 = 1\n  BAZ : String = &quot;&quot;\n  QUX : Int64 = 123 # autocasts 123 to Int64\nend</code></pre>\n<p><em>Thanks, <a href=\"https://github.com/stakach\" rel=\"nofollow ugc noopener\">@stakach</a></em></p>\n<h3 id=\"aarch64-linux-promoted-to-tier-1\"><code>aarch64-linux</code> promoted to Tier 1</h3>\n<p>The targets <code>aarch64-linux-gnu</code> and <code>aarch64-linux-musl</code> moved from Tier 2 to Tier 1.\nThe only missing piece was that we were lacking official builds, but we have that since 1.19.</p>\n<h3 id=\"breaking-process-fork-removed\">Breaking: <code>Process.fork</code> removed</h3>\n<p><code>Process.fork</code> had been deprecated sine before 1.0 and now we finally removed it (<a href=\"https://github.com/crystal-lang/crystal/issues/17367\" rel=\"nofollow ugc noopener\">#17367</a>)</p>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a></em></p>\n<h3 id=\"new-macros\">New Macros</h3>\n<ul><li>New macros enable more text operations at compile time: <code>StringLiteral#bytesize</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17176\" rel=\"nofollow ugc noopener\">#17176</a>), <code>NumberLiteral#chr</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17169\" rel=\"nofollow ugc noopener\">#17169</a>) and <code>RangeLiteral#each</code> supports <code>CharLiteral</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17170\" rel=\"nofollow ugc noopener\">#17170</a>)</li></ul>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a></em></p>\n<h3 id=\"compiler\">Compiler</h3>\n<p>New constants <code>Crystal::ALL_FLAGS</code> and <code>Crystal::USER_FLAGS</code> provide access to the compile time flags (<a href=\"https://github.com/crystal-lang/crystal/issues/17392\" rel=\"nofollow ugc noopener\">#17392</a>).</p>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a></em></p>\n<h3 id=\"dwarf-refactor\">DWARF refactor</h3>\n<p>We completely revamped DWARF parsing to enhance performance and reduce memory usage.\nThe DWARF parser now scans sections on demand (<a href=\"https://github.com/crystal-lang/crystal/issues/17283\" rel=\"nofollow ugc noopener\">#17283</a>) and builds an efficient index table once (<a href=\"https://github.com/crystal-lang/crystal/issues/17410\" rel=\"nofollow ugc noopener\">#17410</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17455\" rel=\"nofollow ugc noopener\">#17455</a>), which results in blazingly fast look ups.\nDecoded backtrace lines are cached in an LRU cache (<a href=\"https://github.com/crystal-lang/crystal/issues/17285\" rel=\"nofollow ugc noopener\">#17285</a>).</p>\n<p>Also added aupport for DWARF 5 features <code>DW_FORM_addrx&lt;n&gt;</code> and <code>DW_FORM_strx&lt;n&gt;</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17445\" rel=\"nofollow ugc noopener\">#17445</a>).</p>\n<p><em>Thanks, <a href=\"https://github.com/ysbaddaden\" rel=\"nofollow ugc noopener\">@ysbaddaden</a></em></p>\n<h3 id=\"http-improvements\">HTTP improvements</h3>\n<p>We merged numerous improvements and bug fixes for HTTP.</p>\n<ul><li><code>#remote_address</code> and <code>#local_address</code> moved from <code>HTTP::Request</code> to <code>HTTP::Context</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17196\" rel=\"nofollow ugc noopener\">#17196</a>)</li><li>Add <code>HTTP::Headers#merge</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17326\" rel=\"nofollow ugc noopener\">#17326</a>)</li><li>Serialize <code>IO::Memory</code> in HTTP body with <code>Content-Length</code> header (<a href=\"https://github.com/crystal-lang/crystal/issues/17388\" rel=\"nofollow ugc noopener\">#17388</a>)</li></ul>\n<p>Bug fixes:</p>\n<ul><li>Reject unrecognized HTTP <code>Transfer-Encoding</code> header (<a href=\"https://github.com/crystal-lang/crystal/issues/17140\" rel=\"nofollow ugc noopener\">#17140</a>), invalid <code>Content-Encoding</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17262\" rel=\"nofollow ugc noopener\">#17262</a>), and invalid HTTP trailer (<a href=\"https://github.com/crystal-lang/crystal/issues/17337\" rel=\"nofollow ugc noopener\">#17337</a>)</li><li><strong>[breaking]</strong> Fix the return values of <code>HTTP::Request#body=</code> and <code>#content_length=</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17257\" rel=\"nofollow ugc noopener\">#17257</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17273\" rel=\"nofollow ugc noopener\">#17273</a>)</li><li>Fix <code>HTTP.parse_headers_and_body</code> to not raise with <code>without_zlib</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17272\" rel=\"nofollow ugc noopener\">#17272</a>)</li><li>Validate properties of <code>HTTP::WebSocketHandler</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17235\" rel=\"nofollow ugc noopener\">#17235</a>), <code>HTTP::Request</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17255\" rel=\"nofollow ugc noopener\">#17255</a>,<a href=\"https://github.com/crystal-lang/crystal/issues/17304\" rel=\"nofollow ugc noopener\">#17304</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17374\" rel=\"nofollow ugc noopener\">#17374</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17310\" rel=\"nofollow ugc noopener\">#17310</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17312\" rel=\"nofollow ugc noopener\">#17312</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17258\" rel=\"nofollow ugc noopener\">#17258</a>), <code>HTTP::Headers</code> name (<a href=\"https://github.com/crystal-lang/crystal/issues/17317\" rel=\"nofollow ugc noopener\">#17317</a>)</li><li>Close <code>HTTP::Client</code> on <code>IO::Error</code> during request (<a href=\"https://github.com/crystal-lang/crystal/issues/17318\" rel=\"nofollow ugc noopener\">#17318</a>)</li><li>Fix <code>Content-Encoding: deflate</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17261\" rel=\"nofollow ugc noopener\">#17261</a>)</li><li>Fix <code>HTTP::Request.from_io</code> parsing empty header name (<a href=\"https://github.com/crystal-lang/crystal/issues/17254\" rel=\"nofollow ugc noopener\">#17254</a>)</li><li>Fix <code>HTTP::Request#form_params?</code> to ignore invalid content-type (<a href=\"https://github.com/crystal-lang/crystal/issues/17256\" rel=\"nofollow ugc noopener\">#17256</a>)</li></ul>\n<p><em>Thanks <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a>, <a href=\"https://github.com/hahwul\" rel=\"nofollow ugc noopener\">@hahwul</a>, <a href=\"https://github.com/jgaskins\" rel=\"nofollow ugc noopener\">@jgaskins</a>, <a href=\"https://github.com/Sija\" rel=\"nofollow ugc noopener\">@Sija</a></em></p>\n<h3 id=\"eventloop\">Eventloop</h3>\n<p>All targets support a native event loop based directly on the system selector and use it by default.</p>\n<p>We enabled <code>epoll</code> on Solaris (<a href=\"https://github.com/crystal-lang/crystal/issues/17370\" rel=\"nofollow ugc noopener\">#17370</a>) and <code>kqueue</code> on all remaining BSD targets (<a href=\"https://github.com/crystal-lang/crystal/issues/17421\" rel=\"nofollow ugc noopener\">#17421</a>, <a href=\"https://github.com/crystal-lang/crystal/issues/17420\" rel=\"nofollow ugc noopener\">#17420</a>).\n<code>libevent</code> is still available as a fallback, but now it’s strictly opt-in and becoming technically obsolete. We expect to deprecate in a following release.</p>\n<p><em>Thanks, <a href=\"https://github.com/ysbaddaden\" rel=\"nofollow ugc noopener\">@ysbaddaden</a></em></p>\n<h3 id=\"kerneltls\">KernelTLS</h3>\n<p>We finally enabled support for Kernel TLS in the OpenSSL bindings by default (<a href=\"https://github.com/crystal-lang/crystal/issues/17059\" rel=\"nofollow ugc noopener\">#17059</a>)</p>\n<p><em>Thanks, <a href=\"https://github.com/ysbaddaden\" rel=\"nofollow ugc noopener\">@ysbaddaden</a></em></p>\n<h3 id=\"misc\">Misc</h3>\n<ul><li><code>File.exists?</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17307\" rel=\"nofollow ugc noopener\">#17307</a>), as well as <code>File::Info.readable?</code>, <code>.writable?</code>, <code>.executable?</code> now receive a <code>follow_symlinks: false</code> argument(<a href=\"https://github.com/crystal-lang/crystal/issues/17391\" rel=\"nofollow ugc noopener\">#17391</a>)</li><li>Add <code>Char::Reader.new(Bytes)</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17428\" rel=\"nofollow ugc noopener\">#17428</a>)</li><li>Add <code>Time::Span#to_nanoseconds</code> etc. (<a href=\"https://github.com/crystal-lang/crystal/issues/17190\" rel=\"nofollow ugc noopener\">#17190</a>)</li><li>Add <code>GC.syscall(&amp;)</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17150\" rel=\"nofollow ugc noopener\">#17150</a>)</li><li>Fixed backtraces when linking with <code>-static-pie</code> on musl-libc (<a href=\"https://github.com/crystal-lang/crystal/issues/17316\" rel=\"nofollow ugc noopener\">#17316</a>)</li></ul>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a>, <a href=\"https://github.com/ysbaddaden\" rel=\"nofollow ugc noopener\">@ysbaddaden</a></em></p>\n<h2 id=\"deprecations\">Deprecations</h2>\n<ul><li>Uppercase instance and class variables (<a href=\"https://github.com/crystal-lang/crystal/issues/17160\" rel=\"nofollow ugc noopener\">#17160</a>)</li><li><code>HTTP::Request#local_address</code> and <code>#remote_address</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17260\" rel=\"nofollow ugc noopener\">#17260</a>)</li><li><code>LLVM::Type#size</code> and <code>#alignment</code> (<a href=\"https://github.com/crystal-lang/crystal/issues/17494\" rel=\"nofollow ugc noopener\">#17494</a>)</li></ul>\n<h2 id=\"dependencies\">Dependencies</h2>\n<ul><li>Support for LLVM 23.1 and 24.0 (<a href=\"https://github.com/crystal-lang/crystal/issues/17432\" rel=\"nofollow ugc noopener\">#17432</a>)</li><li>Updated markd 0.6.0 (<a href=\"https://github.com/crystal-lang/crystal/issues/17269\" rel=\"nofollow ugc noopener\">#17269</a>)</li></ul>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a>, <a href=\"https://github.com/hertzdevil\" rel=\"nofollow ugc noopener\">@hertzdevil</a></em></p>\n<h2 id=\"packages\">Packages</h2>\n<p>Updated distribution-scripts (<a href=\"https://github.com/crystal-lang/crystal/issues/17178\" rel=\"nofollow ugc noopener\">#17178</a>) brings upgrades of package dependencies, docker base images etc.</p>\n<p><em>Thanks, <a href=\"https://github.com/straight-shoota\" rel=\"nofollow ugc noopener\">@straight-shoota</a></em></p>\n<p>This is the first release featuring builds for <code>aarch64-windows-msvc</code>.</p>\n<p><em>Thanks, <a href=\"https://github.com/hertzdevil\" rel=\"nofollow ugc noopener\">@hertzdevil</a></em></p>\n<h2 id=\"maintainers\">Maintainers</h2>\n<p>Crystal established a forward compatibility policy in <a href=\"https://github.com/crystal-lang/rfcs/blob/master/text/0030-forward-compatibility.md\" rel=\"nofollow ugc noopener\">RFC 30</a>: Building Crystal 1.22 requires a stage-0 compiler at 1.14 or higher.</p>\n<hr />\n<p>Thanks</p>\n<p>We have been able to do all of this thanks to the continued support of\n<a href=\"https://www.84codes.com/\" rel=\"nofollow ugc noopener\">84codes</a> and all other <a href=\"https://crystal-lang.org/sponsors/\" rel=\"nofollow ugc noopener\">sponsors</a>. To\nmaintain and increase the development pace, donations, and sponsorships are\nessential. <a href=\"https://opencollective.com/crystal-lang\" rel=\"nofollow ugc noopener\">OpenCollective</a> is\navailable for that.</p>\n<p>Reach out to <a href=\"mailto:crystal@manas.tech\">crystal@manas.tech</a> if you’d like to\nbecome a direct sponsor or find other ways to support Crystal. We thank you in\nadvance!</p>\n<p><a href=\"https://crystal-lang.org/sponsors#contribute\" rel=\"nofollow ugc noopener\">Contribute</a></p>","headings":[{"level":1,"text":"Crystal 1.22.0 is released!","id":"crystal-1-22-0-is-released"},{"level":2,"text":"Highlights","id":"highlights"},{"level":2,"text":"Stats","id":"stats"},{"level":2,"text":"Changes","id":"changes"},{"level":3,"text":"Breaking: Exit on pipe error","id":"breaking-exit-on-pipe-error"},{"level":3,"text":"Constants with type declarations","id":"constants-with-type-declarations"},{"level":3,"text":"aarch64-linux promoted to Tier 1","id":"aarch64-linux-promoted-to-tier-1"},{"level":3,"text":"Breaking: Process.fork removed","id":"breaking-process-fork-removed"},{"level":3,"text":"New Macros","id":"new-macros"},{"level":3,"text":"Compiler","id":"compiler"},{"level":3,"text":"DWARF refactor","id":"dwarf-refactor"},{"level":3,"text":"HTTP improvements","id":"http-improvements"},{"level":3,"text":"Eventloop","id":"eventloop"},{"level":3,"text":"KernelTLS","id":"kerneltls"},{"level":3,"text":"Misc","id":"misc"},{"level":2,"text":"Deprecations","id":"deprecations"},{"level":2,"text":"Dependencies","id":"dependencies"},{"level":2,"text":"Packages","id":"packages"},{"level":2,"text":"Maintainers","id":"maintainers"}]}}