<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>The Crystal Programming Language</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/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://crystal-lang.org/releases/feed.xml" rel="related" type="application/atom+xml" />
  <updated>2026-03-06T11:18:37+00:00</updated>
  <id>https://crystal-lang.org/feed.xml</id>
    <entry>
      <title>Crystal talk at FOSDEM 2026</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author>
      <link href="https://crystal-lang.org/2026/01/23/crystal-talk-fosdem/" rel="alternate" type="text/html" title="Crystal talk at FOSDEM 2026" />
      <published>2026-01-23T00:00:00+00:00</published>
      <updated>2026-01-23T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2026/01/23/crystal-talk-fosdem</id>
      <summary type="html">I’m giving a talk about Crystal at FOSDEM 2026 in Brussels: Crystal: A language for humans and computers. It’s in the Declarative and Minimalistic Computing track, on Sunday, 1 February 2026 at 09:00 in room UB4.136.</summary>
      <content type="html" xml:base="https://crystal-lang.org/2026/01/23/crystal-talk-fosdem/">&lt;p&gt;I’m giving a talk about Crystal at FOSDEM 2026 in Brussels:
&lt;a href=&quot;https://fosdem.org/2026/schedule/event/N3AFSF-crystal/&quot;&gt;&lt;em&gt;Crystal: A language for humans and computers&lt;/em&gt;&lt;/a&gt;.
It’s in the &lt;a href=&quot;https://fosdem.org/2026/schedule/track/declarative-and-minimalistic-computing/&quot;&gt;Declarative and Minimalistic Computing track&lt;/a&gt;,
on Sunday, 1 February 2026 at 09:00 in room UB4.136.&lt;/p&gt;

&lt;p&gt;The talk is going to be an introduction into some concepts of Crystals.
If you are already familiar with the language, I hope it will still be worthwhile.&lt;/p&gt;

&lt;p&gt;If a couple of people are interested in a Crystal meetup, maybe
we can arrange to gather somewhere during FOSDEM. Let me know in the comments.
I’ll bring some Crystal merch.&lt;/p&gt;

&lt;p&gt;Hope to see you in Brussels!&lt;/p&gt;

&lt;p&gt;In case you can’t make it, the talk is being recorded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; The talk recording is now available. Thanks to the video team at FOSDEM!&lt;/p&gt;

&lt;video preload=&quot;none&quot; controls=&quot;controls&quot; width=&quot;75%&quot; style=&quot;aspect-ratio: 16/9;&quot; poster=&quot;/assets/blog/2026/fosdem-talk-screenshot.jpg&quot;&gt;
  &lt;source src=&quot;https://video.fosdem.org/2026/ub4136/N3AFSF-crystal.av1.webm&quot; type=&quot;video/webm; codecs=&amp;quot;av01.0.08M.08.0.110.01.01.01.0&amp;quot;&quot; /&gt;
  &lt;source src=&quot;https://video.fosdem.org/2026/ub4136/N3AFSF-crystal.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&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>
      <summary type="html">We are announcing a new Crystal release 1.19.1 with two regressions fixed.</summary>
      <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>
      <summary type="html">We are announcing a new Crystal release 1.19.0 with several new features and bug fixes.</summary>
      <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>
      <summary type="html">We are announcing a new Crystal release 1.18.2 with two regressions fixed.</summary>
      <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>
      <summary type="html">We are announcing a new Crystal release 1.18.1 with two regressions fixed.</summary>
      <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>
      <summary type="html">We are announcing a new Crystal release 1.18.0 with several new features and bug fixes.</summary>
      <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>Wind of change (or maybe not)</title>
      <author>
        <name>Beta Ziliani</name>
        <uri>https://github.com/beta-ziliani/</uri>
      </author>
      <link href="https://crystal-lang.org/2025/09/29/wind-of-change/" rel="alternate" type="text/html" title="Wind of change (or maybe not)" />
      <published>2025-09-29T00:00:00+00:00</published>
      <updated>2025-09-29T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/09/29/wind-of-change</id>
      <summary type="html">My time at Manas is coming to an end, though I will remain a Core Team member and continue to help develop the project from that seat. Johannes (@straight-shoota) will be taking on the leading role of the project. Please join me in congratulating him on his new position!</summary>
      <content type="html" xml:base="https://crystal-lang.org/2025/09/29/wind-of-change/">&lt;p&gt;My time at Manas is coming to an end, though I will remain a Core Team member and continue to help develop the project from that seat. Johannes (&lt;a href=&quot;https://github.com/straight-shoota&quot;&gt;@straight-shoota&lt;/a&gt;) will be taking on the leading role of the project. Please join me in congratulating him on his new position!&lt;/p&gt;

&lt;p&gt;While this might sound like a big change, in reality it isn’t: over the past year I’ve already been a bit distant from the project due to Manas’ own dynamics. Yet, Johannes and Julien have kept this tight ship on course, with just a bit of extra help. In essence, Johannes has already been a de facto leader.&lt;/p&gt;

&lt;p&gt;As for myself, I will be leading the Theory of Computation group at &lt;a href=&quot;https://www.ort.edu.uy/&quot;&gt;ORT University&lt;/a&gt;, returning to my other passions: teaching and research. Who knows, maybe I will finally get to do some cool research in Crystal!&lt;/p&gt;

&lt;p&gt;This change marks the end of an amazing journey that began four years ago, leading an equally amazing group of people; building this amazing language we all love. I’m deeply grateful to Manas, the Core Team, and the Crystal community at large. The learnings that I gather will accompany me for the rest of my life. You’re wonderful!&lt;/p&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>
      <summary type="html">We are announcing a new Crystal release 1.17.1 with a regression bug fix.</summary>
      <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>
      <summary type="html">We are announcing a new Crystal release 1.17.0 with several new features and bug fixes.</summary>
      <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 Compass</title>
      <author>
        <name>Johannes Müller</name>
        <uri>https://github.com/straight-shoota/</uri>
      </author>
      <link href="https://crystal-lang.org/2025/07/08/crystal-compass/" rel="alternate" type="text/html" title="Crystal Compass" />
      <published>2025-07-08T00:00:00+00:00</published>
      <updated>2025-07-08T00:00:00+00:00</updated>
      <id>https://crystal-lang.org/2025/07/08/crystal-compass</id>
      <summary type="html">Manas.Tech, the company behind Crystal, launches a new service:</summary>
      <content type="html" xml:base="https://crystal-lang.org/2025/07/08/crystal-compass/">&lt;p&gt;&lt;a href=&quot;https://manas.tech/&quot;&gt;Manas.Tech&lt;/a&gt;, the company behind Crystal, launches a new service:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://manas.tech/projects/crystal/crystal-compass/&quot;&gt;&lt;strong&gt;Crystal Compass&lt;/strong&gt;&lt;/a&gt;
is a paid subscription that offers technical support and code reviews from the
creators of the Crystal language.&lt;/p&gt;

&lt;p&gt;This is a service for people who use, or prepare to use, Crystal in production.
Our support service pairs production teams with Crystal experts,
providing PR reviews, architectural input, language guidance, and in general, help with the critical aspects that entails running a Crystal application.&lt;/p&gt;

&lt;p&gt;Its goal is to strengthen Crystal’s user community. We want to help both
current users and new adopters with simple and practical support.
This aims to make Crystal more attractive as a platform to build successful
products, while ensuring ongoing language development and maintenance.&lt;/p&gt;

&lt;div class=&quot;full-width-rule&quot;&gt;
  &lt;a href=&quot;https://manas.tech/projects/crystal/crystal-compass/&quot; class=&quot;hex&quot;&gt;Check it out&lt;/a&gt;
&lt;/div&gt;</content>
    </entry>
</feed>
