<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Crystal Releases</title>
  <subtitle>A language for humans and computers</subtitle>
  <link href="https://crystal-lang.org/" rel="alternate" type="text/html" />
  <link href="https://crystal-lang.org/releases/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://crystal-lang.org/feed.xml" rel="related" type="application/atom+xml" />
  <updated>2026-04-21T09:50:37+00:00</updated>
  <id>https://crystal-lang.org/releases/feed.xml</id>
    <entry>
      <title>Crystal 1.20.0 is released!</title>
      <author>
        <name>Julien Portalier</name>
        <uri>https://github.com/ysbaddaden/</uri>
      </author><link href="https://crystal-lang.org/2026/04/16/1.20.0-released/" rel="alternate" type="text/html" title="Crystal 1.20.0 is released!" />
      <published>2026-04-16T00:00:00+00:00</published>
      <updated>2026-04-16T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2026/04/16/1.20.0-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2026/04/16/1.20.0-released/">&lt;p&gt;We are announcing a new Crystal release 1.20.0 with several new features and bug
fixes.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.20.0&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.20.0&quot;&gt;161 changes since 1.19.1&lt;/a&gt;
by 21 contributors. We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Below we list the most remarkable changes in the language, compiler and stdlib.
For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.20.0&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;breaking&quot;&gt;Breaking&lt;/h3&gt;
  &lt;a href=&quot;#breaking&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Breaking&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;We do not expect any breaking changes in existing code. We expect the few
bugfixes below to not negatively impact your programs. If you notice any
unexpected issues, please let us know in the &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues&quot;&gt;issue tracker&lt;/a&gt; or &lt;a href=&quot;https://forum.crystal-lang.org/&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;OpenSSL sockets shouldn’t flush on read (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16650&quot;&gt;#16650&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fix &lt;a href=&quot;https://crystal-lang.org/api/master/Process.html#wait:Process::Status-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process#wait&lt;/code&gt;&lt;/a&gt; to not close &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@input&lt;/code&gt; before waiting (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16620&quot;&gt;#16620&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16638&quot;&gt;#16638&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Ensure that heredoc lexing allows only valid identifiers (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16548&quot;&gt;#16548&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sija&quot;&gt;@Sija&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;security&quot;&gt;Security&lt;/h3&gt;
  &lt;a href=&quot;#security&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Security&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::Server&lt;/code&gt; accepted requests containing both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Length&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Transfer-Encoding&lt;/code&gt;
headers and prioritized &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Length&lt;/code&gt;. This allowed HTTP request smuggling as per
&lt;a href=&quot;https://cwe.mitre.org/data/definitions/444.html&quot;&gt;CWE-444&lt;/a&gt; when the server is behind a vulnerable frontend. Refer to the
&lt;a href=&quot;https://github.com/crystal-lang/crystal/security/advisories/GHSA-wqh5-7w63-pm68&quot;&gt;advisory&lt;/a&gt;
for more details.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::Server&lt;/code&gt; now rejects requests where both headers are present. The HTTP parser now
ignores &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Length&lt;/code&gt; when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Transfer-Encoding&lt;/code&gt; header is present. (commit &lt;a href=&quot;https://github.com/crystal-lang/crystal/commit/c948b31ee6d5414050e771f89955c7dc02883ebc&quot;&gt;c948b31&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;target-features&quot;&gt;Target features&lt;/h3&gt;
  &lt;a href=&quot;#target-features&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Target features&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/crystal-lang/rfcs/pull/20&quot;&gt;RFC 0020&lt;/a&gt; introduces a new &lt;a href=&quot;https://crystal-lang.org/api/master/TargetFeature.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@[TargetFeature]&lt;/code&gt;&lt;/a&gt; annotation that allows specifying
CPU features or a CPU model or variant for individual functions. It
complements the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--mattr&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--mcpu&lt;/code&gt; CLI arguments that target the whole
program. This allows embedding multiple optimized functions for different CPU
features into a single executable, for example a portable SIMD
implementation alongside AVX2 and AVX512 alternatives.&lt;/p&gt;

&lt;p&gt;The program is responsible for detecting which feature is available and calling the
proper function at runtime. Otherwise, the program might crash with SIGILL, for
example.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-crystal highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flag?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:x86_64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;
  &lt;span class=&quot;nd&quot;&gt;@[TargetFeature(&quot;+avx2&quot;)]&lt;/span&gt;
  &lt;span class=&quot;kp&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo_avx2&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;kp&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;cpu_supports_avx2?&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;

&lt;span class=&quot;kp&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo_portable&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flag?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:x86_64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo_avx2&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cpu_supports_avx2?&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;foo_portable&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;While not strictly required, we still recommend wrapping architecture-specific
method definitions within macro flag checks.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/TargetFeature.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@[TargetFeature]&lt;/code&gt;&lt;/a&gt; annotation (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16717&quot;&gt;#16717&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/stakach&quot;&gt;@stakach&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;execution-contexts&quot;&gt;Execution contexts&lt;/h3&gt;
  &lt;a href=&quot;#execution-contexts&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Execution contexts&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Execution contexts from &lt;a href=&quot;https://github.com/crystal-lang/rfcs/pull/2&quot;&gt;RFC 0002&lt;/a&gt; continue as a final preview feature,
enabled with the compiler flags &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dpreview_mt -Dexecution_context&lt;/code&gt;. We plan to
enable it by default in Crystal 1.21.&lt;/p&gt;

&lt;p&gt;In addition to fixing bugs, we implemented M:N scheduling that allows threads to
be attached to and detached from a context. This avoids blocking other
fibers on certain syscalls, such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getaddrinfo&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::ThreadPool&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/15885&quot;&gt;#15885&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16750&quot;&gt;#16750&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Detach execution context scheduler from running thread during blocking syscall (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/15871&quot;&gt;#15871&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16679&quot;&gt;#16679&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The parallel contexts now automatically start threads to adapt to the actual
workload and distribute fibers across more cores when needed.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add adaptive scaling to &lt;a href=&quot;https://crystal-lang.org/api/master/Fiber/ExecutionContext/Parallel.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionContext::Parallel&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16719&quot;&gt;#16719&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This effort is part of the &lt;a href=&quot;/2024/02/09/84codes-manas-mt/&quot;&gt;ongoing project to improve multi-threading support&lt;/a&gt;
with the help of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;process-api&quot;&gt;Process API&lt;/h3&gt;
  &lt;a href=&quot;#process-api&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Process API&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release brings a new ergonomic, safe, and portable API for spawning sub-processes, as proposed in &lt;a href=&quot;https://github.com/crystal-lang/rfcs/pull/25&quot;&gt;RFC 0025&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A significant change is that the modern API treats the command line as an array of strings.
The first element is the program to execute, and the remaining elements are its arguments.&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# legacy API:&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;Process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;crystal&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# modern API:&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;Process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;crystal&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The new API also includes convenient methods for capturing process output:
&lt;a href=&quot;https://crystal-lang.org/api/master/Process.html#capture%28args%3AEnumerable%28String%29%2C%2A%2Cenv%3AEnv%3Dnil%2Cclear_env%3ABool%3Dfalse%2Cinput%3AStdio%3DRedirect%3A%3AClose%2Cerror%3AStdio%3DRedirect%3A%3APipe%2Cchdir%3APath%7CString%7CNil%3Dnil%29%3AString-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.capture&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/master/Process.html#capture_result%28args%3AEnumerable%28String%29%2C%2A%2Cenv%3AEnv%3Dnil%2Cclear_env%3ABool%3Dfalse%2Cinput%3AStdio%3DRedirect%3A%3AClose%2Coutput%3AStdio%3DRedirect%3A%3APipe%2Cerror%3AStdio%3DRedirect%3A%3APipe%2Cchdir%3APath%7CString%7CNil%3Dnil%29%3AResult-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.capture_result&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new API does not have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shell&lt;/code&gt; parameter. If you need shell behaviour, we recommend running a shell explicitly.&lt;/p&gt;

&lt;p&gt;These are the most significant individual changes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add overloads with combined &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;args&lt;/code&gt; parameter instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;command, args&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16681&quot;&gt;#16681&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16739&quot;&gt;#16739&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/Process.html#run%3F%28args%3AEnumerable%28String%29%2C%2A%2Cenv%3AEnv%3Dnil%2Cclear_env%3ABool%3Dfalse%2Cinput%3AStdio%3DRedirect%3A%3AClose%2Coutput%3AStdio%3DRedirect%3A%3AClose%2Cerror%3AStdio%3DRedirect%3A%3AClose%2Cchdir%3APath%7CString%7CNil%3Dnil%29%3AProcess%3A%3AStatus%7CNil-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.run?&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16738&quot;&gt;#16738&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/Process.html#capture%28args%3AEnumerable%28String%29%2C%2A%2Cenv%3AEnv%3Dnil%2Cclear_env%3ABool%3Dfalse%2Cinput%3AStdio%3DRedirect%3A%3AClose%2Cerror%3AStdio%3DRedirect%3A%3APipe%2Cchdir%3APath%7CString%7CNil%3Dnil%29%3AString-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.capture&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16773&quot;&gt;#16773&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All new methods and overloads are experimental.
We expect to stabilize the API for the next release.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;io_uring&quot;&gt;io_uring&lt;/h3&gt;
  &lt;a href=&quot;#io_uring&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled io_uring&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;An io_uring event loop is available for Linux targets and can be selected by
specifying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Devloop=io_uring&lt;/code&gt; when compiling. The event loop is highly
experimental and its performance benefits will differ for every program. We don’t
expect it to be faster than epoll, and it may even be slower, except on some
benchmarks with SQPOLL enabled.&lt;/p&gt;

&lt;p&gt;SQPOLL can be selected by specifying the idle time for the kernel threads with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dio_uring_sq_thread_idle=200&lt;/code&gt; (for 200ms). It is recommended to keep the idle
time low (below 2s), otherwise your CPU cores will regularly spin at 100% usage
when doing nothing.&lt;/p&gt;

&lt;p&gt;An interesting but potentially surprising behavior is that any I/O call that &lt;em&gt;could&lt;/em&gt;
yield the calling fiber will now &lt;em&gt;always&lt;/em&gt; yield. One benefit is that an always
ready socket won’t block other fibers from progressing. A downside is that there
might be lots of context switches.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add io_uring event loop (linux) (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16264&quot;&gt;#16264&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;kernel-tls&quot;&gt;Kernel TLS&lt;/h3&gt;
  &lt;a href=&quot;#kernel-tls&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Kernel TLS&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Kernel TLS is now supported by default on Linux and FreeBSD as long as support
has been compiled into OpenSSL (which should be the default) and enabled on the
system (likely disabled by default), for example with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;modprobe tls&lt;/code&gt; on Linux.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add Kernel TLS support to custom &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OpenSSL::BIO&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16646&quot;&gt;#16646&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;macros&quot;&gt;Macros&lt;/h3&gt;
  &lt;a href=&quot;#macros&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Macros&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#select&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#reject&lt;/code&gt; to &lt;a href=&quot;https://crystal-lang.org/api/master/Crystal/Macros/HashLiteral.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HashLiteral&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/master/Crystal/Macros/NamedTupleLiteral.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NamedTupleLiteral&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16558&quot;&gt;#16558&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Refine error message for unsupported named arguments in macros (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16576&quot;&gt;#16576&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/Blacksmoke16&quot;&gt;@Blacksmoke16&lt;/a&gt;, &lt;a href=&quot;https://github.com/hahwul&quot;&gt;@hahwul&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;standard-library&quot;&gt;Standard library&lt;/h3&gt;
  &lt;a href=&quot;#standard-library&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Standard library&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/master/OptionParser.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OptionParser&lt;/code&gt;&lt;/a&gt; now supports option bundling and can parse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-ncfoo&lt;/code&gt;
as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-n -c foo&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add short option bundling for &lt;a href=&quot;https://crystal-lang.org/api/master/OptionParser.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OptionParser&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16770&quot;&gt;#16770&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/Qard&quot;&gt;@Qard&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://crystal-lang.org/api/master/OAuth.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OAuth&lt;/code&gt;&lt;/a&gt; module expected a success response on HTTP OK statuses, but multiple
OAuth providers send error responses with an HTTP OK status (sic).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Detect &lt;a href=&quot;https://crystal-lang.org/api/master/OAuth.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OAuth&lt;/code&gt;&lt;/a&gt; error in payload (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16634&quot;&gt;#16634&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/jgaskins&quot;&gt;@jgaskins&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/master/HTTP/WebSocket.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::WebSocket&lt;/code&gt;&lt;/a&gt; can now negotiate sub-protocols.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sec-WebSocket-Protocol&lt;/code&gt; checks to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::WebSocket::Protocol&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16600&quot;&gt;#16600&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16671&quot;&gt;#16671&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sec-WebSocket-Protocol&lt;/code&gt; to &lt;a href=&quot;https://crystal-lang.org/api/master/HTTP/WebSocketHandler.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::WebSocketHandler&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16574&quot;&gt;#16574&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/antondalgren&quot;&gt;@antondalgren&lt;/a&gt;, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringScanner&lt;/code&gt;&lt;/a&gt; saw multiple improvements, ranging from performance to subtle
niceties for debugging.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html#scan(len:Int):String|Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringScanner#scan&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html#check%28len%3AInt%29%3AString%7CNil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#check&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html#skip(len:Int):Int32|Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#skip&lt;/code&gt;&lt;/a&gt; overloads for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Int&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16557&quot;&gt;#16557&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html#peek_behind(len):String-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringScanner#peek_behind&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16593&quot;&gt;#16593&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add convenience methods to &lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringScanner&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16595&quot;&gt;#16595&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Improve cursor window format in &lt;a href=&quot;https://crystal-lang.org/api/master/StringScanner.html#inspect%28io%3AIO%29%3ANil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringScanner#inspect&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16594&quot;&gt;#16594&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/jneen&quot;&gt;@jneen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The memory management model for libxml2 changed in Crystal 1.17 to become manual
instead of integrating the GC. The change introduced another memory leak that is
now fixed.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xmlFree&lt;/code&gt; for the string pointer from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xmlNodeGetContent&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16688&quot;&gt;#16688&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/toddsundsted&quot;&gt;@toddsundsted&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some additional niceties:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/IO.html#read_greedy(slice:Bytes):Int32-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO#read_greedy&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16535&quot;&gt;#16535&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/FileUtils.html#rm_f(path:Path|String):Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FileUtils#rm_f&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/12832&quot;&gt;#12832&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/Pointer.html#align_up(boundary:UInt64):Pointer(T)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pointer#align_up&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/master/Pointer.html#align_down(boundary:UInt64):Pointer(T)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#align_down&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16585&quot;&gt;#16585&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/master/HTTP/Server/Response.html#content_type:String|Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::Server::Response#content_type&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/master/HTTP/Server/Response.html#content_length:Int64|Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#content_length&lt;/code&gt;&lt;/a&gt; as convenient accessors (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16712&quot;&gt;#16712&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/BlobCodes&quot;&gt;@BlobCodes&lt;/a&gt;, &lt;a href=&quot;https://github.com/CTC97&quot;&gt;@CTC97&lt;/a&gt;, &lt;a href=&quot;https://github.com/zw963&quot;&gt;@zw963&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;compiler&quot;&gt;Compiler&lt;/h3&gt;
  &lt;a href=&quot;#compiler&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Compiler&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Prefer modern linker (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mold&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lld&lt;/code&gt;) (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16696&quot;&gt;#16696&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Parse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MacroVar&lt;/code&gt; with empty expressions: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%var{}&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16772&quot;&gt;#16772&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Parse &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProcNotation&lt;/code&gt; with empty arg parenthesis: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;() -&amp;gt;&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16741&quot;&gt;#16741&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--base-path&lt;/code&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;crystal docs&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16091&quot;&gt;#16091&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;, &lt;a href=&quot;https://github.com/matiasgarciaisaia&quot;&gt;@matiasgarciaisaia&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;dependencies&quot;&gt;Dependencies&lt;/h3&gt;
  &lt;a href=&quot;#dependencies&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Dependencies&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Support for LLVM 22.1 and 23.0 (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16631&quot;&gt;#16631&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h3&gt;
  &lt;a href=&quot;#deprecations&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Deprecations&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;There is a single deprecation in this release, and it is a trivial one: rename
&lt;a href=&quot;https://crystal-lang.org/api/master/Mutex.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mutex&lt;/code&gt;&lt;/a&gt; to &lt;a href=&quot;https://crystal-lang.org/api/master/Sync/Mutex.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::Mutex&lt;/code&gt;&lt;/a&gt; to use the new algorithm introduced in Crystal 1.19.&lt;/p&gt;

&lt;p&gt;We’re experimenting with a two-step mechanism to deprecate a feature. First, we
soft deprecate the method in the documentation with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DEPRECATE:&lt;/code&gt; callout, then
after a few releases we’ll hard deprecate by adding the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@[Deprecated]&lt;/code&gt;
annotation.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Soft deprecate &lt;a href=&quot;https://crystal-lang.org/api/master/Mutex.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mutex&lt;/code&gt;&lt;/a&gt; in favor of &lt;a href=&quot;https://crystal-lang.org/api/master/Sync/Mutex.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::Mutex&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16737&quot;&gt;#16737&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of
 &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.  To
 maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.19.1 is released!</title>
      <author>
        <name>Julien Portalier</name>
        <uri>https://github.com/ysbaddaden/</uri>
      </author><link href="https://crystal-lang.org/2026/01/20/1.19.1-released/" rel="alternate" type="text/html" title="Crystal 1.19.1 is released!" />
      <published>2026-01-20T00:00:00+00:00</published>
      <updated>2026-01-20T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2026/01/20/1.19.1-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2026/01/20/1.19.1-released/">&lt;p&gt;We are announcing a new Crystal release 1.19.1 with two regressions fixed.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;/2026/01/15/1.19.0-released/&quot;&gt;the release notes of 1.19.0&lt;/a&gt; for all the changes introduced in Crystal 1.19.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.19.1&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.19.1&quot;&gt;2 changes since
1.19.0&lt;/a&gt;
by 1 contributor.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This patch release fixes regressions in timer conversions from absolute to relative
time (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16581&quot;&gt;#16581&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16583&quot;&gt;#16583&lt;/a&gt;) that led &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep(seconds)&lt;/code&gt; to immediately trigger instead
of waiting on some platforms (Darwin, BSDs, Windows) — both introduced in 1.19.0.&lt;/p&gt;

&lt;p&gt;For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.19.1&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of
 &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.  To
 maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.19.0 is released!</title>
      <author>
        <name>Julien Portalier</name>
        <uri>https://github.com/ysbaddaden/</uri>
      </author><link href="https://crystal-lang.org/2026/01/15/1.19.0-released/" rel="alternate" type="text/html" title="Crystal 1.19.0 is released!" />
      <published>2026-01-15T00:00:00+00:00</published>
      <updated>2026-01-15T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2026/01/15/1.19.0-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2026/01/15/1.19.0-released/">&lt;p&gt;We are announcing a new Crystal release 1.19.0 with several new features and bug
fixes.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.19.0&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.19.0&quot;&gt;237 changes since
1.18.2&lt;/a&gt;
by 24 contributors. We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Below we list the most remarkable changes in the language, compiler and stdlib.
For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.19.0&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We do not expect any breaking changes in existing code. If you notice any
unexpected issues, please let us know in the &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues&quot;&gt;issue tracker&lt;/a&gt; or &lt;a href=&quot;https://forum.crystal-lang.org/&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;breaking&quot;&gt;Breaking&lt;/h3&gt;
  &lt;a href=&quot;#breaking&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Breaking&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The following changes break prior behavior of the compiler, but we expect them
to not have much effect in existing code. If you notice any unexpected issues,
please let us know in the &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues&quot;&gt;issue tracker&lt;/a&gt; or &lt;a href=&quot;https://forum.crystal-lang.org/&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;compiler-flags-now-have-values&quot;&gt;Compiler flags now have values&lt;/h4&gt;
  &lt;a href=&quot;#compiler-flags-now-have-values&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Compiler flags now have values&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flag?&lt;/code&gt; macro is now aware of name-value mappings in the form of
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name=value&lt;/code&gt; where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flag?(:name)&lt;/code&gt; will now return the respective &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value&lt;/code&gt; as a
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16310&quot;&gt;#16310&lt;/a&gt;). A key without a value returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; as implicit
value, as before.&lt;/p&gt;

&lt;p&gt;Instead of returning a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BoolLiteral&lt;/code&gt; the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flag?&lt;/code&gt; macro might now return a
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral&lt;/code&gt; which might be unexpected. The value is still truthy and
shouldn’t cause issues in practice.&lt;/p&gt;

&lt;p&gt;For example, the value printed by `` may now be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;(not defined)&lt;/em&gt; =&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dname&lt;/code&gt; =&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dname=value&lt;/code&gt; =&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;value&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dname=some,other,data&lt;/code&gt; =&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;some,other,data&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;adjust-monotonic-clocks&quot;&gt;Adjust monotonic clocks&lt;/h4&gt;
  &lt;a href=&quot;#adjust-monotonic-clocks&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Adjust monotonic clocks&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The monotonic clock has been adjusted on Linux and macOS to include suspended
time, when they previously counted the system uptime.&lt;/p&gt;

&lt;p&gt;UNIX targets still use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLOCK_MONOTONIC&lt;/code&gt; except for Linux that now uses
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLOCK_BOOTTIME&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16516&quot;&gt;#16516&lt;/a&gt;) and macOS that now uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLOCK_MONOTONIC_RAW&lt;/code&gt;
instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mach_absolute_time&lt;/code&gt; that internally used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLOCK_UPTIME_RAW&lt;/code&gt;
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16516&quot;&gt;#16516&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16492&quot;&gt;#16492&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The change is affecting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.measure&lt;/code&gt; for example, that should now include
suspended time across the different targets, rather than sometimes including
it, and sometimes not.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;execution-contexts&quot;&gt;Execution contexts&lt;/h3&gt;
  &lt;a href=&quot;#execution-contexts&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Execution contexts&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Execution contexts from &lt;a href=&quot;https://github.com/crystal-lang/rfcs/pull/2&quot;&gt;RFC 0002&lt;/a&gt; continue as a final preview feature with
opt-in with compiler flags &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dpreview_mt -Dexecution_context&lt;/code&gt; and we plan to
finally enable the feature by default in the 1.20 release!&lt;/p&gt;

&lt;p&gt;There has not been huge developments to the feature, but corrections to fix the
remaining thread safety issues in the standard library, for example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add thread safety to default random (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16174&quot;&gt;#16174&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Closing system fd is thread unsafe (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16289&quot;&gt;#16289&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Thread safety of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Exception::Callstack&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16504&quot;&gt;#16504&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We started to merge synchronization primitives from &lt;a href=&quot;https://github.com/ysbaddaden/sync/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ysbaddaden/sync&lt;/code&gt;&lt;/a&gt;
into the standard library as well:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Sync/Mutex.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::Mutex&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Sync/RWLock.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::RWLock&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16399&quot;&gt;#16399&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Sync/ConditionVariable.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::ConditionVariable&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16440&quot;&gt;#16440&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Sync/Exclusive.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::Exclusive&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Sync/Shared.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Sync::Shared&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16487&quot;&gt;#16487&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This effort is part of the &lt;a href=&quot;/2024/02/09/84codes-manas-mt/&quot;&gt;ongoing project to improve multi-threading support&lt;/a&gt;
with the help of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;time&quot;&gt;Time&lt;/h3&gt;
  &lt;a href=&quot;#time&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Time&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Introduces the &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Time/Instant.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt;&lt;/a&gt; type to represent instants on the monotonic
timeline as defined in &lt;a href=&quot;https://github.com/crystal-lang/rfcs/blob/main/text/0015-time-monotonic.md&quot;&gt;RFC 0015&lt;/a&gt; instead of overloading the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Span&lt;/code&gt; type
that represents a duration, not an instant (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16490&quot;&gt;#16490&lt;/a&gt;). We expect a clearer and
safer API:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt; represents a single point on the monotonic timeline.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Span&lt;/code&gt; continues to represent a duration.&lt;/li&gt;
  &lt;li&gt;Subtracting two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt; instances yields a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Span&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Adding/subtracting a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Span&lt;/code&gt; to/from an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt; yields a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also adjusted the monotonic clock (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16516&quot;&gt;#16516&lt;/a&gt;), applied the changes (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16498&quot;&gt;#16498&lt;/a&gt;)
and deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.monotonic&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16545&quot;&gt;#16545&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-crystal highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;timeout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;seconds&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;instant&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;elapsed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timeout&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# do something&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In order to migrate existing code to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt;, replace calls to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.monotonic&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.instant&lt;/code&gt;. If the instant time reading is stored in an explicitly typed variable (e.g. an instance variable), change the type from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Span&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Instant&lt;/code&gt;. The APIs of these types are very similar so most use cases should not need any further adaptions.&lt;/p&gt;

&lt;p&gt;Finally, we made some further adjustments:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Treat GMT as a legacy alias of UTC (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16292&quot;&gt;#16292&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/zoneinfo&lt;/code&gt; to zoneinfo lookup paths (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16463&quot;&gt;#16463&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$TZDIR&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16466&quot;&gt;#16466&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;process&quot;&gt;Process&lt;/h3&gt;
  &lt;a href=&quot;#process&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Process&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;A long refactor of spawning sub-processes has started. It encompasses a tedious
cleanup and safety fixes related to finding the command as well as building the
arguments and environment variables, to eventually move on from the classic
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fork&lt;/code&gt; then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exec&lt;/code&gt; to the more modern &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;posix_spawn&lt;/code&gt; on UNIX targets.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.run&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.exec&lt;/code&gt; now look up the target executable in the
environment of the parent process (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ENV[&quot;PATH&quot;]&lt;/code&gt;) instead of in the environment of the
child process (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;env[&quot;PATH&quot;]&lt;/code&gt;) on all platforms (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16340&quot;&gt;#16340&lt;/a&gt;).
This is usually the expected and specified behaviour for spawning a new process,
but it only worked correcly on Windows until now.
Consider using a full path (possibly resolved via &lt;a href=&quot;https://crystal-lang.org/api/1.19.1/Process.html#find_executable%28name%3APath%7CString%2Cpath%3AString%7CNil%3DENV%5B%22PATH%22%5D%3F%2Cpwd%3APath%7CString%3DDir.current%29%3AString%7CNil-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.find_executable&lt;/code&gt;&lt;/a&gt;)
if you want to look up the executable in a different path.
With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shell: true&lt;/code&gt;, the target executable is also looked up in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;env[&quot;PATH&quot;]&lt;/code&gt;
because the shell process sits in between.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;argv&lt;/code&gt; before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fork&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16286&quot;&gt;#16286&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16321&quot;&gt;#16321&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Move &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make_envp&lt;/code&gt; before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fork&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16351&quot;&gt;#16351&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execvpe&lt;/code&gt; when available (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16294&quot;&gt;#16294&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16311&quot;&gt;#16311&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dir.cd&lt;/code&gt; with a non-raising alternative in pre-exec (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16352&quot;&gt;#16352&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16369&quot;&gt;#16369&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fix reset directory if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.exec&lt;/code&gt; fails (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16383&quot;&gt;#16383&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Disable process cancellation during &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fork&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16446&quot;&gt;#16446&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;standard-library&quot;&gt;Standard library&lt;/h3&gt;
  &lt;a href=&quot;#standard-library&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Standard library&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;New methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/NamedTuple.html#reverse_merge(other:NamedTuple)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NamedTuple#reverse_merge&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16229&quot;&gt;#16229&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Set.html#map!(&amp;amp;:T-%3ET):self-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Set#map!&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16271&quot;&gt;#16271&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Hash.html#transform_keys!(&amp;amp;:K,V-%3EK):self-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Hash#transform_keys!&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16280&quot;&gt;#16280&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/OpenSSL/SSL/Context/Server.html#on_server_name(&amp;amp;block:String-%3EOpenSSL::SSL::Context::Server|Nil)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OpenSSL::SSL::Context::Server#on_server_name&lt;/code&gt;&lt;/a&gt; for SNI (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16452&quot;&gt;#16452&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16525&quot;&gt;#16525&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/IPSocket.html#ipv6_only?:Bool-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IPSocket#ipv6_only&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16347&quot;&gt;#16347&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Int32.html#from_digits(digits:Enumerable(Int),base:Int=10):self-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Int.from_digits&lt;/code&gt;&lt;/a&gt; as inverse of &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Int.html#digits(base=10):Array(Int32)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Int#digits&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16237&quot;&gt;#16237&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/BigInt.html#from_digits(digits:Enumerable(Int),base:Int=10):self-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BigInt.from_digits&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16259&quot;&gt;#16259&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Int.html#tdivmod(other:Int)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Int#tdivmod&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16258&quot;&gt;#16258&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Random.html#next_bool%3ABool-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Random.next_bool&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Random.html#next_int%3AInt32-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Random.next_int&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16297&quot;&gt;#16297&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Random.html#split%3Aself-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Random#split&lt;/code&gt;&lt;/a&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Random.split&lt;/code&gt; for splittable PRNGs (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16342&quot;&gt;#16342&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16495&quot;&gt;#16495&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Pointer.html#fill(count:Int,value:T):self-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pointer#fill&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16338&quot;&gt;#16338&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Process.html#debugger_present?:Bool-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process.debugger_present?&lt;/code&gt;&lt;/a&gt; for Windows and Linux (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16248&quot;&gt;#16248&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Path.html#relative?:Bool-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Path#relative?&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16473&quot;&gt;#16473&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/YAML/Nodes.html#parse_all(string_or_io:String|IO):Array(Document)-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML::Nodes.parse_all&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16247&quot;&gt;#16247&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;a href=&quot;https://crystal-lang.org/api/1.19.0/toplevel.html#exit(status:Int32|Process::Status=0):NoReturn-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;::exit(Process::Status)&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16436&quot;&gt;#16436&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enhancements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Support large JSON files (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16211&quot;&gt;#16211&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Support deserialization of YAML anchors of value types (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16186&quot;&gt;#16186&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add end locations to scalars and aliases in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML::Nodes.parse&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16187&quot;&gt;#16187&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JSON::SerializableError#attribute&lt;/code&gt; when appropriate (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16158&quot;&gt;#16158&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remove_empty&lt;/code&gt; parameter to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String#each_line&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16232&quot;&gt;#16232&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;weeks&lt;/code&gt; parameter to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Span.new&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16208&quot;&gt;#16208&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Support 0X, 0O, 0B prefixes in string to integer conversion (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16226&quot;&gt;#16226&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/andrykonchin&quot;&gt;@andrykonchin&lt;/a&gt;, &lt;a href=&quot;https://github.com/carlhoerberg&quot;&gt;@carlhoerberg&lt;/a&gt;, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;, &lt;a href=&quot;https://github.com/RX14&quot;&gt;@RX14&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sija&quot;&gt;@Sija&lt;/a&gt;, &lt;a href=&quot;https://github.com/spuun&quot;&gt;@spuun&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The memory management model for libxml2 changed in Crystal 1.17 to become manual
instead of integrating the GC. The change introduced some memory leaks that have
now been fixed.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Memory leak in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML.parse&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML.parse_html&lt;/code&gt; methods (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16414&quot;&gt;#16414&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Memory leak in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML::Document#finalize&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16418&quot;&gt;#16418&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Memory leak in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML::Node#content=&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16419&quot;&gt;#16419&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fix use after unlink in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML::Node&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16432&quot;&gt;#16432&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/toddsundsted&quot;&gt;@toddsundsted&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;macros&quot;&gt;Macros&lt;/h3&gt;
  &lt;a href=&quot;#macros&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Macros&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;New methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Crystal/Macros/StringLiteral.html#gsub%28regex%3ARegexLiteral%2C%26%3AStringLiteral%2CArrayLiteral%28StringLiteral%7CNilLiteral%29-%3E_%29%3AStringLiteral-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral#gsub(&amp;amp;)&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16376&quot;&gt;#16376&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Crystal/Macros/StringLiteral.html#split%28node%3ARegexLiteral%29%3AArrayLiteral%28StringLiteral%29-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral#split(RegexLiteral)&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16378&quot;&gt;#16378&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.19.0/Crystal/Macros/StringLiteral.html#match%28regex%3ARegexLiteral%29%3AHashLiteral%28NumberLiteral%7CStringLiteral%2CStringLiteral%7CNilLiteral%29-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral#match&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16464&quot;&gt;#16464&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/Blacksmoke16&quot;&gt;@Blacksmoke16&lt;/a&gt;, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;All overloads of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ArrayLiteral#[]&lt;/code&gt; return &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nil&lt;/code&gt; on out of bounds (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16453&quot;&gt;#16453&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;compiler&quot;&gt;Compiler&lt;/h3&gt;
  &lt;a href=&quot;#compiler&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Compiler&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The compiler is now always built with execution contexts, and the LLVM codegen
is now always multithreaded for every target, including Windows. We can finally
wave goodbye to fork, and Windows should see a performance boost.&lt;/p&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add optional sanitizer to docs generator (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/14646&quot;&gt;#14646&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16251&quot;&gt;#16251&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks [@nobodywasishere], &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;infra&quot;&gt;Infra&lt;/h3&gt;
  &lt;a href=&quot;#infra&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Infra&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;We finally build Linux ARM64 binaries of Crystal releases and nightlies.
Tarballs are ready to download from &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.2&quot;&gt;github releases&lt;/a&gt;, &lt;a href=&quot;https://hub.docker.com/r/crystallang/crystal&quot;&gt;docker images&lt;/a&gt;,
&lt;a href=&quot;https://snapcraft.io/crystal&quot;&gt;snapcraft&lt;/a&gt; or the &lt;a href=&quot;https://github.com/crystal-lang/install-crystal&quot;&gt;install-crystal&lt;/a&gt; github action.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Build linux aarch64 tarballs (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16330&quot;&gt;#16330&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Build snap arm64 target (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16491&quot;&gt;#16491&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Enable multiarch docker builds (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16493&quot;&gt;#16493&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Encourage +1 reactions on issues and PRs for prioritization (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16241&quot;&gt;#16241&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;dependencies&quot;&gt;Dependencies&lt;/h3&gt;
  &lt;a href=&quot;#dependencies&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Dependencies&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The OpenSSL bindings now require OpenSSL 1.1.1+ or LibreSSL 3+. We expect the
change to not have any effect since these versions are no longer distributed by
any supported operating system.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h3&gt;
  &lt;a href=&quot;#deprecations&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Deprecations&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Deprecate single-letter macro fresh variables with indices (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16267&quot;&gt;#16267&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Deprecate macro fresh variables with constant names (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16293&quot;&gt;#16293&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Deprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral#split(ASTNode)&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16439&quot;&gt;#16439&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Deprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.monotonic&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16545&quot;&gt;#16545&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Deprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time#inspect(io, *, with_nanoseconds)&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16416&quot;&gt;#16416&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of
 &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.  To
 maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.18.2 is released!</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author><link href="https://crystal-lang.org/2025/10/21/1.18.2-released/" rel="alternate" type="text/html" title="Crystal 1.18.2 is released!" />
      <published>2025-10-21T00:00:00+00:00</published>
      <updated>2025-10-21T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/10/21/1.18.2-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/10/21/1.18.2-released/">&lt;p&gt;We are announcing a new Crystal release 1.18.2 with two regressions fixed.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;/2025/10/14/1.18.0-released/&quot;&gt;the release notes of 1.18.0&lt;/a&gt; for all the changes introduced in Crystal 1.18.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.2&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.18.2&quot;&gt;3 changes since
1.18.1&lt;/a&gt;
by 3 contributors.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This patch release fixes a regression in the type restrictions of
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO#read_bytes&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16231&quot;&gt;#16231&lt;/a&gt;), and a bug in
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext.default_workers_count&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16227&quot;&gt;#16227&lt;/a&gt;) - both errors were
introduced in 1.18.0.&lt;/p&gt;

&lt;p&gt;For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.2&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of
 &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.  To
 maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.18.1 is released!</title>
      <author>
        <name>Matias Garcia Isaia</name>
        <uri>https://github.com/mgarcia/</uri>
      </author><link href="https://crystal-lang.org/2025/10/17/1.18.1-released/" rel="alternate" type="text/html" title="Crystal 1.18.1 is released!" />
      <published>2025-10-17T00:00:00+00:00</published>
      <updated>2025-10-17T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/10/17/1.18.1-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/10/17/1.18.1-released/">&lt;p&gt;We are announcing a new Crystal release 1.18.1 with two regressions fixed.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;/2025/10/14/1.18.0-released/&quot;&gt;the release notes of 1.18.0&lt;/a&gt; for all the changes introduced in Crystal 1.18.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.1&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.18.1&quot;&gt;2 changes since
1.18.0&lt;/a&gt;
by 1 contributor.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This patch release fixes a regression in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enum&lt;/code&gt; def parsing (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16217&quot;&gt;#16217&lt;/a&gt;), and
overly strict type restrictions in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::WebSocket&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/16218&quot;&gt;#16218&lt;/a&gt;) - both introduced
in 1.18.0.&lt;/p&gt;

&lt;p&gt;For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.1&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of
 &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.  To
 maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.18.0 is released!</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author><link href="https://crystal-lang.org/2025/10/14/1.18.0-released/" rel="alternate" type="text/html" title="Crystal 1.18.0 is released!" />
      <published>2025-10-14T00:00:00+00:00</published>
      <updated>2025-10-14T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/10/14/1.18.0-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/10/14/1.18.0-released/">&lt;p&gt;We are announcing a new Crystal release 1.18.0 with several new features and bug
fixes.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.0&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.18.0&quot;&gt;172 changes since
1.17.1&lt;/a&gt;
by 31 contributors. We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Below we list the most remarkable changes in the language, compiler and stdlib.
For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.18.0&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We do not expect any breaking changes in existing code. If you notice any
unexpected issues, please let us know in the &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues&quot;&gt;issue tracker&lt;/a&gt; or &lt;a href=&quot;https://forum.crystal-lang.org/&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;execution-contexts&quot;&gt;Execution contexts&lt;/h3&gt;
  &lt;a href=&quot;#execution-contexts&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Execution contexts&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Execution contexts from &lt;a href=&quot;https://github.com/crystal-lang/rfcs/pull/2&quot;&gt;RFC 0002&lt;/a&gt; continue as a preview feature with opt-in
with compiler flags &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dpreview_mt -Dexecution_context&lt;/code&gt;. It might move out of
preview in the next release.&lt;/p&gt;

&lt;p&gt;The default execution context is now parallel, but with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;maximum: 1&lt;/code&gt;
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16136&quot;&gt;#16136&lt;/a&gt;).
So it starts with a single thread, but it can grow to more with
&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Fiber/ExecutionContext/Parallel.html#resize(maximum:Int32):Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Parallel#resize&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15956&quot;&gt;#15956&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;There are also a number of performance improvements for schedulers and event
loops (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15961&quot;&gt;#15961&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16063&quot;&gt;#16063&lt;/a&gt;) and we dropped the custom implementation of
&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Fiber/ExecutionContext/Concurrent.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Concurrent&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16135&quot;&gt;#16135&lt;/a&gt;). It’s now based on the parallel
implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Fiber/ExecutionContext.html#default_workers_count:Int32-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext.default_workers_count&lt;/code&gt;&lt;/a&gt; has been improved (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16149&quot;&gt;#16149&lt;/a&gt;) to
respect the effective CPU count available to the process (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16148&quot;&gt;#16148&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The preview of synchronization primitives in &lt;a href=&quot;https://github.com/ysbaddaden/sync/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ysbaddaden/sync&lt;/code&gt;&lt;/a&gt; has seen some
improvements as well.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This effort is part of the &lt;a href=&quot;/2024/02/09/84codes-manas-mt/&quot;&gt;ongoing project to improve multi-threading support&lt;/a&gt;
with the help of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;deprecation-warnings&quot;&gt;Deprecation warnings&lt;/h3&gt;
  &lt;a href=&quot;#deprecation-warnings&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Deprecation warnings&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Deprecation warnings are now available on types and aliases (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15962&quot;&gt;#15962&lt;/a&gt;) as well
as individual method parameters (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15999&quot;&gt;#15999&lt;/a&gt;).
Deprecated types only trigger warnings when they are actually &lt;em&gt;used&lt;/em&gt; (e.g.
calling a class method), not when they’re just part of a type restriction, for
example.
Deprecated parameters only trigger a warning when the particular parameter is
used in a call. Calls without this parameter are unaffected.&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@[Deprecated(&quot;Here may be dragons&quot;)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Foo&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@[Deprecated(&quot;Do not try this at home&quot;)]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;baz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;time&quot;&gt;Time&lt;/h3&gt;
  &lt;a href=&quot;#time&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Time&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;timeinspect&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time#inspect&lt;/code&gt;&lt;/h4&gt;
  &lt;a href=&quot;#timeinspect&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time#inspect&lt;/code&gt;&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The format of &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Time.html#inspect(io:IO,with_nanoseconds=true):Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time#inspect&lt;/code&gt;&lt;/a&gt; has been adjusted slightly to align with the Internet
Extended Date/Time Format (IXDTF) defined in &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9557&quot;&gt;RFC 9557&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16039&quot;&gt;#16039&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Changes from the previous format:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UTC&lt;/code&gt; location by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Z&lt;/code&gt; offset&lt;/li&gt;
  &lt;li&gt;Skip zero nanoseconds entirely even when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;with_nanoseconds&lt;/code&gt; is true (see https://github.com/crystal-lang/crystal/pull/16039#discussion_r2250863021)&lt;/li&gt;
  &lt;li&gt;Remove whitespace between time and offset&lt;/li&gt;
  &lt;li&gt;Wrap location in square brackets to indicate an IXDTF time-zone suffix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some examples show the differences:&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;utc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2014&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;nanosecond: &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;123_456_789&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2014&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;nanosecond: &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;123_456_789&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;location: &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Europe/Berlin&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2014&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;nanosecond: &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;123_456_789&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;location: &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fixed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Crystal 1.17:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;2014-01-02 03:04:05.123456789 UTC&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;2014-01-02 03:04:05.123456789 +01:00 Europe/Berlin&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;-2014-01-02 03:04:05.123456789 +01:00&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Crystal 1.18:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;2014-01-02 03:04:05.123456789Z&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;2014-01-02 03:04:05.123456789+01:00[Europe/Berlin]&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;+2014-01-02 03:04:05.123456789+01:00&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;timelocation&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Location&lt;/code&gt;&lt;/h3&gt;
  &lt;a href=&quot;#timelocation&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Location&lt;/code&gt;&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Time.html#local(year:Int32,month:Int32,day:Int32,hour:Int32=0,minute:Int32=0,second:Int32=0,*,nanosecond:Int32=0,location:Location=Location.local):Time-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Location.local&lt;/code&gt;&lt;/a&gt; now follows symlink names, so that it resolves to the same
timezone by name as &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Time/Location.html#load(name:String):Location-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Location.load&lt;/code&gt;&lt;/a&gt;, even if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/localtime&lt;/code&gt; points to a
zoneinfo database (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16002&quot;&gt;#16002&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16022&quot;&gt;#16022&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Time/Location.html#load?(name:String):Location%7CNil-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Location.load?&lt;/code&gt;&lt;/a&gt; is a new, non-raising variant to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.load&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16121&quot;&gt;#16121&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The local Windows system time zone now uses the canonical IANA name (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15967&quot;&gt;#15967&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;serialization&quot;&gt;Serialization&lt;/h3&gt;
  &lt;a href=&quot;#serialization&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Serialization&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/YAML/Any.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML::Any&lt;/code&gt;&lt;/a&gt; now resolves YAML aliases (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15941&quot;&gt;#15941&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/willhbr&quot;&gt;@willhbr&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The output of &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/JSON/Any.html#inspect(io:IO):Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JSON::Any#inspect&lt;/code&gt;&lt;/a&gt; got a wrapper to indicate
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Any&lt;/code&gt; type and differentiate from the wrapped type (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15979&quot;&gt;#15979&lt;/a&gt;).
The equivalent for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML::Any&lt;/code&gt; is still pending.&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;json&quot;&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Any&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inspect&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;JSON::Any(1)&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/jneen&quot;&gt;@jneen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Time/Location.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time::Location&lt;/code&gt;&lt;/a&gt; can now be used as a JSON object key (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15957&quot;&gt;#15957&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/Sija&quot;&gt;@Sija&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The private constructors of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*::Serializable&lt;/code&gt; moved into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;macro included&lt;/code&gt;
hook (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16147&quot;&gt;#16147&lt;/a&gt;). They’re now defined on the including types which is more robust
in terms of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#initialize&lt;/code&gt; overload ordering. This also allows referring generic
type variables inside converters.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;standard-library&quot;&gt;Standard library&lt;/h3&gt;
  &lt;a href=&quot;#standard-library&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Standard library&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;New methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Set.html#select%21%28%26%3AT-%3E%29%3Aself-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Set#select!&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Set.html#reject!(&amp;amp;:T-%3E):self-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#reject!&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16060&quot;&gt;#16060&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/File.html#readlink?(path:Path%7CString):String%7CNil-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;File.readlink?&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16004&quot;&gt;#16004&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/SemanticVersion.html#valid?(str:String):Bool-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SemanticVersion.valid?&lt;/code&gt;&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/SemanticVersion.html#parse%3F%28str%3AString%29%3Aself%7CNil-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SemanticVersion.parse?&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15051&quot;&gt;#15051&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Socket.html#set_blocking(fd:Handle,value:Bool)-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Socket.set_blocking&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Socket.html#set_blocking(fd:Handle,value:Bool)-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO::FileDescriptor#set_blocking&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16033&quot;&gt;#16033&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16129&quot;&gt;#16129&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/OptionParser.html#summary_width:Int32-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OptionParser#summary_width&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/OptionParser.html#summary_indent:String-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OptionParser#summary_indent&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15326&quot;&gt;#15326&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;, &lt;a href=&quot;https://github.com/devnote-dev&quot;&gt;@devnote-dev&lt;/a&gt;, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;, &lt;a href=&quot;https://github.com/kojix2&quot;&gt;@kojix2&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Colorize.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize&lt;/code&gt;&lt;/a&gt; now uses scoped ANSI reset codes which only reset the respective
property, instead of resetting &lt;em&gt;everything&lt;/em&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16052&quot;&gt;#16052&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/Blacksmoke16&quot;&gt;@Blacksmoke16&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;networking&quot;&gt;Networking&lt;/h3&gt;
  &lt;a href=&quot;#networking&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Networking&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/HTTP/StaticFileHandler.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFileHandler&lt;/code&gt;&lt;/a&gt; preserves query params in redirects (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15789&quot;&gt;#15789&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/syeopite&quot;&gt;@syeopite&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/HTTP/StaticFileHandler.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFileHandler&lt;/code&gt;&lt;/a&gt; returns 404 on file error (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16025&quot;&gt;#16025&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16077&quot;&gt;#16077&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP::Client&lt;/code&gt; runs the &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/HTTP/Client.html#before_request%28%26callback%3AHTTP%3A%3ARequest-%3E%29%3ANil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#before_request&lt;/code&gt;&lt;/a&gt; callback only once, even if a
request is retried (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16064&quot;&gt;#16064&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/URI.html#host=(host:String%7CNil)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;URI#host=&lt;/code&gt;&lt;/a&gt; wraps IPv6 addresses in brackets (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16164&quot;&gt;#16164&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/stakach&quot;&gt;@stakach&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;type-restrictions&quot;&gt;Type restrictions&lt;/h3&gt;
  &lt;a href=&quot;#type-restrictions&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Type restrictions&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;We added type restrictions to many API methods. This improves the documentation.
This is a semi-automatic effort, assisted by a tool that automatically extracts
typing information from the semantic analysis of a program (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15682&quot;&gt;#15682&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/MIME.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIME&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15834&quot;&gt;#15834&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Log.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Log&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15777&quot;&gt;#15777&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/OAuth.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OAuth&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15687&quot;&gt;#15687&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/JSON.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JSON&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15840&quot;&gt;#15840&lt;/a&gt;,
&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16142&quot;&gt;#16142&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Benchmark.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Benchmark&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15688&quot;&gt;#15688&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crypto.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Crypto&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15694&quot;&gt;#15694&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/IO.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15698&quot;&gt;#15698&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/HTTP.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTP&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15710&quot;&gt;#15710&lt;/a&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Big*&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15689&quot;&gt;#15689&lt;/a&gt;), &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Process.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16031&quot;&gt;#16031&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/Vici37&quot;&gt;@Vici37&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;code-cleanup&quot;&gt;Code Cleanup&lt;/h3&gt;
  &lt;a href=&quot;#code-cleanup&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Code Cleanup&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Multi-line strings containing source code in compiler specs have had two
different formats: Some of them were using regular string literals, others used
heredocs. The latter was usually preferred in new code additions because
line numbers and indents are more sensible. And with an appropriate heredoc
identifier to denote the language, we even get nested syntax highlighting.
In this release we’ve converted all compiler specs to use heredocs
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/11291&quot;&gt;#11291&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With the help of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ameba&lt;/code&gt;, we’ve enabled and applied a couple more linter rules:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Style/UnlessElse&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16010&quot;&gt;#16010&lt;/a&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Style/RedundantBegin&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16011&quot;&gt;#16011&lt;/a&gt;), and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Lint/UselessAssign&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16014&quot;&gt;#16014&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;macros&quot;&gt;Macros&lt;/h3&gt;
  &lt;a href=&quot;#macros&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Macros&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;New methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crystal/Macros/ArrayLiteral.html#*(other:NumberLiteral):ArrayLiteral-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ArrayLiteral#*&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crystal/Macros/TupleLiteral.html#*(other:NumberLiteral):TupleLiteral-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TupleLiteral#*&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crystal/Macros/StringLiteral.html#*(other:NumberLiteral):StringLiteral-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringLiteral#*&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16154&quot;&gt;#16154&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crystal/Macros/NumberLiteral.html#zero%3F%3ABoolLiteral-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NumberLiteral#zero?&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/10248&quot;&gt;#10248&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/jneen&quot;&gt;@jneen&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sija&quot;&gt;@Sija&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Empty &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crystal/Macros/NamedTupleLiteral.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NamedTupleLiteral&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Crystal/Macros/TupleLiteral.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TupleLiteral&lt;/code&gt;&lt;/a&gt; expand to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NamedTuple.new&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Tuple.new&lt;/code&gt;, instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{}&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16108&quot;&gt;#16108&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/spuun&quot;&gt;@spuun&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;compiler&quot;&gt;Compiler&lt;/h3&gt;
  &lt;a href=&quot;#compiler&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Compiler&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The compiler can dump type information to a JSON file when the environment
variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CRYSTAL_DUMP_TYPE_INFO&lt;/code&gt; is set (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16027&quot;&gt;#16027&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Resolve types when guessing return type from class method overloads (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16118&quot;&gt;#16118&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;In the following snippet, the compiler is able to infer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@foo&lt;/code&gt;’s type to be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Foo&lt;/code&gt;, since both overloads of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Foo.foo&lt;/code&gt; have a return type of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Foo&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-crystal highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Foo&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Int32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Foo&lt;/span&gt;
    &lt;span class=&quot;kp&quot;&gt;new&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Foo&lt;/span&gt;
    &lt;span class=&quot;kp&quot;&gt;new&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Bar&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;Bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Guess instance variable types from global method calls (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16119&quot;&gt;#16119&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This allows the following to compile:&lt;/p&gt;

&lt;div class=&quot;language-crystal highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Int32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Float64&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Bar&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# okay, `@foo` has the type `Float64`&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The call needs to be global; other than that, type guessing for top-level methods has the same limitations as for class methods.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hash literals are evaluated from left to right, fixing a regression from 1.6.0 (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16124&quot;&gt;#16124&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Temporary variables are now grouped by file name in order to increase the chance
of reusing previous macro expansions (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16122&quot;&gt;#16122&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;interpreter&quot;&gt;Interpreter&lt;/h3&gt;
  &lt;a href=&quot;#interpreter&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Interpreter&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Fully exit the process on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exit!&lt;/code&gt; from REPL (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16171&quot;&gt;#16171&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fixed interpreter hanging on the signal pipe (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16167&quot;&gt;#16167&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/jneen&quot;&gt;@jneen&lt;/a&gt;, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;infra&quot;&gt;Infra&lt;/h3&gt;
  &lt;a href=&quot;#infra&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Infra&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REUSE.toml&lt;/code&gt; describes which licenses apply to which parts of the code base,
following the &lt;a href=&quot;https://reuse.software/&quot;&gt;Reuse Software Specification&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15992&quot;&gt;#15992&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Default to LLVM 16 in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shell.nix&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16023&quot;&gt;#16023&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;dependencies&quot;&gt;Dependencies&lt;/h3&gt;
  &lt;a href=&quot;#dependencies&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Dependencies&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Support for LLVM 21.1 and 22.0 (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16062&quot;&gt;#16062&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Update Unicode to 17.0.0 (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16160&quot;&gt;#16160&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h3&gt;
  &lt;a href=&quot;#deprecations&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Deprecations&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Socket.html#blocking-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Socket#blocking&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/IO/FileDescriptor.html#blocking:Bool-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO::FileDescriptor#blocking&lt;/code&gt;&lt;/a&gt; properties (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16033&quot;&gt;#16033&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16129&quot;&gt;#16129&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Atomic/Flag.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Atomic::Flag&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15805&quot;&gt;#15805&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blocking&lt;/code&gt; parameter of &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/File.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;File.new&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Socket.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Socket.new&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.18.0/IO/FileDescriptor.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO::FileDescriptor.new&lt;/code&gt;&lt;/a&gt; constructors (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16034&quot;&gt;#16034&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16047&quot;&gt;#16047&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Float::Printer::IEEE&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16050&quot;&gt;#16050&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.18.0/Process/Status.html#exit_signal:Signal-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Process::Status#exit_signal&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/16003&quot;&gt;#16003&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;, &lt;a href=&quot;https://github.com/Blacksmoke16&quot;&gt;@Blacksmoke16&lt;/a&gt;, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of
 &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.  To
 maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.17.1 is released!</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author><link href="https://crystal-lang.org/2025/07/22/1.17.0-released/" rel="alternate" type="text/html" title="Crystal 1.17.1 is released!" />
      <published>2025-07-22T00:00:00+00:00</published>
      <updated>2025-07-22T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/07/22/1.17.0-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/07/22/1.17.0-released/">&lt;p&gt;We are announcing a new Crystal release 1.17.1 with a regression bug fix.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.17.1&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.17.1&quot;&gt;2 changes since
1.17.0&lt;/a&gt;
by 2 contributors.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This patch release only fixes a regression in the doc generator introduced in
1.17.0, which would insert links to out-of-tree files (&lt;a href=&quot;https://github.com/crystal-lang/crystal/pull/15996&quot;&gt;#15996&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.17.1&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;We have been able to do all of this thanks to the continued
&lt;/div&gt;
&lt;p&gt;support of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other
 &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;. To maintain and increase the development pace, donations
 and sponsorships are essential.
 &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is available for
 that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.17.0 is released!</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author><link href="https://crystal-lang.org/2025/07/16/1.17.0-released/" rel="alternate" type="text/html" title="Crystal 1.17.0 is released!" />
      <published>2025-07-16T00:00:00+00:00</published>
      <updated>2025-07-16T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/07/16/1.17.0-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/07/16/1.17.0-released/">&lt;p&gt;We are announcing a new Crystal release 1.17.0 with several new features and bug
fixes.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.17.0&quot;&gt;GitHub
Releases&lt;/a&gt; and our
official distribution channels. See
&lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for installation
instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.17.0&quot;&gt;187 changes since
1.16.3&lt;/a&gt;
by 19 contributors.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Below we list the most remarkable changes in the language, compiler and stdlib.
For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.17.0&quot;&gt;full
changelog&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;breaking&quot;&gt;Breaking&lt;/h3&gt;
  &lt;a href=&quot;#breaking&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Breaking&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The following changes break prior behavior of the compiler, but we expect them
to not break much in existing code. If you notice any unexpected issues, please
let us know in the &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues&quot;&gt;issue tracker&lt;/a&gt; or &lt;a href=&quot;https://forum.crystal-lang.org/&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;colorize-only-on-tty-by-default&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize&lt;/code&gt; only on TTY by default&lt;/h4&gt;
  &lt;a href=&quot;#colorize-only-on-tty-by-default&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize&lt;/code&gt; only on TTY by default&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Colorize.html#on_tty_only!:Bool-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize.on_tty_only!&lt;/code&gt;&lt;/a&gt; is now the default behavior. It seems sensible to have
colorization only enabled implicitly when writing to a TTY the supports colors
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15881&quot;&gt;#15881&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Previously, it would always be enabled unless the
&lt;a href=&quot;https://no-color.org/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NO_COLOR&lt;/code&gt;&lt;/a&gt; environment variable was set. Now the default
honors this variable, checks the standard streams are TTYs and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TERM&lt;/code&gt; is not
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dumb&lt;/code&gt;, just as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize.on_tty_only!&lt;/code&gt; did already.
The old behaviour is available by setting &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Colorize.html#enabled%3D%28enabled%3ABool%29-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize.enabled=&lt;/code&gt;&lt;/a&gt; explicitly:&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;no&quot;&gt;Colorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;enabled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;NO_COLOR&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;empty?&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize.on_tty_only!&lt;/code&gt; is no longer necessary, unless you want to
explicitly reset after the default is overridden.&lt;/p&gt;

&lt;p&gt;The new method &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Colorize.html#default_enabled%3F%28stdout%3AIO%2Cstderr%3AIO%3Dstdout%29%3ABool-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Colorize.default_enabled?&lt;/code&gt;&lt;/a&gt; exposes the default logic for
arbitrary IOs (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15912&quot;&gt;#15912&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;colorize&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Prints &quot;world&quot; in color in a shell, but not when piped to a file:&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;world&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;colorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# This resets to the behaviour before Crystal 1.17&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;Colorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;enabled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;NO_COLOR&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;empty?&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Now always prints &quot;word&quot; in color unless `NO_COLOR` is specified, even when piped to a file:&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;world&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;colorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;manual-memory-management-for-libxml2&quot;&gt;Manual memory management for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt;&lt;/h4&gt;
  &lt;a href=&quot;#manual-memory-management-for-libxml2&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Manual memory management for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt;&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; bindings are switching to use manual memory management (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15906&quot;&gt;#15906&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;There are no breaking changes in the exposed stdlib API and we do not expect any
issues if you’re only using that.
However, custom extensions that use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; directly in conjunction with
stdlib API nodes may break in some specific use cases.
When linking a node into a document, it’s necessary to update the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Node#document&lt;/code&gt; reference accordingly.&lt;/p&gt;

&lt;p&gt;The API methods that expose internal details of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; are considered unsafe
and we’re soft-deprecating them. They’re not documented anymore, but still
continue to work.&lt;/p&gt;

&lt;p&gt;We’re planning to expose more features for DOM manipulation in the stdlib API,
so nobody has to extend the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt; integration themselves. As a first step,
we’re introducing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML::Document&lt;/code&gt; as a subclass of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML::Node&lt;/code&gt; for document
nodes. This is not expected to break anything.
Follow the progress in &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15915&quot;&gt;#15915&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We used to plug the garbage collector as memory allocator for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libxml2&lt;/code&gt;.
This worked well so far, but with the newest release libxml 2.14 it causes segfaults when using
multi-threading and a GC cycle happens while executing a libxml function.
In addition, the libxml2 distributed in macOS 15.4 is patched to remove the
custom memory allocators API entirely, so support for it was broken. With this change, it is now properly supported.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;blocking-behaviour-of-file-descriptors&quot;&gt;Blocking behaviour of file descriptors&lt;/h4&gt;
  &lt;a href=&quot;#blocking-behaviour-of-file-descriptors&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Blocking behaviour of file descriptors&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blocking&lt;/code&gt; parameter used in &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Socket.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Socket&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/File.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;File&lt;/code&gt;&lt;/a&gt; constructors,
&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/IO.html#pipe(read_blocking=nil,write_blocking=nil):Tuple(IO::FileDescriptor,IO::FileDescriptor)-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO.pipe&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/IO/Stapled.html#pipe(read_blocking:Bool=false,write_blocking:Bool=false,&amp;amp;)-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO::Stapled.pipe&lt;/code&gt;&lt;/a&gt; changes from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nil&lt;/code&gt; by default.
Each event loop now decides to set the mode to blocking or not (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15804&quot;&gt;#15804&lt;/a&gt;,
&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15930&quot;&gt;#15930&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15823&quot;&gt;#15823&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15925&quot;&gt;#15925&lt;/a&gt;).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On UNIX systems, there is no immediate effect: the existing event loops
(libevent, epoll and kqueue) keep using non-blocking mode.&lt;/li&gt;
  &lt;li&gt;On Windows, we don’t set the file descriptor to non-blocking anymore. There
really is no need for that with overlapped IO. Instead, file IO is now fully
async with overlapped IO.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Future event loops (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;io_uring&lt;/code&gt;) may default to blocking mode.&lt;/p&gt;

&lt;p&gt;Also, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blocking&lt;/code&gt; parameter is deprecated. It’s not necessary to configure
in the constructor (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15924&quot;&gt;#15924&lt;/a&gt;). It’s still possible to change the mode after
creation with &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Socket.html#blocking=(value)-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#blocking=&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;systemerrorfrom_errno&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SystemError.from_errno&lt;/code&gt;&lt;/h4&gt;
  &lt;a href=&quot;#systemerrorfrom_errno&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SystemError.from_errno&lt;/code&gt;&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The helper method &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/IO/Error.html#from_errno(message,**opts)-macro&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SystemError.from_errno&lt;/code&gt;&lt;/a&gt; is now a macro. This ensures it
promptly reads &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Errno.html#value%3Aself-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Errno.value&lt;/code&gt;&lt;/a&gt; from the previous lib call, without contamination
from evaluating other arguments. The macro keeps the same signature as the class
method, so we expect no friction (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15874&quot;&gt;#15874&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;execution-contexts-and-multi-threading&quot;&gt;Execution Contexts and Multi-Threading&lt;/h3&gt;
  &lt;a href=&quot;#execution-contexts-and-multi-threading&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Execution Contexts and Multi-Threading&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Execution contexts from &lt;a href=&quot;https://github.com/crystal-lang/rfcs/pull/2&quot;&gt;RFC 0002&lt;/a&gt; are still a preview feature, but getting more
and more into shape.&lt;/p&gt;

&lt;p&gt;In light of upcoming changes to the relation between schedulers and threads, we
want to make it clear that execution contexts are more about the intent (“how
fibers run”) and threads are only a technical means for achieving parallelism.
As a result, we’re renaming the execution context implementations (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15936&quot;&gt;#15936&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/SingleThreaded.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::SingleThreaded&lt;/code&gt;&lt;/a&gt; to &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/Concurrent.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Concurrent&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/MultiThreaded.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::MultiThreaded&lt;/code&gt;&lt;/a&gt; to &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/Parallel.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Parallel&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Isolated&lt;/code&gt; keeps its name, it does not have a
connection to threads.&lt;/p&gt;

&lt;p&gt;With this release, we’re getting more stability. And there’s progress in related
areas, such as improving multi-threaded support for stdlib libraries like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XML&lt;/code&gt;.
Work has begun on decoupling schedulers from threads which will make
it easy to react to blocking lib calls without blocking other fibers in the
execution context (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15871&quot;&gt;#15871&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Check out &lt;a href=&quot;https://github.com/ysbaddaden/sync/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ysbaddaden/sync&lt;/code&gt;&lt;/a&gt; for a preview of
synchronization primitives to build concurrent-safe and parallel-safe data
structures.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This effort is part of the &lt;a href=&quot;/2024/02/09/84codes-manas-mt/&quot;&gt;ongoing project to improve multi-threading support&lt;/a&gt;
with the help of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;windows-support&quot;&gt;Windows Support&lt;/h3&gt;
  &lt;a href=&quot;#windows-support&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Windows Support&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Windows support is going steady with a number of improvements in this release:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Support for Windows local device paths in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Path&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15590&quot;&gt;#15590&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Support for Windows system time zone transitions in all years (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15891&quot;&gt;#15891&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fixed IANA time zone names for Windows system time zones (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15914&quot;&gt;#15914&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Improved stability (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15820&quot;&gt;#15820&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15850&quot;&gt;#15850&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;language&quot;&gt;Language&lt;/h3&gt;
  &lt;a href=&quot;#language&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Language&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Macro expressions now support further expressions after an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;if&lt;/code&gt; expression: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{%
if ...; end; ... %}&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15917&quot;&gt;#15917&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;standard-library&quot;&gt;Standard library&lt;/h3&gt;
  &lt;a href=&quot;#standard-library&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Standard library&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Experimental support for &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Struct.html#pre_initialize(address:Pointer):Nil-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Struct.pre_initialize&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15896&quot;&gt;#15896&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Enum.html#from_value(value:Int):self-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Enum.from_value&lt;/code&gt;&lt;/a&gt; now raises &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ArgumentError&lt;/code&gt; instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Exception&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15624&quot;&gt;#15624&lt;/a&gt;).
This should not break anything because it’s just a more specialized subclass.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;time-zone-database&quot;&gt;Time zone database&lt;/h4&gt;
  &lt;a href=&quot;#time-zone-database&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Time zone database&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;We improved the parser for TZif database files adding support for version 4
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15825&quot;&gt;#15825&lt;/a&gt;) and parsing POSIX TZ strings (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15863&quot;&gt;#15863&lt;/a&gt;). POSIX TZ environment
variable strings are also supported in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TZ&lt;/code&gt; environment variable (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15792&quot;&gt;#15792&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;scoped-ipv6-addresses&quot;&gt;Scoped IPv6 addresses&lt;/h4&gt;
  &lt;a href=&quot;#scoped-ipv6-addresses&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Scoped IPv6 addresses&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Socket::IPAddress&lt;/code&gt; now has support for IPv6 scoped addresses from &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc4007&quot;&gt;RFC4007&lt;/a&gt;
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15263&quot;&gt;#15263&lt;/a&gt;). &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Socket/IPAddress.html#zone_id:Int32-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Socket::IPAddress#zone_id&lt;/code&gt;&lt;/a&gt; returns the zone number and
&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Socket/IPAddress.html#link_local_interface:String|Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#link_local_interface&lt;/code&gt;&lt;/a&gt; the zone
name.&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;socket&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Socket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;IPAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;fe80::1111%1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; Socket::IPAddress([fe80::1111%1]:0)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;zone_id&lt;/span&gt;              &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; 1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;link_local_interface&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;lo&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/foxxx0&quot;&gt;@foxxx0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;ensuring-string-suffix-and-prefix&quot;&gt;Ensuring string suffix and prefix&lt;/h4&gt;
  &lt;a href=&quot;#ensuring-string-suffix-and-prefix&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Ensuring string suffix and prefix&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;New convenience methods &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/String.html#ensure_suffix%28suffix%3AString%7CChar%29%3Aself-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String#ensure_suffix&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/String.html#ensure_prefix(prefix:String|Char):self-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String#ensure_prefix&lt;/code&gt;&lt;/a&gt;
for adding a specific prefix or suffix but only if not already there (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15782&quot;&gt;#15782&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;s2&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ensure_suffix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;foo/&quot;&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;foo/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ensure_suffix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;foo/&quot;&lt;/span&gt;

&lt;span class=&quot;s2&quot;&gt;&quot;Foo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ensure_prefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;::&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;::Foo&quot;&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;::Foo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ensure_prefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;::&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &quot;::Foo&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/MatheusRich&quot;&gt;@MatheusRich&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;timemonth_week_date&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.month_week_date&lt;/code&gt;&lt;/h4&gt;
  &lt;a href=&quot;#timemonth_week_date&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.month_week_date&lt;/code&gt;&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;New method &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Time.html#month_week_date(year:Int32,month:Int32,week:Int32,day_of_week:Int32|DayOfWeek,hour:Int32=0,minute:Int32=0,second:Int32=0,*,nanosecond:Int32=0,location:Location=Location.local):self-class-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Time.month_week_date&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15620&quot;&gt;#15620&lt;/a&gt;)&lt;/p&gt;

&lt;div class=&quot;language-cr highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;code_section&quot;&gt;&lt;code&gt;&lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;month_week_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;location: &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;UTC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; 2025-07-16 00:00:00.0 UTC&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h4 id=&quot;helper-methods-for-subclasses&quot;&gt;Helper methods for subclasses&lt;/h4&gt;
  &lt;a href=&quot;#helper-methods-for-subclasses&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Helper methods for subclasses&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;We split &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/HTTP/StaticFileHandler.html#call(context):Nil-instance-method&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StaticFileHandler#call&lt;/code&gt;&lt;/a&gt; into structured sub-components, so there are
now a number of helper methods to override individual aspects in custom
subclasses (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15678&quot;&gt;#15678&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Similarly, &lt;a href=&quot;https://crystal-lang.org/api/1.17.0/HTTP/WebSocket.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WebSocket&lt;/code&gt;&lt;/a&gt; now has explicit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#do_ping&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#do_close&lt;/code&gt; helper
methods for easy overriding with custom behaviour (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15545&quot;&gt;#15545&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/luislavena&quot;&gt;@luislavena&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;compiler&quot;&gt;Compiler&lt;/h3&gt;
  &lt;a href=&quot;#compiler&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Compiler&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The new CLI option &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--x86-asm-syntax&lt;/code&gt; configures emitting assembly code in Intel
style (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15612&quot;&gt;#15612&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stringification of several AST nodes has been improved: single line blocks
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15568&quot;&gt;#15568&lt;/a&gt;), multiline named tuple literals (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15566&quot;&gt;#15566&lt;/a&gt;), multiline calls
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15691&quot;&gt;#15691&lt;/a&gt;), significant whitespace before a block body (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15692&quot;&gt;#15692&lt;/a&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MacroIf&lt;/code&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unless&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15919&quot;&gt;#15919&lt;/a&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;elsif&lt;/code&gt; when stringifying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;If&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15918&quot;&gt;#15918&lt;/a&gt;), newline in
trailing expressions (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15614&quot;&gt;#15614&lt;/a&gt;), multiline (boolean) expressions (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15709&quot;&gt;#15709&lt;/a&gt;),
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Not&lt;/code&gt; as call receiver (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15801&quot;&gt;#15801&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/Blacksmoke16&quot;&gt;@Blacksmoke16&lt;/a&gt;, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;compiler-tools&quot;&gt;Compiler tools&lt;/h3&gt;
  &lt;a href=&quot;#compiler-tools&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Compiler tools&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;We have a new compiler tool, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;macro_code_coverage&lt;/code&gt;, which generate a code
coverage report for macros (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15738&quot;&gt;#15738&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/Blacksmoke16&quot;&gt;@Blacksmoke16&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;infrastructure&quot;&gt;Infrastructure&lt;/h3&gt;
  &lt;a href=&quot;#infrastructure&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Infrastructure&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;The Crystal repo has adopted &lt;a href=&quot;https://crystal-ameba.github.io/&quot;&gt;ameba&lt;/a&gt; for static code analysis and linting
(&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15875&quot;&gt;#15875&lt;/a&gt;), as well as and &lt;a href=&quot;https://github.com/crate-ci/typos&quot;&gt;typos&lt;/a&gt; for spell checking (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15873&quot;&gt;#15873&lt;/a&gt;).
With the help of these tools we have been able to improve code quality a lot,
and continue doing so with continuous testing in CI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;dependencies&quot;&gt;Dependencies&lt;/h3&gt;
  &lt;a href=&quot;#dependencies&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Dependencies&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Support for LLVM 21 (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15771&quot;&gt;#15771&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Allow &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LLVM_VERSION&lt;/code&gt; override inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Makefile&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15765&quot;&gt;#15765&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Support for LibXML2 2.14 (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15899&quot;&gt;#15899&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15906&quot;&gt;#15906&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thanks, &lt;a href=&quot;https://github.com/HertzDevil&quot;&gt;@HertzDevil&lt;/a&gt;, &lt;a href=&quot;https://github.com/ysbaddaden&quot;&gt;@ysbaddaden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h3 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h3&gt;
  &lt;a href=&quot;#deprecations&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Deprecations&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/SingleThreaded.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::SingleThreaded&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/MultiThreaded.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::MultiThreaded&lt;/code&gt;&lt;/a&gt; are deprecated and replaced by
&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/Concurrent.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Concurrent&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;https://crystal-lang.org/api/1.17.0/Fiber/ExecutionContext/Parallel.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Parallel&lt;/code&gt;&lt;/a&gt;, respectively. The old names still work
as aliases.
Please note that the compiler currently does not emit deprecation warnings for
aliases. This will be available in 1.18.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;We have been able to do all of this thanks to the continued
&lt;/div&gt;
&lt;p&gt;support of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other
 &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;. To maintain and increase the development pace, donations
 and sponsorships are essential.
 &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is available for
 that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt; if you’d like to
 become a direct sponsor or find other ways to support Crystal. We thank you in
 advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.16.3 is released!</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author><link href="https://crystal-lang.org/2025/05/12/1.16.3-released/" rel="alternate" type="text/html" title="Crystal 1.16.3 is released!" />
      <published>2025-05-12T00:00:00+00:00</published>
      <updated>2025-05-12T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/05/12/1.16.3-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/05/12/1.16.3-released/">&lt;p&gt;We are announcing a new patch release of the Crystal &lt;a href=&quot;/2025/04/09/1.16.0-released/&quot;&gt;1.16 series&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.16.3&quot;&gt;GitHub Releases&lt;/a&gt;
and our official distribution channels.
See &lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for
installation instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.16.3&quot;&gt;4 changes since 1.16.2&lt;/a&gt;
by 3 contributors.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Below we list the most remarkable changes in the language, compiler and stdlib.
For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.16.3&quot;&gt;full changelog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This change brings a couple of bugfixes for regressions introduced in 1.16.0 and 1.16.1.&lt;/p&gt;

&lt;p&gt;The most important fix is a regression from 1.16.0 where we merged type IDs by name which revealed a semantic
bug in typing pointer values (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15751&quot;&gt;#15751&lt;/a&gt;).
We’re also fixing a regression form 1.16.2 which made the compiler incompatible with earlier versions of the standard library (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15762&quot;&gt;#15762&lt;/a&gt;).&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.
 To maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt;
 if you’d like to become a direct sponsor or find other ways to support Crystal.
 We thank you in advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
    <entry>
      <title>Crystal 1.16.2 is released!</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author><link href="https://crystal-lang.org/2025/04/29/1.16.2-released/" rel="alternate" type="text/html" title="Crystal 1.16.2 is released!" />
      <published>2025-04-29T00:00:00+00:00</published>
      <updated>2025-04-29T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/04/29/1.16.2-released</id>
      <content type="html" xml:base="https://crystal-lang.org/2025/04/29/1.16.2-released/">&lt;p&gt;We are announcing a new patch release of the Crystal &lt;a href=&quot;/2025/04/09/1.16.0-released/&quot;&gt;1.16 series&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pre-built packages are available on &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.16.2&quot;&gt;GitHub Releases&lt;/a&gt;
and our official distribution channels.
See &lt;a href=&quot;https://crystal-lang.org/install/&quot;&gt;crystal-lang.org/install&lt;/a&gt; for
installation instructions.&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;
  &lt;a href=&quot;#stats&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Stats&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This release includes &lt;a href=&quot;https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+milestone%3A1.16.2&quot;&gt;10 changes since 1.16.1&lt;/a&gt;
by 3 contributors.  We thank all the contributors for all the effort put into
improving the language! ❤️&lt;/p&gt;

&lt;div class=&quot;header-wrapper&quot;&gt;
  &lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;
  &lt;a href=&quot;#changes&quot;&gt;
    &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/span&gt;
    &lt;span class=&quot;visually-hidden&quot;&gt;Section titled Changes&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Below we list the most remarkable changes in the language, compiler and stdlib.
For more details, visit the &lt;a href=&quot;https://github.com/crystal-lang/crystal/releases/tag/1.16.2&quot;&gt;full changelog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This change brings a couple of bugfixes for regressions introduced in 1.16.0.&lt;/p&gt;

&lt;p&gt;The most important fix is for a performance regression in the compiler which
for some programs would blow up compile time (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15708&quot;&gt;#15708&lt;/a&gt;). This was particularly
observed with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dexecution_context&lt;/code&gt;, but it’s not dependent on that.&lt;/p&gt;

&lt;p&gt;Other bug fixes are specific to execution contexts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber::ExecutionContext::Isolated#wait&lt;/code&gt; now suspends the fiber (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15720&quot;&gt;#15720&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CRYSTAL_LOAD_DEBUG_INFO=1&lt;/code&gt; now works with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Dexecution_context&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15704&quot;&gt;#15704&lt;/a&gt;, &lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15724&quot;&gt;#15724&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other changes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Int#humanize_bytes&lt;/code&gt; shows the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unit_separator&lt;/code&gt; even if the prefix is empty (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15683&quot;&gt;#15683&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;Remove double listing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ReferenceStorage&lt;/code&gt; as a sub type of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Value&lt;/code&gt; (&lt;a href=&quot;https://github.com/crystal-lang/crystal/issues/15706&quot;&gt;#15706&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;div class=&quot;callout callout--thanks&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Thanks
&lt;/div&gt;
&lt;p&gt;We have been able to do all of this thanks to the continued support of &lt;a href=&quot;https://www.84codes.com/&quot;&gt;84codes&lt;/a&gt; and every other &lt;a href=&quot;/sponsors&quot;&gt;sponsor&lt;/a&gt;.
 To maintain and increase the development pace, donations and sponsorships are
 essential.  &lt;a href=&quot;https://opencollective.com/crystal-lang&quot;&gt;OpenCollective&lt;/a&gt; is
 available for that.&lt;/p&gt;

&lt;p&gt;Reach out to &lt;a href=&quot;mailto:crystal@manas.tech&quot;&gt;crystal@manas.tech&lt;/a&gt;
 if you’d like to become a direct sponsor or find other ways to support Crystal.
 We thank you in advance!&lt;/p&gt;


  &lt;a class=&quot;hex&quot; href=&quot;/sponsors#contribute&quot;&gt;Contribute&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
</feed>
