<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Gleam</title><id>https://gleam.run/feed.xml</id><updated>2026-04-24T00:00:00Z</updated><subtitle type="text">Gleam is a fast, friendly, and functional language for building type-safe, scalable systems!</subtitle><generator uri="https://github.com/gleam-lang/website">gleam-lang/website</generator><link href="https://gleam.run/feed.xml" rel="self" /><link href="https://gleam.run" rel="alternate" /><entry><title>JavaScript source maps</title><id>https://gleam.run/news/javascript-source-maps</id><updated>2026-04-24T00:00:00Z</updated><published>2026-04-24T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/javascript-source-maps" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.16.0">v1.16.0</a> has been published, let&#39;s
go over what&#39;s new.</p>
<h2 id="Gleam-gets-source-maps">Gleam gets source maps</h2>
<p>Gleam&#39;s robust type system makes runtime errors very rare, but it would be naive
to say that it&#39;s never necessary to debug Gleam code at runtime. When compiling
code to JavaScript one challenge for runtime debugging is that the error and
the source code shown is that of the compiled JavaScript, not the Gleam the
programmer actually wrote.</p>
<p>The solution to this problem is source maps, additional files that Gleam&#39;s
compiler can now generate, teaching browsers and JavaScript runtimes what the
original code is and how it maps on to the JavaScript it runs. Here it is in
action with Safari&#39;s dev-tools:</p>
<img src="/images/news/gleam-v1.16-released/debugger.png" class="shadow" alt="Safari's dev tools debugger showing Gleam code">
<p>As you may know, it&#39;s not limited to just displaying the code, it also
translates exception stack traces to the original locations, and enables use of
breakpoints and debuggers.</p>
<p>To enable source maps set the <code>javascript.source_maps</code> property to <code>true</code> in
your <code>gleam.toml</code>, and ensure that you are serving these new files to the web
browser along with your JavaScript code. If you are serving the build directory
or using <a href="https://lustre.build/">Lustre&#39;s</a> dev-tools then there&#39;s nothing else
to do.</p>
<pre><code><span class=hl-function>name </span>= "my_project"
<span class=hl-function>version </span>= "1.0.0"

<span class=hl-module>[javascript]</span>
<span class=hl-function>source_maps </span>= true

<span class=hl-module>[dependencies]</span>
<span class=hl-function>gleam_stdlib </span>= ">= 1.0.0 and < 2.0.0"
</code></pre>
<p>A huge thank you to <a href="https://github.com/Acepie">Ameen Radwan</a> for this big
improvement. Folks who enjoy breakpoint debugging will be especially pleased.</p>
<h2 id="Package-level-fault-tolerance">Package-level fault tolerance</h2>
<p>Gleam is a fully-typed language, so to compile a module of Gleam code the
compiler must first successfully compile all the modules it imports in order to
have the required type information. Attempting to analyse modules without this
information would result in a cascading failure of incorrect and misleading
error messages, so when a module cannot be compiled the build tool stops and
reports the errors.</p>
<p>This behaviour successfully prevents the error cascade, but it has been a
source of confusion at times. Some developers may not realise they have an error
upstream in their project and so do not understand why the language server is
providing minimal assistance, presuming that it is broken.</p>
<p>Worse still, because compilation stops at the first failed module the language
server may be unable to help with modules that do not directly or indirectly
import an invalid module, but just happen to come after them in the compilation
order. There&#39;s no justifiable reason why these modules could not have been
compiled, but the developer is stuck without them.</p>
<p>These two pain points have now been resolved. If the programmer opens in their
editor a module that genuinely could not be compiled, then the language server
will display a diagnostic on the import that leads to the problem, removing the
confusion.</p>
<p>When a module fails to compile the build tool will prune that sub-tree of
modules and move on to the next set of modules that can be compiled, ensuring
that the programmer has as much up-to-date information as possible available to
them in their editor.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>! This will
make a big difference to some Gleam programmers.</p>
<h2 id="Faster-string-pattern-matching">Faster string pattern matching</h2>
<p>The compiler now emits more efficient code when matching on single-character
string prefixes on the JavaScript target. For example, <code>glance</code>  (a Gleam
package that can parse Gleam code) is now nearly 30% faster on the JavaScript
target:</p>
<pre><code># before:
min: 10.8ms, max: 365.82ms, median: 14.74ms, mean: 14.76ms
warmup: 100/1.5s, total post-warmup: 1000/14.76s

# after:
min: 8.96ms, max: 143.76ms, median: 10.72ms, mean: 11.06ms
warmup: 100/1.24s, total post-warmup: 1000/11.06s
</code></pre>
<p>Thank you <a href="https://github.com/yoshi-monster/">Rebecca Reusch</a> and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Record-update-fault-tolerance">Record update fault tolerance</h2>
<p>To provide a good language server experience with invalid code, Gleam&#39;s
compilation aims to be fault-tolerant, and will attempt to continue analysing
the code after finding an error.</p>
<p>With this release the analysis of record update expressions is now fault-
tolerant, and the compiler now shows a better error message when trying to use
the record update syntax with variants that have no labelled fields.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Oversized-int-pattern-warning">Oversized int pattern warning</h2>
<p>The largest size an int can have on JavaScript is 52 bits, after which
precision is lost. The compiler now raises a warning on the JavaScript target
when a pattern attempts to extract an int larger than JavaScript supports, to
avoid unexpected results.</p>
<pre><code class="language-txt">warning: Truncated bit array segment
  ┌─ /src/app/warning.gleam:3:20
  │
3 │     let &lt;&lt;_, number:152&gt;&gt; = sha
  │                     ^^^

This segment is a 152-bit long int, but on the JavaScript target
numbers have at most 52 bits. It would be truncated to its first 52 bits.
Hint: Did you mean to use the `bytes` segment option?
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Spoiling-practical-jokes">Spoiling practical jokes</h2>
<p>The compiler now emits a helpful error message when source code contains an
invalid unicode character that looks similar to a correct character.</p>
<pre><code><b><span class="code-error">error</span>: Syntax error</b>
<span class="code-decoration">  ┌─</span> /src/parse/error.gleam:1:20
<span class="code-decoration">  │</span>
<span class="code-decoration">1 │</span> pub fn main() { #(1‚ 2) }
<span class="code-decoration">  │</span>                    <span class="code-error">^ Unexpected character</span>

This looks like ascii comma, but it is actually the unicode low single
comma quotation mark.
</code></pre>
<p>Bad news for mischievous pranksters, good news for folks who don&#39;t like
debugging unexpected parse errors.</p>
<h3 id="Hex-package-ownership-management">Hex package ownership management</h3>
<p><a href="https://github.com/nkxxll">Niklas Kirschall</a> has added the new
<code>gleam hex owner add</code> command, allowing folks to add additional owners to their
Hex packages. Thank you Niklas!</p>
<h2 id="Hex-package-manager-error-message-improvements">Hex package manager error message improvements</h2>
<p>The build tool now produces a nicer error message when trying to add a package
version that doesn&#39;t exist. For example, running <code>gleam add wisp@11</code>
will now produce:</p>
<pre><code><b><span class="code-error">error</span>: Dependency resolution failed</b>

The package `wisp` has no versions in the range &gt;= 11.0.0 and &lt; 12.0.0.
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<p><a href="https://github.com/d-matz">David Matz</a> has also updated our error handling for
the new error types recently added to Hex&#39;s API, fixing some incorrect and
misleading messages that we would show due to attempting to parse them as the
old errors. Thank you David!</p>
<h2 id="Add-and-remove-anonymous-function-code-actions">Add and remove anonymous function code actions</h2>
<p>Gleam is a functional programming language, so functions are very commonly used
as values, and are passed as arguments to other functions. Sometimes an
anonymous function is used.</p>
<pre><code><span class=hl-keyword>let</span> add_item = <span class=hl-keyword>fn</span>(item) { <span class=hl-module>catalog</span>.<span class=hl-function>record</span>(item) }
</code></pre>
<p>Other times the function is referenced directly.</p>
<pre><code><span class=hl-keyword>let</span> add_item = catalog.record
</code></pre>
<p>These two expressions are equivalent, and the programmer would pick between the
two depending on what they find to be clearer at each point in their code.</p>
<p>To make writing Gleam even nicer the language server now offers code actions to
switch between the two syntaxes. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  [<span class=hl-number>-1</span>, <span class=hl-number>-2</span>, <span class=hl-number>-3</span>] <span class=hl-operator>|&gt;</span> <span class=hl-module>list</span>.<span class=hl-function>map</span>(<span class=hl-keyword>fn</span>(a) { <span class=hl-module>int</span>.<span class=hl-function>absolute_value</span>(a) })
                        <span class=hl-comment>// ^^ Activating the &quot;Remove anonymous function&quot;</span>
                        <span class=hl-comment>// code action here</span>
}
</code></pre>
<p>Would result in this code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  [<span class=hl-number>-1</span>, <span class=hl-number>-2</span>, <span class=hl-number>-3</span>] <span class=hl-operator>|&gt;</span> <span class=hl-module>list</span>.<span class=hl-function>map</span>(int.absolute_value)
}
</code></pre>
<p>And with this code the other action could be used to reverse the change.</p>
<p>Thank you <a href="https://github.com/treuherz">Eli Treuherz</a>!</p>
<h2 id="Extract-function-code-action-improvements">Extract function code action improvements</h2>
<p>Gleam&#39;s language server has an &quot;extract function&quot; code action that can be used
to… well… extract a function.</p>
<p>It can now be used in pipelines to extract a part of one into a function. For
example, triggering it here:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>words</span>(phrase: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>String</span>) {
  phrase
  <span class=hl-operator>|&gt;</span> <span class=hl-module>string</span>.<span class=hl-function>lowercase</span>
  <span class=hl-comment>// ^^^</span>
  <span class=hl-operator>|&gt;</span> <span class=hl-module>string</span>.<span class=hl-function>replace</span>(each: <span class=hl-string>&quot;jak&quot;</span>, with: <span class=hl-string>&quot;lucy&quot;</span>)
  <span class=hl-comment>// ^^^ selecting these two steps of the pipeline</span>
  <span class=hl-operator>|&gt;</span> <span class=hl-module>string</span>.<span class=hl-function>split</span>(on: <span class=hl-string>&quot; &quot;</span>)
}
</code></pre>
<p>Would result in the following code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>words</span>(phrase: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>String</span>) {
  phrase
  <span class=hl-operator>|&gt;</span> function
  <span class=hl-operator>|&gt;</span> <span class=hl-module>string</span>.<span class=hl-function>split</span>(on: <span class=hl-string>&quot; &quot;</span>)
}

<span class=hl-keyword>fn</span> <span class=hl-function>function</span>(string: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>String</span> {
  string
  <span class=hl-operator>|&gt;</span> <span class=hl-module>string</span>.<span class=hl-function>lowercase</span>
  <span class=hl-operator>|&gt;</span> <span class=hl-module>string</span>.<span class=hl-function>replace</span>(each: <span class=hl-string>&quot;jak&quot;</span>, with: <span class=hl-string>&quot;lucy&quot;</span>)
}
</code></pre>
<p>It has also been improved to work better with assignments, extracting the
assigned value. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>personal_blog</span>() {
  <span class=hl-keyword>let</span> introduction =
    <span class=hl-module>html</span>.<span class=hl-function>main</span>([], [
      <span class=hl-module>html</span>.<span class=hl-function>h1</span>([], [<span class=hl-module>html</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot;Hello, world!&quot;</span>)]),
      <span class=hl-module>html</span>.<span class=hl-function>p</span>([], [<span class=hl-module>html</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot;Gleam is cool&quot;</span>)])
    ])
  <span class=hl-comment>//^^^ Triggering &quot;extract function&quot; on this expression</span>

  <span class=hl-module>html</span>.<span class=hl-function>body</span>([introduction, <span class=hl-function>blog_posts</span>()])
}
</code></pre>
<p>Would result in the following code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>personal_blog</span>() {
  <span class=hl-keyword>let</span> introduction = <span class=hl-function>function</span>()
  <span class=hl-module>html</span>.<span class=hl-function>body</span>([introduction, <span class=hl-function>blog_posts</span>()])
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>function</span>() {
  <span class=hl-module>html</span>.<span class=hl-function>main</span>([], [
    <span class=hl-module>html</span>.<span class=hl-function>h1</span>([], [<span class=hl-module>html</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot;Hello, world!&quot;</span>)]),
    <span class=hl-module>html</span>.<span class=hl-function>p</span>([], [<span class=hl-module>html</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot;Gleam is cool&quot;</span>)])
  ])
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Replace-_-with-type-code-action">Replace <code>_</code> with type code action</h2>
<p>Gleam&#39;s type hole syntax allows to omit parts of a type annotation, putting no
restrictions on what that part of the type can be inferred as. This can be
convenient when sketching out new code, but it&#39;s best practice to have full
annotations to make the code and the intended behaviour of the code easier to
understand.</p>
<p>To aid with moving to full annotation the language server has a code action to
replace a type hole with the underlying type. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>load_user</span>(id: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Result</span>(_, <span class=hl-variant>Error</span>) {
  <span class=hl-module>sql</span>.<span class=hl-function>find_by_id</span>(id)
  <span class=hl-operator>|&gt;</span> <span class=hl-module>result</span>.<span class=hl-function>map_error</span>(<span class=hl-variant>CannotLoadUser</span>)
}
</code></pre>
<p>Triggering the code action over the <code>_</code> will result in the following code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>load_user</span>(id: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Result</span>(<span class=hl-variant>User</span>, <span class=hl-variant>Error</span>) {
  <span class=hl-module>sql</span>.<span class=hl-function>find_by_id</span>(id)
  <span class=hl-operator>|&gt;</span> <span class=hl-module>result</span>.<span class=hl-function>map_error</span>(<span class=hl-variant>CannotLoadUser</span>)
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Constant-list-prepending">Constant list prepending</h2>
<p>The compiler now supports list prepending in constants. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> viviparous_mammals = [<span class=hl-string>&quot;dog&quot;</span>, <span class=hl-string>&quot;cat&quot;</span>, <span class=hl-string>&quot;human&quot;</span>]

<span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> all_mammals = [<span class=hl-string>&quot;platypus&quot;</span>, <span class=hl-string>&quot;echidna&quot;</span>, ..viviparous_mammals]
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Language-server-completion-improvements">Language server completion improvements</h2>
<p>The language server&#39;s completion capability has been improved to understand
Gleam code more precisely. It now shows completions for the labelled
argument of a record when writing a record update, and no longer shows
completions for values when editing a qualified type.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Tuple-formatting-improvement">Tuple formatting improvement</h2>
<p>Gleam has a source code formatter, automating the business of formatting your
code, so you can focus on your task, and not get stuck in another argument
about whether or not you should use a trailing comma.</p>
<p>With this release the formatting of long nested tuples has been improved.
Previously the formatter would split only the last tuple, but now it favours
first splitting each element onto its own line:</p>
<pre><code><span class=hl-comment>// Old format</span>
#(#(<span class=hl-number>12345</span>, wobble), #(
  some_long_tuple,
  <span class=hl-string>&quot;passed_as_last_argument&quot;</span>
))

<span class=hl-comment>// New format:</span>
#(
  #(<span class=hl-number>12345</span>, wobble),
  #(some_long_tuple, <span class=hl-string>&quot;passed_as_last_argument&quot;</span>)
)
</code></pre>
<p>Thank you to formatter wizard <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="More-external-code-source-extension-support">More external code source extension support</h2>
<p>Gleam&#39;s external type and external function features allow Gleam code to make
use of code written in other languages on the same runtime, and Gleam&#39;s build tool
will process source files of these languages that are included in a source
directory of a Gleam project.</p>
<p>Some JavaScript runtimes now have built-in support for TypeScript and JSX, so
the build tool has had support for including files with <code>mts</code>, <code>cts</code>, <code>jsx</code>,
and <code>tsx</code> extensions.</p>
<p>Thank you <a href="https://github.com/nkxxll">Niklas Kirschall</a>!</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:
<a href="https://github.com/ankddev">Andrey Kozhev</a>,
<a href="https://github.com/lupodevelop">Daniele Scaratti</a>,
<a href="https://github.com/eyupcanakman">Eyup Can Akman</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/GioMaz">Giovanni Maria Zanchetta</a>,
<a href="https://github.com/jtdowney">John Downey</a>,
<a href="https://github.com/lpil">Louis Pilfold</a>,
<a href="https://github.com/lucymcphail">Lucy McPhail</a>,
<a href="https://github.com/luka-hash">Luka Ivanović</a>,
<a href="https://github.com/nkxxll">Niklas Kirschall</a>, and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>.</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.16.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a>
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)">
</a>
<p>Thank you to all our sponsors! And special thanks to our top sponsor:</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/aboio-labs">Aboio</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adam12">Adam Daniels</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/albertchae">albertchae</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/adkelley">Alex Kelley</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/GomZik">Aliaksiej Homza</a>
</li>
<li>
<a href="https://github.com/alii">Alistair Smith</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/ankddev">Andrey</a>
</li>
<li>
<a href="https://github.com/andremw">André Mazoni</a>
</li>
<li>
<a href="https://github.com/ayoung19">Andy Young</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/afarinetti">Antonio Farinetti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/domalaq">Baqtiar</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/Billuc">Billuc</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/blurrcat">blurrcat</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettcannon">Brett Cannon</a>
</li>
<li>
<a href="https://github.com/brettkolodny">Brett Kolodny</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/brunoskonrad">Bruno Konrad</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
Charlie Tonneslan
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/chrisolsen">Chris Olsen</a>
</li>
<li>
<a href="https://github.com/cvincent">Chris Vincent</a>
</li>
<li>
<a href="https://github.com/veeso">Christian Visintin</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/uberguy">Cris Holm</a>
</li>
<li>
<a href="https://github.com/pairshaped">Curling IO</a>
</li>
<li>
<a href="https://github.com/dagi3d">dagi3d</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/d2718">Dan</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/Giesch">Dan Gieschen Knutson</a>
</li>
<li>
<a href="https://github.com/danpiths">Dan Piths</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/lupodevelop">Daniele</a>
</li>
<li>
<a href="https://github.com/ndan">Daniil Nevdah</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/PotatoEMR">David Matz</a>
</li>
<li>
<a href="https://github.com/dpen2000">David Pendray</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/djordjedjukic">Djordje Djukic</a>
</li>
<li>
<a href="https://github.com/thedadams">Donnie Adams</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/EdRW">Ed Rosewright</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/treuherz">Eli Treuherz</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/Nimok">Erik Ohlsson</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/eyupcanakman">Eyüp Can Akman</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fpauser">Falk Pauser</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/folospior">Filip Hoffmann</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabriela-sartori">Gabriela Sartori</a>
</li>
<li>
<a href="https://github.com/gavinmorrow">Gavin Morrow</a>
</li>
<li>
<a href="https://github.com/GearsDatapacks">Gears</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/george-grec">George Grec</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/ginkogruen">ginkogruen</a>
</li>
<li>
<a href="https://github.com/GioMaz">GioMaz</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/gungun974">Gungun974</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/seafoamteal">Hari Mohan</a>
</li>
<li>
<a href="https://github.com/HarryET">Harry Bairstow</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://liberapay.com/Hizuru3/">Hizuru3</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">Isaac</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/iskrisis">iskrisis</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jachin">Jachin Rupe</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janvhs">Jan Fooken</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/jasonflorentino">Jason Florentino</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jimutt">Jimmy Utterström</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/joladev">Johanna Larsson</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/jtdowney">John Downey</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jmcharter">Jon Charter</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/maennchen">Jonatan Männchen</a>
</li>
<li>
<a href="https://github.com/hyperpolymath">Jonathan D.A. Jewell</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/czepluch">jstcz</a>
</li>
<li>
<a href="https://github.com/nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jorg1piano">Jørgen Andersen</a>
</li>
<li>
<a href="https://github.com/Kamila-P">KamilaP</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/Aurenos">Kile Deal</a>
</li>
<li>
<a href="https://github.com/kirillmorozov">Kirill Morozov</a>
</li>
<li>
<a href="https://github.com/bytesofpie">Kramer Hampton</a>
</li>
<li>
<a href="https://github.com/krig">Kristoffer Grönlund</a>
</li>
<li>
<a href="https://liberapay.com/krig/">Kristoffer Grönlund</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/km-tr">Kuma Taro</a>
</li>
<li>
<a href="https://github.com/jly36963">Landon</a>
</li>
<li>
<a href="https://github.com/leah-u">Leah Ulmschneider</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/rcoder">Lennon Day-Reynolds</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/lucymcphail">Lucy McPhail</a>
</li>
<li>
<a href="https://github.com/luka-hash">Luka Ivanović</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/mvellandi">Mario Vellandi</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/mkdynamic">Mark Dodwell</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/alterationx10">Mark Rudolph</a>
</li>
<li>
<a href="https://github.com/m4reko">Markus Wesslén</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/maxwelldb">Max Bridges</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/the-mikedavis">Michael Davis</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/mgruen">Michael G</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/tymak">Michal Timko</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://liberapay.com/mhm/">Moin</a>
</li>
<li>
<a href="https://github.com/ngscheurich">N. G. Scheurich</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/nataliethistime">Natalie Rose</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nessamurmur">Nessa Jane Marin</a>
</li>
<li>
<a href="https://github.com/nick-leslie">Nick Leslie</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/Resonious">Nigel Baillie</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
Niklas Kirschall
</li>
<li>
<a href="https://github.com/blink1415">Nikolai Steen Kjosnes</a>
</li>
<li>
<a href="https://github.com/Willyboar">Nikolas</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/nkxxll">nkxxll</a>
</li>
<li>
<a href="https://github.com/NNBnh">NNB</a>
</li>
<li>
<a href="https://github.com/Nezteb">Noah Betzen</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/nshkrdotcom">nshkrdotcom</a>
</li>
<li>
<a href="https://github.com/nunulk">nunulk</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/ollie-dot-earth">ollie</a>
</li>
<li>
<a href="https://github.com/optizio">Optizio</a>
</li>
<li>
<a href="https://liberapay.com/P./">P.</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/tamectosphere">Pattadon Sa-ngasri</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/CrowdHailer">Peter Saxton</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/qexat">qexat</a>
</li>
<li>
<a href="https://github.com/rykawamu">R.Kawamura</a>
</li>
<li>
<a href="https://github.com/raquentin">Race</a>
</li>
<li>
<a href="https://github.com/ramsgitrepo">Ram Prasanth Udhaya Baskar</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">rebecca</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/Deepfriedice">Richy McGregor</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/robertDurst">Rob Durst</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://github.com/genericrohan">Rohan</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/rclarey">Russell Clarey</a>
</li>
<li>
<a href="https://github.com/zenspider">Ryan Davis</a>
</li>
<li>
<a href="https://github.com/mooreryan">Ryan Moore</a>
</li>
<li>
<a href="https://github.com/sbergen">Sakari Bergen</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/scristobal">Samu</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/Sgregory42">Sgregory42</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/shawndrape">Shawn Drape</a>
</li>
<li>
<a href="https://github.com/shritesh">Shritesh Bhattarai</a>
</li>
<li>
<a href="https://github.com/shxdow">shxdow</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/rogics">SR</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/stephanerangaya">Stephane Rangaya</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/The-Sentience-Company">The Sentience Company</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/trescenzi">Thomas Crescenzi</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/betabrain">Tobias Ammann</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/tudorluca">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/ygunayer">unknown</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/bondiano">Vassiliy Kuzenkov</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/willramirezdev">Will Ramirez</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/zenconomist">Zsolt Kreisz</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
<li>
<a href="https://github.com/0ngk">音㦡</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Upgrading Hex security</title><id>https://gleam.run/news/upgrading-hex-security</id><updated>2026-03-16T00:00:00Z</updated><published>2026-03-16T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/upgrading-hex-security" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.15.0">v1.15.0</a> has been published, let&#39;s
go over what&#39;s new.</p>
<h2 id="The-Hex-package-manager">The Hex package manager</h2>
<p>Gleam is a BEAM language, so it uses Hex, the package manager of the Erlang
ecosystem. Hex recently introduced a new OAuth2 based authentication system,
replacing the old system of exchanging the account&#39;s username and password for
a long-lived token. This new system has many security advantages:</p>
<ul>
<li>
Multi-factor authentication is used for all endpoints that require write
permissions, so stolen credentials or tokens are insufficient to perform
sensitive actions.
</li>
<li>
Hex clients such as Gleam never see your password, so there is less
opportunity for an attacker to harvest credentials given access to your
workstation.
</li>
<li>
The access tokens are short lived, so if stolen there is only a small window
in which they could be used by the attacker.
</li>
<li>
The Hex site can integrate with other OAuth providers, enabling companies to
use their existing identity management and audit systems to secure Hex.
</li>
</ul>
<p>Gleam now uses exclusively this new system for authentication, and any existing
legacy tokens that Gleam has stored locally will be revoked the first time that
the new version of Gleam is used with Hex. The legacy system will be disabled
for Gleam packages in future.</p>
<p>Lastly, the password used for encrypting local Hex tokens must now be at least
8 characters in length.</p>
<br>
<div style="text-align: center">
  <a href="https://erlef.org/">
    <img src="/images/sponsors/eef.svg" alt="The Erlang Ecosystem Foundation" style="filter: invert(1)">
  </a>
</div>
<p>This work was done in collaboration with <a href="https://erlef.org">The Erlang Ecosystem Foundation</a>.
A huge thank-you to Jonatan Männchen and the rest of the team there! If you
would like to support important infrastructure projects for the whole ecosystem
consider becoming a member of the foundation.</p>
<h2 id="Better-Hex-errors">Better Hex errors</h2>
<p>It&#39;s possible for Hex operations to fail, for example, attempting to depend on
a package that does not exist, or attempting to publish a new version of a
package that you are not the maintainer of. When this happens we typically show
the programmer the error message as-is from the Hex API. These error messages
are not bad, but compared to the other error messages from Gleam it can be not
immediately obvious what the problem is and how the programmer should proceed.</p>
<p><a href="https://github.com/Acepie">Ameen Radwan</a> and <a href="https://github.com/vyacheslavhere">vyacheslavhere</a>
have added custom errors for these two scenarios, fixing the two main stumbling
points folks have with Hex errors. Thank you both!</p>
<h2 id="Guard-clause-ergonomics">Guard clause ergonomics</h2>
<p><a href="https://github.com/abs0luty">Adi Salimgereyev</a> has implemented two nice
improvements to guard expressions in case expressions. Firstly, the string
concatenation operator can now be used:</p>
<pre><code><span class=hl-keyword>case</span> message {
  action <span class=hl-keyword>if</span> version <span class=hl-operator>&lt;&gt;</span> <span class=hl-string>&quot;:&quot;</span> <span class=hl-operator>&lt;&gt;</span> action <span class=hl-operator>==</span> <span class=hl-string>&quot;v1:delete&quot;</span> -&gt; <span class=hl-function>handle_delete</span>()
  _ -&gt; <span class=hl-function>ignore_command</span>()
}
</code></pre>
<p>And a helpful custom error message is now shown when int and float binary
operators are used incorrectly in case expression guards.</p>
<p>Thank you <a href="https://github.com/abs0luty">Adi Salimgereyev</a>!</p>
<p>Additionally, the language server now supports renaming, go to definition,
hover, and finding references from expressions in case clause guards. Thank you
<a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Internal-types-presentation">Internal types presentation</h2>
<p>Gleam&#39;s <em>internal</em> publicity level allows definitions to be technically
importable and usable from other modules, but not be part of the actual public
API of the module. This may be useful for creating &quot;escape hatch&quot; APIs, or for
facilitating shared functionality between modules owned by the same maintainer.</p>
<p>Because they are not public, these internal definitions are not shown in the
generated API documentation, and are not suggested for autocompletion by the
language server. There was however some compiler and language server
functionality where they did not get special treatment, which could make it not
immediately obvious that a definition is internal.
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> has fixed these now!</p>
<p>The &quot;Add missing patterns&quot; code action will insert a catch all pattern for
internal types, the language server will no longer show completions for the
fields of internal types, and the compiler no longer shows the structure of
internal types when displaying an &quot;Inexhaustive patterns&quot; error. Thank you Jak!</p>
<h2 id="JavaScript-FFI-additions">JavaScript FFI additions</h2>
<p>Gleam can compile to JavaScript, making use of the wealth of code that exists
in the JavaScript ecosystem. To enable JavaScript code to construct and work
with Gleam data structures the compiler provides an API for each type in a
Gleam codebase. This release brings some improvements to this API:</p>
<p>The <code>BitArray$isBitArray</code> and <code>BitArray$BitArray$data</code> functions have been added,
enabling JavaScript to consume the Gleam prelude bit-array type.</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-punctuation>{</span> <span class=hl-variable>BitArray$isBitArray</span><span class=hl-punctuation>,</span> <span class=hl-variable>BitArray$BitArray$data</span> <span class=hl-punctuation>}</span> <span class=hl-keyword>from</span> <span class=hl-string>&quot;../gleam.mjs&quot;</span><span class=hl-punctuation>;</span>

<span class=hl-keyword>export</span> <span class=hl-keyword>function</span> <span class=hl-function>writeFile</span><span class=hl-punctuation>(</span><span class=hl-variable>path</span><span class=hl-punctuation>,</span> <span class=hl-variable>data</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
  <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>BitArray$isBitArray</span><span class=hl-punctuation>(</span><span class=hl-variable>data</span><span class=hl-punctuation>)</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>const</span> <span class=hl-variable>buffer</span> <span class=hl-operator>=</span> <span class=hl-function>BitArray$BitArray$data</span><span class=hl-punctuation>(</span><span class=hl-variable>data</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>
    <span class=hl-keyword>return</span> <span class=hl-variable>fs</span><span class=hl-punctuation>.</span><span class=hl-function>write</span><span class=hl-punctuation>(</span><span class=hl-variable>path</span><span class=hl-punctuation>,</span> <span class=hl-variable>buffer</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>
  <span class=hl-punctuation>}</span>
<span class=hl-punctuation>}</span>
</code></pre>
<p>TypeScript types are also generated for this API. Functions such as
<code>BitArray$isBitArray</code> that check if a value is of a given type now have the
return type <code>value is TypeName</code>, so the TypeScript type checker can use these
functions to understand whether or not the value is the expected Gleam type.</p>
<h2 id="Package-quality-publish-checks">Package quality publish checks</h2>
<p>We want the Hex package repository to be full of high-quality and
production-ready code. It is not a place for sharing or showing-off prototypes,
and name-squatting is against the terms of service. We keep an eye on the
packages that are published over time, monitoring for any undesirable trends
that we wish to discourage, and introducing checks to prevent them
occasionally.</p>
<p>One problem we noticed recently was folks opting to not document their package
with a README, which is intended to serve as the home-page of the
documentation. - The build tool will now refuse to publish any package that has
the default README generated by the <code>gleam new</code> command, or is missing any
README altogether.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Code-folding">Code folding</h2>
<p>The language server now supports <code>textDocument/foldingRange</code>, enabling folding
for contiguous import blocks and multi-line top-level definitions, such as
function bodies, custom types, constants, and type aliases.</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/int</span>
<span class=hl-keyword>import</span> <span class=hl-module>gleam/list</span>
<span class=hl-keyword>import</span> <span class=hl-module>gleam/string</span>
</code></pre>
<p>This block of imports can now be folded in the editor like so:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/int</span> ...
</code></pre>
<p>Thank you <a href="https://github.com/aayush-tripathi">Aayush Tripathi</a>!</p>
<h2 id="CLI-documentation-improvements">CLI documentation improvements</h2>
<p>The <code>help</code> command and <code>--help</code> flag can be used with Gleam&#39;s command line
interface to view a concise overview of various commands. This was helpful for
the very basics, but typically the programmer would need to refer to the
documentation on the Gleam website for more complex tasks, such as adding a
dependency from <code>git</code>, or adding a package with a specific version constraint.</p>
<p>Stopping what you are doing to go and find a web page is annoying, so the
<code>gleam help add</code>, <code>gleam help deps</code>, and <code>gleam help docs</code> commands have
been improved with much more detailed documentation output, covering these
sorts of tasks.</p>
<h2 id="Consistent-configuration">Consistent configuration</h2>
<p>Gleam tooling uses the <code>gleam.toml</code> file for configuration. Due to a mistake
very early in Gleam&#39;s initial development there has been an odd inconsistency
with the names of two of the keys in this file: <code>dev-dependencies</code> and
<code>tag-prefix</code>. They use sausage-case, but all the others use snake_case!</p>
<p>With this release they are now canonically snake case, making them consistent.
The old format continues to be supported, but it is deprecated.</p>
<pre><code><span class=hl-function>name </span>= "my_app"
<span class=hl-function>version </span>= "2.4.0"

<span class=hl-module>[dependencies]</span>
<span class=hl-function>gleam_stdlib </span>= ">= 0.44.0 and < 2.0.0"

<span class=hl-module>[dev_dependencies]</span>
<span class=hl-function>gleeunit </span>= ">= 1.0.0 and < 2.0.0"
</code></pre>
<h2 id="Extract-anonymous-function">Extract anonymous function</h2>
<p>The <code>Extract function</code> code action now has a special-case for extracting
anonymous functions, using the body of the anonymous function as the body of
the new extracted function.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>double</span>(numbers: <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>)) -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>) {
  <span class=hl-keyword>let</span> multiplier = <span class=hl-number>2</span>
  <span class=hl-module>list</span>.<span class=hl-function>map</span>(numbers, <span class=hl-keyword>fn</span>(number) { number <span class=hl-operator>*</span> multiplier })
  <span class=hl-comment>//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</span>
}
</code></pre>
<p>When this anonymous function is extracted the code is refactored like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>double</span>(numbers: <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>)) -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>) {
  <span class=hl-keyword>let</span> multiplier = <span class=hl-number>2</span>
  <span class=hl-module>list</span>.<span class=hl-function>map</span>(numbers, <span class=hl-function>function</span>(_, multiplier))
}

<span class=hl-keyword>fn</span> <span class=hl-function>function</span>(number: <span class=hl-variant>Int</span>, multiplier: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Int</span> {
  number <span class=hl-operator>*</span> multiplier
}
</code></pre>
<p>Thank you <a href="https://github.com/seafoamteal">Hari Mohan</a>!</p>
<h2 id="Module-usage-renaming">Module usage renaming</h2>
<p>The rename action can be triggered on usages of a module, rather than just its
import, for example:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>lustre/element</span>
<span class=hl-keyword>import</span> <span class=hl-module>lustre/element/html</span>
<span class=hl-keyword>import</span> <span class=hl-module>lustre/event</span>

<span class=hl-keyword>fn</span> <span class=hl-function>view</span>(model: <span class=hl-variant>Int</span>) -&gt; element.<span class=hl-variant>Element</span>(<span class=hl-variant>Msg</span>) {
  <span class=hl-comment>//                     ^  Renaming module to `el` here</span>
  <span class=hl-keyword>let</span> count = <span class=hl-module>int</span>.<span class=hl-function>to_string</span>(model)

  <span class=hl-module>html</span>.<span class=hl-function>div</span>([], [
    <span class=hl-module>html</span>.<span class=hl-function>button</span>([<span class=hl-module>event</span>.<span class=hl-function>on_click</span>(<span class=hl-variant>Incr</span>)], [<span class=hl-module>element</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot; + &quot;</span>)]),
    <span class=hl-module>html</span>.<span class=hl-function>p</span>([], [<span class=hl-module>element</span>.<span class=hl-function>text</span>(count)]),
    <span class=hl-module>html</span>.<span class=hl-function>button</span>([<span class=hl-module>event</span>.<span class=hl-function>on_click</span>(<span class=hl-variant>Decr</span>)], [<span class=hl-module>element</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot; - &quot;</span>)]),
  ])
}
</code></pre>
<p>Using renaming when hovering on module name would result in the
following code:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>lustre/element</span> <span class=hl-keyword>as</span> el
<span class=hl-keyword>import</span> <span class=hl-module>lustre/element/html</span>
<span class=hl-keyword>import</span> <span class=hl-module>lustre/event</span>

<span class=hl-keyword>fn</span> <span class=hl-function>view</span>(model: <span class=hl-variant>Int</span>) -&gt; el.<span class=hl-variant>Element</span>(<span class=hl-variant>Msg</span>) {
  <span class=hl-keyword>let</span> count = <span class=hl-module>int</span>.<span class=hl-function>to_string</span>(model)

  <span class=hl-module>html</span>.<span class=hl-function>div</span>([], [
    <span class=hl-module>html</span>.<span class=hl-function>button</span>([<span class=hl-module>event</span>.<span class=hl-function>on_click</span>(<span class=hl-variant>Incr</span>)], [<span class=hl-module>el</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot; + &quot;</span>)]),
    <span class=hl-module>html</span>.<span class=hl-function>p</span>([], [<span class=hl-module>el</span>.<span class=hl-function>text</span>(count)]),
    <span class=hl-module>html</span>.<span class=hl-function>button</span>([<span class=hl-module>event</span>.<span class=hl-function>on_click</span>(<span class=hl-variant>Decr</span>)], [<span class=hl-module>el</span>.<span class=hl-function>text</span>(<span class=hl-string>&quot; - &quot;</span>)]),
  ])
}
</code></pre>
<p>Thank you <a href="https://github.com/vshakitskiy">Vladislav Shakitskiy</a>!</p>
<h2 id="Add-missing-type-parameter-code-action">Add missing type parameter code action</h2>
<p>The language server now suggests a quick-fix code action for when a custom type
definition uses a type parameter in its variants that have not been declared in
its header.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Store</span> {
  <span class=hl-variant>Store</span>(name: <span class=hl-variant>String</span>, data: inner_type)
}
</code></pre>
<p>This code doesn&#39;t compile as the <code>inner_type</code> type variable hasn&#39;t been
declared. Running the code action results in the code being fixed like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Store</span>(inner_type) {
  <span class=hl-variant>Store</span>(name: <span class=hl-variant>String</span>, data: inner_type)
}
</code></pre>
<p>Thank you <a href="https://github.com/andipabst">Andi Pabst</a>!</p>
<h2 id="String-prefix-language-server-triggering">String prefix language server triggering</h2>
<p>It&#39;s now possible to find references and rename variables in string prefix
patterns:</p>
<pre><code><span class=hl-keyword>case</span> wibble {
  <span class=hl-string>&quot;1&quot;</span> <span class=hl-keyword>as</span> digit <span class=hl-operator>&lt;&gt;</span> rest -&gt; digit <span class=hl-operator>&lt;&gt;</span> rest
  <span class=hl-comment>//     ^^^^^    ^^^^</span>
  <span class=hl-comment>// You can now trigger &quot;Find references&quot; and &quot;Rename&quot; from here</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/IgorCastejon">Igor Castejón</a>!</p>
<h2 id="More-precise-completions">More precise completions</h2>
<p>The language server protocol has some ambiguities in places, which means that
different editors can have slightly different behaviour for the same actions.
One way in which this has caused a problem for Gleam programmers is when using
a completion where the suffix already exists in the code. For example, imagine
you&#39;re updating your code to fully qualify the uses of the <code>Json</code> type:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>payload</span>() -&gt; js|<span class=hl-variant>Json</span>
<span class=hl-comment>//                    ^ typing the module name</span>
</code></pre>
<p>Accepting the <code>json.Json</code> completion in some editors would result in the
incorrect code <code>json.JsonJson</code>. To prevent this annoyance the language server
now gives more precise instructions to the editor, so all will render the
correct <code>json.Json</code> code.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Signature-help-type-parameter-names">Signature help type parameter names</h2>
<p>The language server now shows the original names used for type parameters in
the signature help information. This can help understand what each of the
parameters mean. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>twice</span>(data: input, function: <span class=hl-keyword>fn</span>(input) -&gt; output) -&gt; output {
  <span class=hl-function>function</span>(<span class=hl-function>function</span>(data))
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-function>twice</span>( )
  <span class=hl-comment>//    ↑ Cursor here</span>
}
</code></pre>
<p>This will show this signature help information:</p>
<pre><code><span class=hl-function>twice</span>(input, <span class=hl-keyword>fn</span>(input) -&gt; output)

</code></pre>
<p>Thank you <a href="https://github.com/scristobal">Samuel Cristobal</a>!</p>
<h2 id="Other-language-server-improvements">Other language server improvements</h2>
<p>Developer experience and productivity are our main focus, so we have lots of
small but impactful quality-of-life improvements in the language server.</p>
<p>The language server now suggests completions for keywords that are expressions,
like <code>echo</code>, <code>panic</code>, and <code>todo</code>. Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>.</p>
<p>The &quot;Fill labels&quot; code action now uses variables from scope when they match
the label name and expected type, instead of leaving a <code>todo</code> placeholder that
the programmer would need to replace with those variables. Thank you
<a href="https://github.com/vshakitskiy">Vladislav Shakitskiy</a>.</p>
<p>The &quot;Interpolate String&quot; code action now lets the user &quot;cut out&quot; any portion
of a string, regardless of whether it is a valid Gleam identifier or not.
Thank you <a href="https://github.com/seafoamteal">Hari Mohan</a>.</p>
<p>The language server now performs best-effort zero value generation for
<code>decode.failure</code> and has support for <code>Nil</code> when using the <code>generate dynamic decoder</code>
code action. Thank you <a href="https://github.com/seafoamteal">Hari Mohan</a>.</p>
<p>The language server now allows extracting the start of a pipeline into a
variable. Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>.</p>
<p>Custom type definitions and custom type variants now show their documentation
on hover, so you can see what it looks like when rendered. Thank you
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>.</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:
<a href="https://github.com/acandoo">acandoo</a>,
<a href="https://github.com/ankddev">Andrey Kozhev</a>,
<a href="https://github.com/chrillep">Christian Widlund</a>,
<a href="https://github.com/daniellionel01">daniellionel01</a>,
<a href="https://github.com/EtienneBoutet">Etienne Boutet</a>,
<a href="https://github.com/gavinmorrow">Gavin Morrow</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/seafoamteal">Hari Mohan</a>,
<a href="https://github.com/jtdowney">John Downey</a>,
<a href="https://github.com/justinlubin">Justin Lubin</a>,
<a href="https://github.com/GearsDatapacks">Surya Rose</a>,
<a href="https://github.com/vyacheslavhere">vyacheslavhere</a>, and
<a href="https://github.com/vshakitskiy">Vladislav Shakitskiy</a>.</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.15.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a>
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)">
</a>
<p>Thank you to all our sponsors! And special thanks to our top sponsors:</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/aayush-tripathi">Aayush</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/aboio-labs">Aboio</a>
</li>
<li>
<a href="https://github.com/abs0luty">abs0luty</a>
</li>
<li>
<a href="https://github.com/acandoo">acandoo</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adam12">Adam Daniels</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/albertchae">albertchae</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/adkelley">Alex Kelley</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/andipabst">Andi</a>
</li>
<li>
<a href="https://github.com/ankddev">Andrey</a>
</li>
<li>
<a href="https://github.com/andremw">André Mazoni</a>
</li>
<li>
<a href="https://github.com/ayoung19">Andy Young</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/afarinetti">Antonio Farinetti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/domalaq">Baqtiar</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/Billuc">Billuc</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/blurrcat">blurrcat</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettcannon">Brett Cannon</a>
</li>
<li>
<a href="https://github.com/brettkolodny">Brett Kolodny</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/brunoskonrad">Bruno Konrad</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/akiramusic000">Chloe</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/chrisolsen">Chris Olsen</a>
</li>
<li>
<a href="https://github.com/cvincent">Chris Vincent</a>
</li>
<li>
<a href="https://github.com/veeso">Christian Visintin</a>
</li>
<li>
<a href="https://github.com/chrillep">Christian Widlund</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/emauton">Cian Synnott</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/cncptpr">cncptpr</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/cmnstmntmn">Constantin Angheloiu</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/uberguy">Cris Holm</a>
</li>
<li>
<a href="https://github.com/dagi3d">dagi3d</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/d2718">Dan</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/Giesch">Dan Gieschen Knutson</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/daniellionel01">Daniel Kurz</a>
</li>
<li>
<a href="https://github.com/lupodevelop">Daniele</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/dpen2000">David Pendray</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/thedadams">Donnie Adams</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/EdRW">Ed Rosewright</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
Egor Kurtashkin
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/Nimok">Erik Ohlsson</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fpauser">Falk Pauser</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/fweingartshofer">Florian Weingartshofer</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/fruno-bulax">fruno</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/gabriela-sartori">Gabriela Sartori</a>
</li>
<li>
<a href="https://github.com/gavinmorrow">Gavin Morrow</a>
</li>
<li>
<a href="https://github.com/GearsDatapacks">Gears</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/ginkogruen">ginkogruen</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">H.J.</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/seafoamteal">Hari Mohan</a>
</li>
<li>
<a href="https://github.com/HarryET">Harry Bairstow</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://liberapay.com/Hizuru3/">Hizuru3</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/IgorCastejon">IgorCastejon</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">Isaac</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/iskrisis">iskrisis</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jachin">Jachin Rupe</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janvhs">Jan Fooken</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jimutt">Jimmy Utterström</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/jtdowney">John Downey</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jmcharter">Jon Charter</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/BigJayToDaIzo">Joseph Myers</a>
</li>
<li>
<a href="https://github.com/JosephTLyons">Joseph T. Lyons</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/czepluch">jstcz</a>
</li>
<li>
<a href="https://github.com/nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jorg1piano">Jørgen Andersen</a>
</li>
<li>
<a href="https://github.com/kadei-rat">kadei</a>
</li>
<li>
<a href="https://github.com/Kamila-P">KamilaP</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/Aurenos">Kile Deal</a>
</li>
<li>
<a href="https://github.com/bytesofpie">Kramer Hampton</a>
</li>
<li>
<a href="https://github.com/krig">Kristoffer Grönlund</a>
</li>
<li>
<a href="https://liberapay.com/krig/">Kristoffer Grönlund</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/km-tr">Kuma Taro</a>
</li>
<li>
<a href="https://github.com/jly36963">Landon</a>
</li>
<li>
<a href="https://github.com/leah-u">Leah Ulmschneider</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/rcoder">Lennon Day-Reynolds</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/lucymcphail">Lucy McPhail</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/mvellandi">Mario Vellandi</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/mkdynamic">Mark Dodwell</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/alterationx10">Mark Rudolph</a>
</li>
<li>
<a href="https://github.com/m4reko">Markus Wesslén</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Max Maxwell</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/the-mikedavis">Michael Davis</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/tymak">Michal Timko</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://liberapay.com/mhm/">Moin</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/ngscheurich">N. G. Scheurich</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/nataliethistime">Natalie Rose</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nick-leslie">Nick Leslie</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/Resonious">Nigel Baillie</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/blink1415">Nikolai Steen Kjosnes</a>
</li>
<li>
<a href="https://github.com/Willyboar">Nikolas</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/Nezteb">Noah Betzen</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/nunulk">nunulk</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/BabaykaBo">Oleh</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/nnuuvv">ollie</a>
</li>
<li>
<a href="https://github.com/optizio">Optizio</a>
</li>
<li>
<a href="https://liberapay.com/P./">P.</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/tamectosphere">Pattadon Sa-ngasri</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/CrowdHailer">Peter Saxton</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/raquentin">Race</a>
</li>
<li>
<a href="https://github.com/ramsgitrepo">Ram Prasanth Udhaya Baskar</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/robertDurst">rob durst</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://github.com/genericrohan">Rohan</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/rclarey">Russell Clarey</a>
</li>
<li>
<a href="https://github.com/mooreryan">Ryan Moore</a>
</li>
<li>
<a href="https://github.com/sbergen">Sakari Bergen</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/scristobal">Samuel Cristobal</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/Sgregory42">Sgregory42</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/shawndrape">Shawn Drape</a>
</li>
<li>
<a href="https://github.com/shritesh">Shritesh Bhattarai</a>
</li>
<li>
<a href="https://github.com/shxdow">shxdow</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/stephanerangaya">Stephane Rangaya</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/The-Sentience-Company">The Sentience Company</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/trescenzi">Thomas Crescenzi</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/betabrain">Tobias Ammann</a>
</li>
<li>
<a href="https://github.com/ToddG">ToddG</a>
</li>
<li>
<a href="https://github.com/toulerl">Tolek</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/tudorluca">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/uh-kay">uh-kay</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/bondiano">Vassiliy Kuzenkov</a>
</li>
<li>
<a href="https://github.com/vemolista">vemolista</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/voytxt">Vojtěch Křižan</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/vshakitskiy">vshakitskiy</a>
</li>
<li>
<a href="https://github.com/vyacheslavhere">vyacheslavhere</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/willramirezdev">Will Ramirez</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/wundersmiths">Wundersmiths</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">yoshie</a>
</li>
<li>
<a href="https://github.com/zenconomist">Zsolt Kreisz</a>
</li>
<li>
<a href="https://github.com/zwubs">zwubs</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Join us at Gleam Gathering</title><id>https://gleam.run/news/join-us-at-gleam-gathering</id><updated>2026-02-11T00:00:00Z</updated><published>2026-02-11T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/join-us-at-gleam-gathering" rel="alternate" /><content type="html"><![CDATA[<p><a href="https://gleamgathering.com/">Gleam Gathering</a> is right around the corner! On
the 21st of February the Gleam team and many friendly Gleamlins will be meeting
in Bristol UK for the first ever 100% Gleam conference. This is a milestone for
the community, and we are very excited.
There will be talks from community members and Gleam core team members on
topics ranging from compiler optimisation to trains (seemingly a popular
subject within the Gleam community).</p>
<p>Around the presentations there&#39;s opportunity to meet and talk with folks from
the community, and afterwards we will be going to a retro-games arcade for some
fun. I may check out the local rock-climbing gym the day after too!</p>
<p>If you&#39;d like to join us then there&#39;s a few <a href="https://gleamgathering.com/#register">last minute tickets remaining</a>.
See you in Bristol!</p>
]]></content></entry><entry><title>The happy holidays release 2025 🎁</title><id>https://gleam.run/news/the-happy-holidays-2025-release</id><updated>2025-12-25T00:00:00Z</updated><published>2025-12-25T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/the-happy-holidays-2025-release" rel="alternate" /><content type="html"><![CDATA[<p>Merry Christmas and happy holidays everyone! Gleam is a type-safe and scalable
language for the Erlang virtual machine and JavaScript runtimes. Gleam
<a href="https://github.com/gleam-lang/gleam/releases/tag/v1.14.0">v1.14.0</a> is our Xmas gift for you, let&#39;s unwrap it and take a look
inside.</p>
<h2 id="External-annotations-for-external-types">External annotations for external types</h2>
<p>Gleam doesn&#39;t exist in a vacuum, instead builds upon the existing Erlang and
JavaScript ecosystems. It&#39;s not uncommon for Gleam programs and libraries to
internally make use of code written in other languages in the same ecosystem,
and Gleam code can be called from those languages too. To help with the
interoperability between these languages the Gleam compiler can generate Erlang
type specifications and TypeScript declaration files. These can be used with
external type checkers and static analysis tooling to ensure the various
languages are calling each other&#39;s code correctly.</p>
<pre><code><span class=hl-comment>// Function written in Gleam</span>
<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>greet</span>(name: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>String</span> {
  <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>&lt;&gt;</span> name <span class=hl-operator>&lt;&gt;</span> <span class=hl-string>&quot;!&quot;</span>
}
</code></pre>
<pre><code><span class=hl-comment>% Generated Erlang type spec
</span><span class=hl-operator>-</span><span class=hl-atom>spec</span> <span class=hl-function>greet</span><span class=hl-punctuation>(</span><span class=hl-function>binary</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span> <span class=hl-function>binary</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span><span class=hl-punctuation>.</span>
</code></pre>
<pre><code><span class=hl-comment>// Generated TypeScript type definition</span>
<span class=hl-keyword>export</span> <span class=hl-keyword>function</span> <span class=hl-function>greet</span><span class=hl-punctuation>(</span><span class=hl-variable>name</span><span class=hl-punctuation>:</span> <span class=hl-variable>string</span><span class=hl-punctuation>)</span><span class=hl-punctuation>:</span> <span class=hl-variable>string</span><span class=hl-punctuation>;</span>
</code></pre>
<p>When writing bindings to code in other languages, Gleam&#39;s <em>external type</em>
feature is used to declare a type that can be referenced in Gleam, but since it
originates from outside of Gleam it has an unknown shape and cannot be
constructed directly. A very useful feature for designing Gleam-y APIs for
external code! The limitation here was that due to Gleam not knowing anything
about these external types, it was not able to produce a precise definition in
generated Erlang or TypeScript type definitions, having to fall back to the
correct but vague &quot;any&quot; type of each language.</p>
<p>The <code>@external</code> annotation is now supported for external types, giving the
programmer a way to specify an Erlang or TypeScript type definition to be used.
For example, the <code>Dict</code> type from the standard library can now be written
as the following:</p>
<pre><code><span class=hl-comment>// External type declared in Gleam</span>
<span class=hl-keyword>@external</span>(erlang, <span class=hl-string>&quot;erlang&quot;</span>, <span class=hl-string>&quot;map&quot;</span>)
<span class=hl-keyword>@external</span>(javascript, <span class=hl-string>&quot;../dict.d.mts&quot;</span>, <span class=hl-string>&quot;Dict&quot;</span>)
<span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Dict</span>(key, value)
</code></pre>
<pre><code><span class=hl-comment>% Generated Erlang type definition
</span><span class=hl-operator>-</span><span class=hl-atom>type</span> <span class=hl-function>dict</span><span class=hl-punctuation>(</span><span class=hl-variable>K</span><span class=hl-punctuation>,</span> <span class=hl-variable>V</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span> <span class=hl-module>erlang</span><span class=hl-punctuation>:</span><span class=hl-function>map</span><span class=hl-punctuation>(</span><span class=hl-variable>K</span><span class=hl-punctuation>,</span> <span class=hl-variable>V</span><span class=hl-punctuation>)</span><span class=hl-punctuation>.</span>
</code></pre>
<pre><code><span class=hl-comment>// Generated TypeScript type definition</span>
<span class=hl-keyword>import</span> <span class=hl-variable>type</span> <span class=hl-punctuation>{</span> <span class=hl-variable>Dict</span> <span class=hl-punctuation>}</span> <span class=hl-keyword>from</span> <span class=hl-string>&quot;../dict.d.mts&quot;</span><span class=hl-punctuation>;</span>
<span class=hl-keyword>export</span> <span class=hl-variable>type</span> <span class=hl-variable>Dict$</span><span class=hl-operator>&lt;</span><span class=hl-variable>K</span><span class=hl-punctuation>,</span> <span class=hl-variable>V</span><span class=hl-operator>&gt;</span> <span class=hl-operator>=</span> <span class=hl-variable>Dict</span><span class=hl-operator>&lt;</span><span class=hl-variable>K</span><span class=hl-punctuation>,</span> <span class=hl-variable>V</span><span class=hl-operator>&gt;</span><span class=hl-punctuation>;</span>
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>
and <a href="https://github.com/yoshi-monster">Yoshie</a> for this!</p>
<h2 id="Interference-based-pruning-for-ints">Interference-based pruning for ints</h2>
<p>Gleam uses <em>pattern matching</em> for flow control, a common feature of functional
languages. This is where the programmer declares a series of <em>patterns</em> in a
case expression, and the first clause has a pattern that matches the shape of the
data being matched upon will be executed. Because these patterns are
declarative the compiler can generate more optimised code than it would be able
to for an <code>if</code>-<code>else</code> chain of boolean checks.</p>
<p>The previous release introduced <a href="https://gleam.run/news/formalising-external-apis/#Improved-bit-array-exhaustiveness-checking">interference-based pruning</a>,
a sophisticated optimisation that improves performance and detects more
redundant patterns when pattern matching on binary data. This release extends
this optimisation to work with int segments too, further increasing its
effectiveness!</p>
<pre><code><span class=hl-keyword>case</span> bits {
  &lt;&lt;<span class=hl-string>&quot;a&quot;</span>&gt;&gt; -&gt; <span class=hl-number>0</span>
  &lt;&lt;<span class=hl-number>97</span>&gt;&gt; -&gt; <span class=hl-number>1</span>
  <span class=hl-comment>// ^- This clause is unreachable because it&#39;s equal to &quot;a&quot;.</span>

  &lt;&lt;<span class=hl-number>0b1</span>:<span class=hl-number>1</span>, _:<span class=hl-number>1</span>&gt;&gt; -&gt; <span class=hl-number>2</span>
  &lt;&lt;<span class=hl-number>0b11</span>:<span class=hl-number>2</span>&gt;&gt; -&gt; <span class=hl-number>3</span>
  <span class=hl-comment>// ^- This clause is unreachable because of the previous</span>

  _ -&gt; <span class=hl-number>99</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/fruno-bulax/">fruno</a>!</p>
<h2 id="Number-normalisation-in-pattern-matching-analysis">Number normalisation in pattern matching analysis</h2>
<p>Numbers can be written in several different formats in Gleam. Most the time
they are written in decimal, but they could also be written in octal,
hexadecimal, or binary, or scientific notation could be used for floats.</p>
<p>Gleam&#39;s compiler now internally normalises these values to a single canonical
representation. This new representation is now used by the pattern matching
analysis engine, further enabling optimisations such as interference-based
pruning, making Gleam code faster and detecting more redundant clauses.</p>
<p>Thank you <a href="https://github.com/ptdewey">ptdewey</a>!</p>
<h2 id="More-precise-incorrect-subject-count-error-message">More precise incorrect subject count error message</h2>
<p>Gleam&#39;s <code>case</code> expression can be used to match on multiple values at the same
time. If two values are being matched on, then each clause will need two
patterns. If three are matched on then three patterns are needed. Etc.
Providing the wrong number of patterns will result in a compile error, and now
the error has been improved to show exactly where the problem is.</p>
<pre><code><span class=hl-keyword>case</span> wibble {
  <span class=hl-number>0</span>, _ -&gt; <span class=hl-number>1</span>
  ^^^^ <span class=hl-variant>Expected</span> <span class=hl-number>1</span> pattern, got <span class=hl-number>2</span>
  <span class=hl-number>0</span> |  -&gt; <span class=hl-number>1</span>
    ^ <span class=hl-variant>I</span> was expecting a pattern after this
}
</code></pre>
<p>Thank you <a href="https://github.com/fruno-bulax/">fruno</a>!</p>
<h2 id="Fault-tolerance">Fault tolerance</h2>
<p>Gleam&#39;s compiler implements <em>fault tolerant analysis</em>. This means that when
there is some error in the code the compiler can still continue to analyse the
code to the best of its ability, ignoring the invalid parts. Because of this,
the Gleam language server can have a good understanding of the code and provide
IDE features even when the codebase is in an invalid state.</p>
<p><a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> made type analysis of
constants fault tolerant. <a href="https://github.com/abs0luty">Adi Salimgereyev</a> made
the field definitions of custom type variants fault tolerant.
<a href="https://github.com/mxtthias">mxtthias</a> made bool pattern matching syntax
errors fault tolerant.</p>
<p>Thank you all!</p>
<h2 id="Faster-equality-testing">Faster equality testing</h2>
<p>The performance of <code>==</code> and <code>!=</code> has been improved for fieldless custom type
variants when compiling to JavaScript. This was done by generating comparison
code specific to the custom type rather than using the generic equality check
code. Thank you <a href="https://github.com/re-masashi">Nafi</a> for this improvement!</p>
<h2 id="Redundant-module-warnings">Redundant module warnings</h2>
<p>A Gleam module with no public types or functions can&#39;t do anything, so it&#39;s not
useful! The compiler now emits a warning when a module contains no public
definitions. The <code>gleam publish</code> command will also return an error for packages
with modules like these, prompting the programmer to remove the module.</p>
<p>Thanks to <a href="https://github.com/vit0rr">Vitor Souza</a>!</p>
<h2 id="Detached-documentation-warnings">Detached documentation warnings</h2>
<p>Gleam has <code>///</code> comments for writing documentation, with the comment being
placed immediately above the definition being documented. This syntax is
visually similar to the regular <code>//</code> comment, so occasionally a Gleam
programmer will accidentally place regular comments within documentation,
causing the first part of the documentation to be &quot;detatched&quot;, and not show up
in the rendered HTML documentation for that code.</p>
<pre><code><span class=hl-comment>/// This documentation is not attached.</span>
<span class=hl-comment>///</span>
<span class=hl-comment>// This is regular comment.</span>
<span class=hl-comment>///</span>
<span class=hl-comment>/// This is the attached documentation.</span>
<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>wibble</span>() {
  <span class=hl-keyword>todo</span>
}
</code></pre>
<p>The compiler now emits a warning when a documentation comment is not attached to a
definition due to a regular comment in between, helping to prevent this
mistake. Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Record-update-syntax-for-constants">Record update syntax for constants</h2>
<p>Gleam&#39;s record update syntax can now be used in constant definitions, enabling
constant records to be constructed from other constant records.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> base_http_config = <span class=hl-variant>HttpConfig</span>(
  host: <span class=hl-string>&quot;0.0.0.0&quot;</span>,
  port: <span class=hl-number>8080</span>,
  use_tls: <span class=hl-variant>False</span>,
  log_level: <span class=hl-variant>Info</span>,
)

<span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> dev_http_config = <span class=hl-variant>HttpConfig</span>(
  ..base_http_config,
  port: <span class=hl-number>4000</span>,
  log_level: <span class=hl-variant>Debug</span>,
)

<span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> prod_http_config = <span class=hl-variant>HttpConfig</span>(
  ..base_http_config,
  port: <span class=hl-number>80</span>,
  use_tls: <span class=hl-variant>True</span>,
  log_level: <span class=hl-variant>Warn</span>,
)
</code></pre>
<p>Thank you <a href="https://github.com/abs0luty">Adi Salimgereyev</a>!</p>
<h2 id="Latest-Elixir-support">Latest Elixir support</h2>
<p>Gleam&#39;s build tool can compile Gleam code, but also Erlang and Elixir code as
well. This is part of Gleam&#39;s commitment to being part of the wider BEAM
ecosystem, rather than an independent language that happens to use the same
virtual machine. Practically, this means that Gleam programs can add Erlang and
Elixir code or packages as dependencies, and not have to do additional work or
configuration to use that code.</p>
<p>This release updates to the latest Elixir compiler API, fixing some warnings
that would be emitted with previous versions of Gleam and the latest version of
Elixir. Thank you <a href="https://github.com/ankddev">Andrey Kozhev</a>!</p>
<h2 id="Outdated-dependencies-view">Outdated dependencies view</h2>
<p>It is important to take great care when using dependency packages: They can
save a lot of time, but all code added to a project has a maintenance cost and
security considerations.</p>
<p>To help with this task we have been providing more tools for working with
dependencies, the latest of which is the <code>gleam deps outdated</code> command. This
command makes it much easier to identify which packages have available updates
in the package repository.</p>
<pre><code>$ gleam deps outdated
Package  Current  Latest
-------  -------  ------
wibble   1.4.0    1.4.1
wobble   1.0.1    2.3.0
</code></pre>
<p>Thank you <a href="https://github.com/vshakitskiy">Vladislav Shakitskiy</a>!</p>
<h2 id="Helpful-git-not-installed-error-message">Helpful git-not-installed error message</h2>
<p>Dependency packages can be added from Git repositories as well as from the Hex
package repository. The <code>git</code> program must be installed to use Git
dependencies, and previously if it was not the build tool would fail with a
not-very-helpful error message when trying to download these dependencies.</p>
<p>With this version the error message has been improved, and includes a link to
instructions on how to install it.</p>
<pre><code><b><span class="code-error">error</span>: Program not found</b>

The program `git` was not found. Is it installed?

Documentation for installing Git can be viewed here:
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
</code></pre>
<p>Thank you <a href="https://github.com/ankddev">Andrey Kozhev</a>!</p>
<h2 id="Further-code-action-support">Further code action support</h2>
<p>The <code>gleam</code> binary also includes the Gleam language server, bringing IDE-like
functionality to all editors that support the language server protocol. Several
of the existing code actions (automated refactorings, etc) have been improved
so they can be triggered from more places, or so they support a wider range of
code.</p>
<p>The &quot;inline variable&quot; code action can now trigger when used over the <code>let</code>
keyword of a variable to inline, rather than just the variable name and the
usage of that variable.</p>
<p>The &quot;add omitted labels&quot; code action can now be used in function calls where
some of the labels have been provided already. This greatly increases how often
this code action is usable, a very impactful improvement!</p>
<p>The &quot;generate function&quot; code action can now trigger when used over constant
values, while previously it could only be used in expressions within module
functions. Gleam&#39;s type information analysis is used to contextually identify
when a referenced name is a function, and so when this code action is relevant.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> for these!</p>
<p>Qualify and unqualify code actions can now be triggered on constants, instead
of only on expressions within module functions. Thank you
<a href="https://github.com/vshakitskiy">Vladislav Shakitskiy</a>!</p>
<h2 id="Type-directed-autocompletion">Type directed autocompletion</h2>
<p>The Gleam language server provides autocompletion, sending a list of options
for the programmer to select from. The options are ordered based upon how
likely the programmer is to select each option, with the most likely candidates
being presented first. This ordering now takes type information into account,
with values that produce the correct type being ranked higher.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Missing-patterns-order-improvement">Missing patterns order improvement</h2>
<p>Gleam performs exhaustiveness checking of case expressions, reporting an error
if the patterns do not cover all the possible shapes of the data being matched
upon.</p>
<pre><code><b><span class="code-error">error</span>: Inexhaustive patterns</b>
<span class="code-decoration">   ┌─</span> /Users/louis/Desktop/app/src/app.gleam:10:3
<span class="code-decoration">   │</span>
<span class="code-decoration">10 │</span> <span class="code-error">╭   case person {</span>
<span class="code-decoration">11 │</span> <span class="code-error">│     Student(name:) -> name</span>
<span class="code-decoration">12 │</span> <span class="code-error">│   }</span>
<span class="code-decoration">   │</span> <span class="code-error">╰───^</span>

This case expression does not have a pattern for all possible values. If it
is run on one of the values without a pattern then it will crash.

The missing patterns are:

    Teacher(title:, name:)
    Visitor(name:)
</code></pre>
<p>The missing patterns in error messages and in the code generated by the &quot;add
missing patterns&quot; code action used to be ordered lexicographically, but now
they will be presented in definition order. This is more commonly the order
that the programmer wants, so they are less likely to need to re-order them in
their code.</p>
<p>Thank you <a href="https://github.com/fruno-bulax/">fruno</a>!</p>
<h2 id="Merge-case-branches-code-action">Merge case branches code action</h2>
<p>There is a new code action which can merge case clauses that have the same body.
For example:</p>
<pre><code><span class=hl-keyword>case</span> user {
  <span class=hl-variant>Admin</span>(name:, ..) -&gt; <span class=hl-keyword>todo</span>
<span class=hl-comment>//^^^^^^^^^^^^^^^^^^^^^^^^</span>
  <span class=hl-variant>Guest</span>(name:, ..) -&gt; <span class=hl-keyword>todo</span>
<span class=hl-comment>//^^^^^^^^^^^^^^^^ Selecting these two branches you can</span>
<span class=hl-comment>//                 trigger the &quot;Merge case branches&quot; code action</span>
  _ -&gt; <span class=hl-keyword>todo</span>
}
</code></pre>
<p>Triggering the code action would result in the following code:</p>
<pre><code><span class=hl-keyword>case</span> user {
  <span class=hl-variant>Admin</span>(name:, ..) | <span class=hl-variant>Guest</span>(name:, ..) -&gt; <span class=hl-keyword>todo</span>
  _ -&gt; <span class=hl-keyword>todo</span>
}
</code></pre>
<p>Little automated refactoring like these can make a big difference to the
experience of writing and editing Gleam code. Thank you
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Improved-name-selection-in-code-actions">Improved name selection in code actions</h2>
<p>Another useful code action found in the language server is &quot;generate function&quot;.
It is available when the code is calling an unknown function, and it will
generate the skeleton of a function with the correct name, arguments, and
types.</p>
<p>To name the argument the language server looks at how it is called, reusing the
name of any variables used, or the names of the types if the arguments given
are not variables. This name selection has been improved, and will also look at
the names of field labels when arguments are provided using the record access
syntax.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>User</span> {
  <span class=hl-variant>User</span>(id: <span class=hl-variant>Int</span>, name: <span class=hl-variant>String</span>)
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>go</span>(user: <span class=hl-variant>User</span>) -&gt; <span class=hl-variant>Session</span> {
  <span class=hl-function>authenticate</span>(user.id, user.name)
}
</code></pre>
<p>Having the language server generate the missing <code>authenticate</code> function will
produce the following code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>authenticate</span>(id: <span class=hl-variant>Int</span>, name: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>Session</span> {
  <span class=hl-keyword>todo</span>
}
</code></pre>
<p>A similar improvement has been made for the &quot;pattern match on variable&quot; code
action when used on tuples. Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Language-server-rename-failure-notification">Language server rename failure notification</h2>
<p>The Gleam language server supports the popular and extremely useful &quot;rename&quot;
action. Previously if you attempted to rename something to that would result in
a syntax error (e.g. putting a space in a function name) it would not perform
the renaming, but it wouldn&#39;t tell you why. With this release it will now send
a notification for the editor to display, letting the programmer know that it
is an invalid name.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Improved-language-server-diagnostic-grouping">Improved language server diagnostic grouping</h2>
<p>The language server protocol (LSP) is a common interface that lets IDE engines
(such as Gleam&#39;s language server) work with many different code editors.
It&#39;s brilliant in what it enables, but unfortunately the specification is vague
in some places, so different code editors interpret messages from the server in
different ways. This occasionally results in some editors having not-quite
providing the experience we intended when editing Gleam.</p>
<p>Recently we discovered that when we emit warnings or errors that point to
multiple places in the source code the Zed editor would treat the two locations
as independent, so the programmer would need to trigger &quot;go to next diagnostic&quot;
to go to the next error. We have now adjusted the design of our diagnostics,
bringing Zed inline with the behaviour of the other major editors.</p>
<p>Thank you <a href="https://github.com/fruno-bulax/">fruno</a>. Zedlings rejoice!</p>
<p>To be clear, we do not think that Zed was doing anything incorrect here. We
love Zed! From our understanding both behaviours are correct due to ambiguity
in the LSP specification.</p>
<h2 id="Annotate-all-top-level-definitions-code-action">Annotate all top level definitions code action</h2>
<p>Gleam has total and perfect type analysis, so it can tell the type of every
expression in a project, assuming there are no errors in the code that cause it
to fail to compile. Type annotations are optional, and while they don&#39;t help
the type analysis or make code &quot;more typed&quot;, it is considered good style to
annotate all module functions to help humans read the code.</p>
<p>The language server has for some time offered a code action for adding missing
annotations to a single definition, and now it has another for doing all
definitions at once.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> answer = <span class=hl-number>42</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>add</span>(x, y) {
  x <span class=hl-operator>+</span> y
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>add_one</span>(thing) {
  <span class=hl-keyword>let</span> result = <span class=hl-function>add</span>(thing, <span class=hl-number>1</span>)
  result
}
</code></pre>
<p>Triggering the &quot;Annotate all top level definitions&quot; code action on
the name of function <code>add_one</code> results in the following code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>const</span> answer: <span class=hl-variant>Int</span> = <span class=hl-number>42</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>add</span>(x: <span class=hl-variant>Int</span>, y: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Int</span> {
  x <span class=hl-operator>+</span> y
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>add_one</span>(thing: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Int</span> {
  <span class=hl-keyword>let</span> result = <span class=hl-function>add</span>(thing, <span class=hl-number>1</span>)
  result
}
</code></pre>
<p>This will be useful for folks who like to forego writing type annotations when
quickly writing new code, or exploring a new design. Thank you
<a href="https://github.com/ankddev">Andrey Kozhev</a>!</p>
<h2 id="Command-line-API-improvements">Command line API improvements</h2>
<p>Various ergonomic improvements have been made to the command line interface of
Gleam&#39;s build tool.</p>
<ul>
<li>
The help text displayed by <code>gleam dev --help</code>, <code>gleam test --help</code>, and
<code>gleam run --help</code> has been improved: now each one states which function it&#39;s
going to run. Thanks to <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>.
</li>
</ul>
<p>The <code>--invert</code> and <code>--package</code> options of <code>gleam deps tree</code> are now mutually
exclusive; if both options are given the command will fail. Previously,
<code>--invert</code> would be silently ignored if given together with <code>--package</code>.
Thanks to <a href="https://github.com/silby">Evan Silberman</a>.</p>
<p>The format used for <code>gleam deps list</code> and the notice of available major
version upgrades has been improved.</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:</p>
<p><a href="https://github.com/abs0luty">Adi Salimgereyev</a>,
<a href="https://github.com/EliasDerHai">Elias Haider</a>,
<a href="https://github.com/fruno-bulax">fruno</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/baraich">Gurvir Singh</a>,
<a href="https://github.com/ioanclarke">Ioan Clarke</a>,
<a href="https://github.com/lpil">Louis Pilfold</a>,
<a href="https://github.com/matiascr">Matias Carlander</a>,
<a href="https://github.com/ptdewey">Patrick Dewey</a>,
<a href="https://github.com/richard-viney">Richard Viney</a>, and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>.</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.14.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
<a href="https://gleam.run/sponsor/">supporting the project</a> however you can.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/gleam-lang" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And special thanks to our top sponsors:</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
  <li>
    <a class="sponsor-level2" href="https://williamsandholmes.com" rel="noopener" target="_blank">
      <img alt="Williams &amp; Holmes" src="/images/sponsors/williamsandholmes.svg">
    </a>
  </li>
  <li>
    <a class="sponsor-level2" href="https://black-hammer.consulting/" rel="noopener" target="_blank">
      <img alt="Black Hammer Consulting" src="/images/sponsors/black-hammer.svg">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/Aboio-Labs">Aboio</a>
</li>
<li>
<a href="https://github.com/abs0luty">abs0luty</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adam12">Adam Daniels</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/Dajamante">Aïssata Maïga</a>
</li>
<li>
<a href="https://github.com/hashemi">Ahmad Alhashemi</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/selenil">Akín Berges</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/adkelley">Alex Kelley</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/ankddev">Andrey</a>
</li>
<li>
<a href="https://github.com/andremw">André Mazoni</a>
</li>
<li>
<a href="https://github.com/ayoung19">Andy Young</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/afarinetti">Antonio Farinetti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/domalaq">Baqtiar</a>
</li>
<li>
<a href="https://github.com/baraich">Baraich</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/Billuc">Billuc</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/bo0tzz">bo0tzz</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettcannon">Brett Cannon</a>
</li>
<li>
<a href="https://github.com/brettkolodny">Brett Kolodny</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/brunoskonrad">Bruno Konrad</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/Lhris">Chris Lee</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/chrisolsen">Chris Olsen</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/cvincent">Chris Vincent</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/comet-ml">Comet</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/cmnstmntmn">Constantin Angheloiu</a>
</li>
<li>
<a href="https://github.com/contra1337">contra1337</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/uberguy">Cris Holm</a>
</li>
<li>
<a href="https://github.com/dagi3d">dagi3d</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/d2718">Dan</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/Giesch">Dan Gieschen Knutson</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/dpen2000">David Pendray</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/EdRW">Ed Rosewright</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://github.com/EliasDerHai">Elias</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/erodrigufer">erodrigufer</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/silby">Evan Silberman</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fpauser">Falk Pauser</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/fruno-bulax">fruno</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/allenap">Gavin Panella</a>
</li>
<li>
<a href="https://github.com/GearsDatapacks">Gears</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">graphiteisaac</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/seafoamteal">Hari Mohan</a>
</li>
<li>
<a href="https://github.com/hazel-ocean">Hazel</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://liberapay.com/Hizuru3/">Hizuru3</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/idea-list">idea-list</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/ioanclarke">ioan.clarke</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/iskrisis">iskrisis</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jachin">Jachin Rupe</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/badumbatish">Jasmine Tang</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/jihem">Jean-Marc QUERE</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jisungbin">Ji Sungbin (Forky)</a>
</li>
<li>
<a href="https://github.com/jimutt">Jimmy Utterström</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jmcharter">Jon Charter</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasGruenwald">Jonas Grünwald</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/maennchen">Jonatan Männchen</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/BigJayToDaIzo">Joseph Myers</a>
</li>
<li>
<a href="https://github.com/JosephTLyons">Joseph T. Lyons</a>
</li>
<li>
<a href="https://github.com/joshgillies">Josh Gillies</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jorg1piano">Jørgen Andersen</a>
</li>
<li>
<a href="https://github.com/Kamila-P">KamilaP</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/krig">Kristoffer Grönlund</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/km-tr">Kuma Taro</a>
</li>
<li>
<a href="https://github.com/jly36963">Landon</a>
</li>
<li>
<a href="https://github.com/leah-u">Leah Ulmschneider</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/rcoder">Lennon Day-Reynolds</a>
</li>
<li>
<a href="https://github.com/leostera">Leo Ostera</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/Matvey1109">m.m.kosyakov</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/mvellandi">Mario Vellandi</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/mkdynamic">Mark Dodwell</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/alterationx10">Mark Rudolph</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/matiascr">matiascr</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/mxtthias">Matthias Nilsson</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/mtlynch">Michael Lynch</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/tymak">Michal Timko</a>
</li>
<li>
<a href="https://github.com/michel-slm">Michel Lind</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/ngscheurich">N. G. Scheurich</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/re-masashi">Nafi</a>
</li>
<li>
<a href="https://github.com/nataliethistime">Natalie Rose</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/Willyboar">Nikolas</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/NNBnh">NNB</a>
</li>
<li>
<a href="https://github.com/Nezteb">Noah Betzen</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/nunulk">nunulk</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/nnuuvv">ollie</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/dillon-0">orge-dev</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/tamectosphere">Pattadon Sa-ngasri</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/ptdewey">ptdewey</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatillas">renatillas</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/robertDurst">rob durst</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://github.com/genericrohan">Rohan</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/Eosis">Rupert Rutledge</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/rclarey">Russell Clarey</a>
</li>
<li>
<a href="https://github.com/sbergen">Sakari Bergen</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/scristobal">Samu</a>
</li>
<li>
<a href="https://github.com/different-error">Sanfer</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/Sgregory42">Sgregory42</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/shawndrape">Shawn Drape</a>
</li>
<li>
<a href="https://github.com/shritesh">Shritesh Bhattarai</a>
</li>
<li>
<a href="https://github.com/shxdow">shxdow</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/stephanerangaya">Stephane Rangaya</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/stndrs">stndrs</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/trescenzi">Thomas Crescenzi</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/betabrain">Tobias Ammann</a>
</li>
<li>
<a href="https://github.com/tomalexhughes">Tom Hughes</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/tudorluca">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/bondiano">Vassiliy Kuzenkov</a>
</li>
<li>
<a href="https://github.com/vitorsouzaalmeida">vitor</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/vpribish">vpribish</a>
</li>
<li>
<a href="https://github.com/vshakitskiy">vshakitskiy</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/willramirezdev">Will Ramirez</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/wundersmiths">Wundersmiths</a>
</li>
<li>
<a href="https://github.com/Xetera">Xetera</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">Yoshi Reusch</a>
</li>
<li>
<a href="https://github.com/zenconomist">Zsolt Kreisz</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
<li>
<a href="https://github.com/raquentin">Костя</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Formalising external APIs</title><id>https://gleam.run/news/formalising-external-apis</id><updated>2025-10-19T00:00:00Z</updated><published>2025-10-19T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/formalising-external-apis" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type-safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.13.0">v1.13.0</a> has been published. Let&#39;s
go over all the highlights now.</p>
<h2 id="External-API-for-Gleam-data">External API for Gleam data</h2>
<p>One of Gleam&#39;s strengths is that it is part of the BEAM and JavaScript
ecosystems, enabling Gleam programs to take advantage of code written in
Erlang, Elixir, JavaScript, and more. This is a large part of how Gleam was
able to become a practical production-ready language so quickly, by not
restricting Gleam programmers to just the comparatively young Gleam package
ecosystem.</p>
<p>A function written in one of these other languages can be imported into a Gleam
module as an &quot;external function&quot;, and then called without any additional
performance overhead.</p>
<pre><code><span class=hl-keyword>@external</span>(erlang, <span class=hl-string>&quot;moon_base&quot;</span>, <span class=hl-string>&quot;launch_spaceship&quot;</span>)
<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>lift_off</span>(countdown: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Result</span>(<span class=hl-variant>Spaceship</span>, <span class=hl-variant>LaunchError</span>)
</code></pre>
<p>Here the Erlang function <code>launch_spaceship</code> from the module <code>moon_base</code> is
being imported.</p>
<p>One restriction to external functions is that they will need to return data
types that Gleam can understand. Gleam&#39;s &quot;external type&quot; feature lets the
programmer refer to types defined in other languages, but if the programmer
wants to be able to directly construct and pattern match data from external
functions it will need to be in a format compatible with Gleam data types.</p>
<p>Often a programmer will write a small wrapper function in the external language
to convert the data, and also to make the interface adhere to Gleam patterns
and conventions.</p>
<pre><code><span class=hl-operator>-</span><span class=hl-function>module</span><span class=hl-punctuation>(</span><span class=hl-atom>moon_base</span><span class=hl-punctuation>)</span><span class=hl-punctuation>.</span>
<span class=hl-operator>-</span><span class=hl-function>export</span><span class=hl-punctuation>(</span><span class=hl-punctuation>[</span><span class=hl-function>launch_spaceship</span><span class=hl-punctuation>/</span><span class=hl-number>1</span><span class=hl-punctuation>]</span><span class=hl-punctuation>)</span><span class=hl-punctuation>.</span>

<span class=hl-function>launch_spaceship</span><span class=hl-punctuation>(</span><span class=hl-variable>Countdown</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span>
    <span class=hl-keyword>try</span>
        <span class=hl-variable>Spaceship</span> <span class=hl-operator>=</span> <span class=hl-module>launch_control</span><span class=hl-punctuation>:</span><span class=hl-function>launch_spaceship</span><span class=hl-punctuation>(</span><span class=hl-variable>Countdown</span><span class=hl-punctuation>)</span><span class=hl-punctuation>,</span>
        <span class=hl-punctuation>{</span><span class=hl-atom>ok</span><span class=hl-punctuation>,</span> <span class=hl-variable>Spaceship</span><span class=hl-punctuation>}</span>
    <span class=hl-keyword>catch</span>
        <span class=hl-module>error</span><span class=hl-punctuation>:</span><span class=hl-function>no_fuel</span> <span class=hl-punctuation>-&gt;</span> <span class=hl-punctuation>{</span><span class=hl-atom>error</span><span class=hl-punctuation>,</span> <span class=hl-atom>no_fuel</span><span class=hl-punctuation>}</span><span class=hl-punctuation>;</span>
        <span class=hl-module>error</span><span class=hl-punctuation>:</span><span class=hl-function>bad_weather</span> <span class=hl-punctuation>-&gt;</span> <span class=hl-punctuation>{</span><span class=hl-atom>error</span><span class=hl-punctuation>,</span> <span class=hl-atom>bad_weather</span><span class=hl-punctuation>}</span>
    <span class=hl-keyword>end</span><span class=hl-punctuation>.</span>
</code></pre>
<p>This <code>launch_spaceship</code> Erlang function wraps the function from the
<code>launch_control</code> module, converting the exception-based API into a <code>Result</code>
type, the Erlang representation of Gleam&#39;s <code>Ok</code> and <code>Error</code> variants.</p>
<p>One thing that a Gleam programmer may find challenging is knowing how to
construct Gleam data in these wrapper functions. A lack of detailed
documentation made it unclear what the correct approach should be.</p>
<p>This lack of clarity makes learning how to use external code more challenging,
and worse, it may result in programmers using internal APIs that are intended
only to be used by the compiled Gleam code. If the Gleam ecosystem were to grow
with many packages using these internal APIs, it would force the Gleam core team
to support them as if they were public APIs. Committing to these APIs would
greatly limit what changes we can make to the internal representation of Gleam
data, and make many potential performance improvements impossible.</p>
<p>To fix this we have done two things. First, we have created
<a href="/documentation/externals/">a guide on Gleam externals</a>, detailing how to
correctly write and use externals.</p>
<p>Secondly, a dedicated API is now provided for JavaScript-based code to work with
Gleam data, both making usage clearer and giving the Gleam core team maximum
freedom to improve performance in future. Each data type defined in Gleam will
have a set of functions defined to work with it, for example:</p>
<pre><code><span class=hl-comment>// In src/person.gleam</span>
<span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Person</span> {
  <span class=hl-variant>Teacher</span>(name: <span class=hl-variant>String</span>, subject: <span class=hl-variant>String</span>)
  <span class=hl-variant>Student</span>(name: <span class=hl-variant>String</span>)
}
</code></pre>
<pre><code><span class=hl-comment>// In src/my_javascript_code.mjs</span>
<span class=hl-keyword>import</span> <span class=hl-punctuation>{</span><span class=hl-punctuation>...</span><span class=hl-punctuation>}</span> <span class=hl-keyword>from</span> <span class=hl-string>&quot;./person.mjs&quot;</span><span class=hl-punctuation>;</span>

<span class=hl-comment>// Constructing custom types</span>
<span class=hl-keyword>let</span> <span class=hl-variable>teacher</span> <span class=hl-operator>=</span> <span class=hl-function>Person$Teacher</span><span class=hl-punctuation>(</span><span class=hl-string>&quot;Joe Armstrong&quot;</span><span class=hl-punctuation>,</span> <span class=hl-string>&quot;Computer Science&quot;</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>
<span class=hl-keyword>let</span> <span class=hl-variable>student</span> <span class=hl-operator>=</span> <span class=hl-function>Person$Student</span><span class=hl-punctuation>(</span><span class=hl-string>&quot;Louis Pilfold&quot;</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>

<span class=hl-keyword>let</span> <span class=hl-variable>randomPerson</span> <span class=hl-operator>=</span> <span class=hl-variable>Math</span><span class=hl-punctuation>.</span><span class=hl-function>random</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span> <span class=hl-operator>&gt;</span> <span class=hl-number>0.5</span> <span class=hl-operator>?</span> <span class=hl-variable>teacher</span> <span class=hl-punctuation>:</span> <span class=hl-variable>student</span><span class=hl-punctuation>;</span>

<span class=hl-comment>// Checking variants</span>
<span class=hl-keyword>let</span> <span class=hl-variable>randomIsTeacher</span> <span class=hl-operator>=</span> <span class=hl-function>Person$isTeacher</span><span class=hl-punctuation>(</span><span class=hl-variable>randomPerson</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>

<span class=hl-comment>// Getting fields</span>
<span class=hl-keyword>let</span> <span class=hl-variable>teacherSubject</span> <span class=hl-operator>=</span> <span class=hl-function>Person$Teacher$subject</span><span class=hl-punctuation>(</span><span class=hl-variable>teacher</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>

<span class=hl-comment>// The `name` field is shared so can be accessed from either variant</span>
<span class=hl-keyword>let</span> <span class=hl-variable>personName</span> <span class=hl-operator>=</span> <span class=hl-function>Person$name</span><span class=hl-punctuation>(</span><span class=hl-variable>randomPerson</span><span class=hl-punctuation>)</span><span class=hl-punctuation>;</span>
</code></pre>
<p>There will be a migration period where existing JavaScript externals will need
to migrate over to the new API. We have created tooling to analyse the Gleam
package ecosystem to identify code that is in need of updating, and we will be
helping with this process.</p>
<p>Further additions will be made to the externals guide detailing useful
patterns, how to avoid common problems, and advising when and how to use
externals.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a> for taking the lead
role in implementing these new APIs, and for the Gleam team more widely for the
design of this addition!</p>
<h2 id="Improved-bit-array-exhaustiveness-checking">Improved bit array exhaustiveness checking</h2>
<p>Gleam&#39;s bit array syntax allows you to declaratively construct and parse binary
data in a way that may be easier to understand than using binary operators.</p>
<p>The compiler now applies an optimisation known as &quot;interference based pruning&quot;
when compiling bit array pattern matching where matches are performed at the
start of bit arrays. This optimisation drastically reduces compile times,
memory usage and the compiled code size, removing many redundant checks.</p>
<p>It is particularly impactful for programs that pattern match on some fixed
patterns at the start of the bit array. For example, network protocol
parsers.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>parse_headers</span>(headers: <span class=hl-variant>BitArray</span>, bytes: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Headers</span> {
  <span class=hl-keyword>case</span> headers {
    &lt;&lt;<span class=hl-string>&quot;CONTENT_LENGTH&quot;</span> <span class=hl-keyword>as</span> header, <span class=hl-number>0</span>, value:<span class=hl-function>size</span>(bytes), <span class=hl-number>0</span>, rest:bytes&gt;&gt;
    | &lt;&lt;<span class=hl-string>&quot;QUERY_STRING&quot;</span> <span class=hl-keyword>as</span> header, <span class=hl-number>0</span>, value:<span class=hl-function>size</span>(bytes), <span class=hl-number>0</span>, rest:bytes&gt;&gt;
    | &lt;&lt;<span class=hl-string>&quot;REQUEST_URI&quot;</span> <span class=hl-keyword>as</span> header, <span class=hl-number>0</span>, value:<span class=hl-function>size</span>(bytes), <span class=hl-number>0</span>, rest:bytes&gt;&gt;
    <span class=hl-comment>// ...</span>
    | &lt;&lt;<span class=hl-string>&quot;REDIRECT_STATUS&quot;</span> <span class=hl-keyword>as</span> header, <span class=hl-number>0</span>, value:<span class=hl-function>size</span>(bytes), <span class=hl-number>0</span>, rest:bytes&gt;&gt;
    | &lt;&lt;<span class=hl-string>&quot;SCRIPT_NAME&quot;</span> <span class=hl-keyword>as</span> header, <span class=hl-number>0</span>, value:<span class=hl-function>size</span>(bytes), <span class=hl-number>0</span>, rest:bytes&gt;&gt;
      -&gt; [#(header, value), ..<span class=hl-function>parse_headers</span>(rest)]
  }
}
</code></pre>
<p>Additionally, the compiler now raises a warning for unreachable branches that
are matching on bit array segments that could never match. Consider this
example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>get_payload</span>(packet: <span class=hl-variant>BitArray</span>) -&gt; <span class=hl-variant>Result</span>(<span class=hl-variant>BitArray</span>, <span class=hl-variant>Nil</span>) {
  <span class=hl-keyword>case</span> packet {
    &lt;&lt;<span class=hl-number>200</span>, payload:bytes&gt;&gt; -&gt; <span class=hl-variant>Ok</span>(payload)
    &lt;&lt;<span class=hl-number>404</span>, _:bits&gt;&gt; -&gt; <span class=hl-variant>Error</span>(<span class=hl-variant>Nil</span>)
    _ -&gt; <span class=hl-variant>Ok</span>(packet)
  }
}
</code></pre>
<p>There&#39;s a subtle bug here. The second branch can never match since it&#39;s
impossible for the first byte of the bit array to have the value <code>404</code>.
The new error explains this nicely:</p>
<pre><code><b><span class="code-warning">warning</span>: Unreachable pattern</b>
<span class="code-decoration">  ┌─</span> /src.gleam:4:5
<span class="code-decoration">  │</span>
<span class="code-decoration">4 │</span>     <span class="code-warning">&lt;&lt;404, _:bits&gt;&gt;</span> -&gt; Error(Nil)
<span class="code-decoration">  │</span>     <span class="code-warning">^^^^^^^^^^^^^^^</span>
<span class="code-decoration">  │</span>       <span class="code-warning">│</span>
<span class="code-decoration">  │</span>       <span class="code-warning">A 1 byte unsigned integer will never match this value</span>

This pattern cannot be reached as it contains segments that will never
match.

Hint: It can be safely removed.
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> for these
improvements! Exhaustiveness checking is a very complex field, so these
additions are very impressive.</p>
<h2 id="Unused-argument-detection">Unused argument detection</h2>
<p>Gleam&#39;s unused code detection and purity tracking emits a warning any time some
code is unused and could be removed without changing the behaviour of the
program.</p>
<p>This has been extended to be able to identify function arguments that are used
when the function calls itself recursively, but never actually used in the
function&#39;s implementation. For example:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/io</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>greet</span>(x, times) {
  <span class=hl-keyword>case</span> times {
    <span class=hl-number>0</span> -&gt; <span class=hl-variant>Nil</span>
    _ -&gt; {
      <span class=hl-module>io</span>.<span class=hl-function>println</span>(<span class=hl-string>&quot;Hello, Joe!&quot;</span>)
      <span class=hl-function>greet</span>(x, times <span class=hl-operator>-</span> <span class=hl-number>1</span>)
    }
  }
}
</code></pre>
<p>In this piece of code the <code>x</code> argument is unused, so the compiler will raise
the following warning:</p>
<pre><code><b><span class="code-warning">warning</span>: Unused function argument</b>
<span class="code-decoration">  ┌─</span> /Users/giacomocavalieri/Desktop/prova/src/prova.gleam:3:14
<span class="code-decoration">  │</span>
<span class="code-decoration">3 │</span> pub fn greet(<span class="code-warning">x</span>, times) {
<span class="code-decoration">  │</span>              <span class="code-warning">^ This argument is unused</span>

This argument is passed to the function when recursing, but it's never
used for anything.
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Better-meaningless-opaque-type-error">Better meaningless opaque type error</h2>
<p>A public custom type can be marked as &quot;opaque&quot;, meaning that while other
modules can import and reference the type, they are unable to construct or
pattern match on values of that type. This is useful for restricting the ways
that a data type can be used in order to provide a more robust API.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>opaque</span> <span class=hl-keyword>type</span> <span class=hl-variant>Permission</span> {
  <span class=hl-variant>SuperUser</span>
  <span class=hl-variant>Regular</span>
  <span class=hl-variant>Restricted</span>
}
</code></pre>
<p>It is invalid to mark a private type as opaque. Previously this would result in
a slightly cryptic syntax, but now a specific helpful error has been added for
this case.</p>
<pre><code><b><span class="code-error">error</span>: Private opaque type</b>
<span class="code-decoration">  ┌─</span> /src/one/two.gleam:2:1
<span class="code-decoration">  │</span>
<span class="code-decoration">2 │</span> <span class="code-error">opaque</span> type Wibble {
<span class="code-decoration">  │</span> <span class="code-error">^^^^^^ You can safely remove this.</span>

Only a public type can be opaque.
</code></pre>
<p>The language server now also offers a &quot;quick fix&quot; code action to remove
<code>opaque</code> from a private type:</p>
<pre><code><span class=hl-keyword>opaque</span> <span class=hl-keyword>type</span> <span class=hl-variant>Wibble</span> {
<span class=hl-comment>// ^^^ This is an error!</span>
  <span class=hl-variant>Wobble</span>
}
</code></pre>
<p>If you hover over the type and trigger the quick fix, the language server will
automatically remove the <code>opaque</code> keyword:</p>
<pre><code><span class=hl-keyword>type</span> <span class=hl-variant>Wibble</span> {
  <span class=hl-variant>Wobble</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="More-fault-tolerance">More fault tolerance</h2>
<p>Gleam&#39;s compiler implements <em>fault tolerant analysis</em>. This means that when
there is some error in the code the compiler can still continue to analyse the
code to the best of its ability, ignoring the invalid parts. Because of this,
the Gleam language server can have a good understanding of the code and provide
IDE features even when the codebase is in an invalid state.</p>
<p><a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sobolevn">sobolevn</a> have improved the compiler to be fault
tolerant for errors relating to analysis of labeled fields in variant patterns,
parsing of private opaque type definitions, and parsing of type names followed
by <code>()</code>, further improving the experience of using the Gleam language server.</p>
<p>Thank you both!</p>
<h2 id="Redundant-pattern-alias-warning">Redundant pattern alias warning</h2>
<p><code>_ as x</code> is a valid pattern in Gleam. The <code>_</code> means &quot;don&#39;t assign any name to
this value&quot;, and the <code>as x</code> part means &quot;assign the name <code>x</code> to this value&quot;.</p>
<p>As you can see, this is quite a silly pattern. The alias <code>as</code> pattern makes the
discard <code>_</code> pattern redundant, and it would always be better to use
the pattern <code>x</code>, which means &quot;assign this value to the name x&quot;.</p>
<pre><code><span class=hl-comment>// Redundant</span>
<span class=hl-keyword>let</span> _ <span class=hl-keyword>as</span> x = <span class=hl-function>something</span>()

<span class=hl-comment>// Recommended</span>
<span class=hl-keyword>let</span> x = <span class=hl-function>something</span>()
</code></pre>
<p>Using an alias pattern with a discard pattern has been deprecated, and the
Gleam code formatter will rewrite any instances of it to the recommended syntax.</p>
<p>Thank you <a href="https://github.com/eutampieri">eutampieri</a> for this!</p>
<h2 id="More-warnings-for-inefficient-list-use">More warnings for inefficient list use</h2>
<p>Gleam&#39;s basic sequence type is an immutable linked list with structural
sharing, a data type inherited from Erlang and one common in functional
programming languages.</p>
<p>The correct way to check if a list is empty is to pattern match on it with the
empty-list pattern, or to compare it to an empty list literal.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>both_empty</span>(list1: <span class=hl-variant>List</span>(a), list2: <span class=hl-variant>List</span>(b)) -&gt; <span class=hl-variant>Bool</span> {
  <span class=hl-comment>// Pattern matching approach.</span>
  <span class=hl-comment>// More verbose, but can be part of a larger pattern match.</span>
  <span class=hl-keyword>let</span> list1_empty = <span class=hl-keyword>case</span> list1 {
    [] -&gt; <span class=hl-variant>True</span>
    _ -&gt; <span class=hl-variant>False</span>
  }

  <span class=hl-comment>// Comparison approach.</span>
  <span class=hl-keyword>let</span> list2_empty = list2 <span class=hl-operator>==</span> []

  list1_empty <span class=hl-operator>&amp;&amp;</span> list2_empty
}
</code></pre>
<p>The standard library&#39;s <code>list.length</code> function returns the length of a given
list. Gleam and Erlang lists don&#39;t store the length on them as a static
property, so this function has to traverse the full list, and count the number
of elements, making it a very wasteful way to determine if a list is empty.</p>
<p>This behaviour may be surprising to programmers familiar with languages with a
different core sequence data type, so they might not realise this is not a good
way to check for an empty list. To remove this confusion the compiler would
emit a warning for code like <code>list.length(items) == 0</code>, informing the
programmer of better alternatives.</p>
<p>With this release the warning will also be emitted for more inefficient use of
<code>list.length</code>, including checks for non-empty lists using operators like <code>&gt;</code>
and <code>&lt;</code>.</p>
<pre><code><b><span class="code-warning">warning</span>: Inefficient use of <code>`list.length`</code></b>
<span class="code-decoration">  ┌─</span> /data/data/com.termux/files/home/test_gleam/src/test_gleam.gleam:5:13
<span class="code-decoration">  │</span>
<span class="code-decoration">5 │</span>     let _ = <span class="code-warning">0 &lt; list.length(numbers)</span>
<span class="code-decoration">  │</span>             <span class="code-warning">^^^^^^^^^^^^^^^^^^^^^^^</span>

The <code>`list.length`</code> function has to iterate across the whole
list to calculate the length, which is wasteful if you only
need to know if the list is empty or not.

Hint: You can use <code>`the_list != []`</code> instead.
</code></pre>
<p>Thank you <a href="https://github.com/ankddev">Andrey Kozhev</a>!</p>
<h2 id="A-helpful-syntax-error-for-JavaScripters">A helpful syntax error for JavaScripters</h2>
<p>In Gleam names are assigned to values within functions using the <code>let</code> keyword.
There is a <code>const</code> keyword too, but it is used to declare module-level
constants, and it is a syntax error to use it within functions.</p>
<p>The compiler now provides a helpful error message for any programmers
accustomed to languages where <code>const</code> is used within functions, such as
JavaScript.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>deep_thought</span>() -&gt; <span class=hl-variant>Int</span> {
  <span class=hl-keyword>const</span> the_answer = <span class=hl-number>42</span>
  the_answer
}
</code></pre>
<pre><code><b><span class="code-error">error</span>: Syntax error</b>
<span class="code-decoration">  ┌─</span> /src/file.gleam:2:3
<span class="code-decoration">  │</span>
<span class="code-decoration">3 │</span>   <span class="code-error">const</span> the_answer = 43
<span class="code-decoration">  │</span>   <span class="code-error">^^^^^ Constants are not allowed inside functions</span>

All variables are immutable in Gleam, so constants inside functions are not
necessary.
Hint: Either move this into the global scope or use <code>`let`</code> binding instead.
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="A-helpful-error-for-Rustaceans-Cers-and-friends">A helpful error for Rustaceans, C#ers, and friends</h2>
<p>Gleam has a consistent syntax for constructors at the type and value level,
using <code>()</code> for both. It does not use <code>()</code> for value constructors and <code>&lt;&gt;</code> for
type constructors, as is common in some other languages.</p>
<p>To help folks coming from other languages a set of helpful errors have been
added for when they try to use this non-Gleam syntax in their Gleam code.</p>
<pre><code><b><span class="code-error">error</span>: Syntax error</b>
<span class="code-decoration">  ┌─</span> /src/parse/error.gleam:2:12
<span class="code-decoration">  │</span>
<span class="code-decoration">2 │</span> type Either&lt;a, b&gt; {
<span class="code-decoration">  │</span>            <span class="code-error">^ I was expecting `(` here.</span>

Type parameters use lowercase names and are surrounded by parentheses.

    type Either(a, b) {

See: <a href="https://tour.gleam.run/data-types/generic-custom-types/">https://tour.gleam.run/data-types/generic-custom-types/</a>
</code></pre>
<p>Notice how the error message includes the correct syntax for the specific code
that the programmer has written. The programmer could copy/paste the correct
version into their code, if they so desired. A link to the documentation is
also provided, linking to whichever feature the syntax error is for.</p>
<p>Thank you <a href="https://github.com/AaronC81">Aaron Christiansen</a>!</p>
<h2 id="A-helpful-syntax-error-for-Pythonistas-Elixirists-and-friends">A helpful syntax error for Pythonistas, Elixirists, and friends</h2>
<p>Similar to the last two new error messages, there&#39;s now a helpful error message
for programmers trying to use <code>#</code> instead of <code>//</code> to write a comment. Thank you
<a href="https://github.com/sobolevn">sobolevn</a>!</p>
<h2 id="Displaying-dependency-version-information">Displaying dependency version information</h2>
<p>Gleam&#39;s build tool integrates with Hex, the package management system and
primary package repository for the BEAM ecosystem. Gleam implements dependency
version locking to ensure that builds are deterministic, and to prevent
unaudited code from unexpectedly becoming part of your application. Dependency
code is just as much of a risk and responsibility as code directly written by
the programmer, so it must be treated with great care and consideration.</p>
<p>The only time the build tool will select new versions of dependency packages is
if the programmer adds or removes a dependency, if the programmer changes the
package&#39;s dependency version requirements, or if the programmer requests the
dependency versions be upgraded using the <code>gleam update</code> command.</p>
<p>In these cases when dependencies are changed, added, or removed the build tool
will now print the changes, to help the programmer understand and go on to
audit the new code.</p>
<pre><code><span class="code-comment">$ gleam add lustre</span>
<span class="code-operator">  Resolving</span> versions
<span class="code-operator">Downloading</span> packages
<span class="code-operator"> Downloaded</span> 3 packages in 0.04s
<span class="code-operator">      Added</span> gleam_json v3.0.2
<span class="code-operator">      Added</span> houdini v1.2.0
<span class="code-operator">      Added</span> lustre v5.3.5
</code></pre>
<h2 id="hex-owner-transfer"><code>hex owner transfer</code></h2>
<p>The <code>hex owner transfer</code> command has been added to the build tool, allowing
Gleam programmers to transfer ownership of existing Hex packages to another
account. Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Improved-type-displaying">Improved type displaying</h2>
<p>When a Gleam package is published to Hex HTML documentation is generated and
published to the HexDocs documentation hosting website. This documentation has
now been improved to now print the names of public type aliases instead of
internal type names when annotating functions and types. This makes the
documentation more likely to use the APIs that the package author intends for
their users.</p>
<p>For example, for the following code:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>my_package/internal</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>ExternalAlias</span> = internal.<span class=hl-variant>InternalRepresentation</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>do_thing</span>() -&gt; <span class=hl-variant>ExternalAlias</span> { ... }
</code></pre>
<p>This is what the build tool used to generate:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>do_thing</span>() -&gt; <span class=hl-keyword>@internal</span> <span class=hl-variant>InternalRepresentation</span>
</code></pre>
<p>This is technically correct, but not very useful for the reader of the
documentation, as they cannot learn anything about these internal types.
Now it will not use the internal name, allowing the programmer to click-through
to its documentation, and understand how they should refer to this type in
their code.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>do_thing</span>() -&gt; <span class=hl-variant>ExternalAlias</span>
</code></pre>
<p>This improvement also applies to the language server, both in information
displayed on hover, and in code actions such as &quot;add annotations&quot;.</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>lustre/html</span>
<span class=hl-keyword>import</span> <span class=hl-module>lustre/element</span>
<span class=hl-keyword>import</span> <span class=hl-module>lustre/attribute</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>make_link</span>(attribute, element) {
  <span class=hl-module>html</span>.<span class=hl-function>a</span>([attribute], [element])
}
</code></pre>
<p>If the &quot;add annotations&quot; code action is run on this function the language
server will identify that the imported <code>lustre/attribute</code> module has public
export of the <code>Attribute</code> type, and that the imported <code>lustre/element</code> module
has public export of the <code>Element</code> type, so they will both be used instead of
the internal definition.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>make_link</span>(
  attribute: attribute.<span class=hl-variant>Attribute</span>,
  element: element.<span class=hl-variant>Element</span>(a)
) -&gt; element.<span class=hl-variant>Element</span>(a) {
   <span class=hl-module>html</span>.<span class=hl-function>a</span>([attribute], [element])
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Improved-type-naming-in-code-actions">Improved type naming in code actions</h2>
<p>Another way in which code actions need to consider type names is with type
parameters. The &quot;add type annotations&quot; and &quot;generate function&quot; code actions
must find names for any type variables that do not clash with any already in
use. Previously the language server would track names in-use at the module
level which could result in correct but unexpected names being used.</p>
<p>Take this code, for example.</p>
<pre><code><span class=hl-keyword>fn</span> <span class=hl-function>something</span>(a: a, b: b, c: c) -&gt; d { <span class=hl-keyword>todo</span> }

<span class=hl-keyword>fn</span> <span class=hl-function>pair</span>(a, b) { #(a, b) }
</code></pre>
<p>Previously, when triggering the &quot;Add type annotations&quot; code action on the
<code>pair</code> function, the language server would have used these names:</p>
<pre><code><span class=hl-keyword>fn</span> <span class=hl-function>pair</span>(a: e, b: f) -&gt; #(e, f) { #(a, b) }
</code></pre>
<p>However in 1.13, it will now use these names:</p>
<pre><code><span class=hl-keyword>fn</span> <span class=hl-function>pair</span>(a: a, b: b) -&gt; #(a, b) { #(a, b) }
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Tangled-support">Tangled support</h2>
<p><a href="https://tangled.org/">Tangled</a> is a new open source source forge, and the Gleam
build tool now has support for it. When specified the HTML documentation will
include links to the source code definitions for each type and value in the
package, as it would for previously supported source forges such as GitHub and
Forgejo.</p>
<pre><code><span class=hl-function>repository </span>= { type = "tangled", user = "me", repo = "my_project" }
</code></pre>
<p>Thank you to <a href="https://github.com/naomieow">Naomi Roberts</a> for this. As part of
this work she added support for links to multi-line sections of code in Tangled
itself!</p>
<h2 id="Further-language-server-support">Further language server support</h2>
<p>The language server was missing support for a few syntaxes, this has now been
fixed. You can now go to definition, rename, etc. from alternative patterns in
case expressions:</p>
<pre><code><span class=hl-keyword>case</span> wibble {
  <span class=hl-variant>Wibble</span> | <span class=hl-variant>Wobble</span> -&gt; <span class=hl-number>0</span>
  <span class=hl-comment>//         ^- Previously you could not trigger actions from here</span>
}

</code></pre>
<p>And hovering over a record field in a record access expression will now show
the documentation for that field, if any exists.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a> and
<a href="https://github.com/fruno-bulax">fruno</a>!</p>
<h2 id="Remove-unreachable-clauses-code-action">Remove unreachable clauses code action</h2>
<p>Gleam&#39;s pattern matching analysis can identify any clauses of a case
expression are unreachable due to previous patterns already matching any values
the redundant one could match.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>case</span> <span class=hl-function>find_user</span>() {
    <span class=hl-variant>Ok</span>(person) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Ok</span>(<span class=hl-variant>Admin</span>) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Ok</span>(<span class=hl-variant>User</span>) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Error</span>(_) -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>Here the <code>Ok(Admin)</code> and <code>Ok(User)</code> patterns could never match as all the <code>Ok</code>
values would be instead matched by the earlier <code>Ok(person)</code> pattern.</p>
<p>This is clearly a mistake in the code, so the compiler will emit a warning and
highlight the unreachable clauses. Most commonly the programmer will want to
edit the patterns to correct them, but some times the clauses are no longer
needed, and can be deleted entirely. To help with this scenario the language
server now offers a quick-fix code action to delete any redundant clauses.</p>
<p>Triggering it on the above code will result in the code being edited like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>case</span> <span class=hl-function>find_user</span>() {
    <span class=hl-variant>Ok</span>(person) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Error</span>(_) -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Pattern-match-on-value-code-action-improvements">Pattern match on value code action improvements</h2>
<p>Gleam has a single flow-control feature: pattern matching with the <code>case</code>
expression. Because of this there&#39;s a lot of pattern matching in Gleam
programs! The language server offers a code action to quickly pattern match on
a focused value, and with this release it has been further improved.</p>
<p>It can now be triggered on lists, with the default clauses including one for
when the list is empty, and one for when it is non-empty.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>is_empty</span>(list: <span class=hl-variant>List</span>(a)) -&gt; <span class=hl-variant>Bool</span> {
  <span class=hl-comment>//            ^^^^ Triggering the action here</span>
}
</code></pre>
<p>Triggering the action over the <code>list</code> argument would result in the following
code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>is_empty</span>(list: <span class=hl-variant>List</span>(a)) -&gt; <span class=hl-variant>Bool</span> {
  <span class=hl-keyword>case</span> list {
    [] -&gt; <span class=hl-keyword>todo</span>
    [first, ..rest] -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>The code action can now be triggered on variables introduced by other patterns.
For example, here we have a <code>let</code> statement with a pattern defining the
variables <code>name</code> and <code>role</code>.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> <span class=hl-variant>User</span>(name:, role:) = <span class=hl-function>find_user</span>(<span class=hl-string>&quot;lucy&quot;</span>)
  <span class=hl-comment>//              ^^^^ Triggering the action here</span>
}
</code></pre>
<p>Triggering the action on <code>role</code> results in a case expression being inserted on
the line below, with a clause for each of the possible variants of the <code>Role</code>
type that variable held.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> <span class=hl-variant>User</span>(name:, role:) = <span class=hl-function>find_user</span>(<span class=hl-string>&quot;lucy&quot;</span>)
  <span class=hl-keyword>case</span> role {
    <span class=hl-variant>Admin</span> -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Member</span> -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>If the variable was introduced within a case expression already then the
behaviour is different. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>case</span> <span class=hl-function>find_user</span>() {
    <span class=hl-variant>Ok</span>(user) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Error</span>(_) -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>Triggering the code action on the <code>user</code> variable would cause the code to be
rewritten to expand that clause of the case expression, replacing it with one
specialised clause for each of the possible variants of the type of that
variable.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>case</span> <span class=hl-function>find_user</span>() {
    <span class=hl-variant>Ok</span>(<span class=hl-variant>Admin</span>) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Ok</span>(<span class=hl-variant>Member</span>) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Error</span>(_) -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>! Pattern
matching is such an important core feature of Gleam that these improvements make
a big difference to the experience of writing and editing Gleam code.</p>
<h2 id="Collapse-nested-case-expressions-code-action">Collapse nested case expressions code action</h2>
<p>Another new code action is one to collapse nested case expressions into one,
reducing nesting and enabling further optimisations in some situations.</p>
<pre><code><span class=hl-keyword>case</span> user {
  <span class=hl-variant>User</span>(name:) -&gt;
    <span class=hl-keyword>case</span> name {
      <span class=hl-string>&quot;Joe&quot;</span> -&gt; <span class=hl-string>&quot;Hello, Joe!&quot;</span>
      _ -&gt; <span class=hl-string>&quot;Hello there!&quot;</span>
    }
  <span class=hl-variant>Guest</span> -&gt; <span class=hl-string>&quot;You&#39;re not logged in!&quot;</span>
}
</code></pre>
<p>Triggering the code action on the first clause will result in it being replaced
by multiple clauses that produce the same behaviour as the nested version.</p>
<pre><code><span class=hl-keyword>case</span> user {
  <span class=hl-variant>User</span>(name: <span class=hl-string>&quot;Joe&quot;</span>) -&gt; <span class=hl-string>&quot;Hello, Joe!&quot;</span>
  <span class=hl-variant>User</span>(name: _) -&gt; <span class=hl-string>&quot;Hello there!&quot;</span>
  <span class=hl-variant>Guest</span> -&gt; <span class=hl-string>&quot;You&#39;re not logged in!&quot;</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Add-omitted-labels-code-action">Add omitted labels code action</h2>
<p>Function parameters and record fields can have labels, names that can be used
at the call-site to make it clearer what each argument is, and to make the
ordering of the arguments not matter. The language server now offers a code
action to add the omitted labels in a call. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>User</span> {
  <span class=hl-variant>User</span>(first_name: <span class=hl-variant>String</span>, last_name: <span class=hl-variant>String</span>, likes: <span class=hl-variant>List</span>(<span class=hl-variant>String</span>))
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> first_name = <span class=hl-string>&quot;Giacomo&quot;</span>
  <span class=hl-variant>User</span>(first_name, <span class=hl-string>&quot;Cavalieri&quot;</span>, [<span class=hl-string>&quot;gleam&quot;</span>])
}
</code></pre>
<p>Triggering the code action on the <code>User</code> constructor will result in the
language server adding the labels to the arguments.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>User</span> {
  <span class=hl-variant>User</span>(first_name: <span class=hl-variant>String</span>, last_name: <span class=hl-variant>String</span>, likes: <span class=hl-variant>List</span>(<span class=hl-variant>String</span>))
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> first_name = <span class=hl-string>&quot;Giacomo&quot;</span>
  <span class=hl-variant>User</span>(first_name:, last_name: <span class=hl-string>&quot;Cavalieri&quot;</span>, likes: [<span class=hl-string>&quot;gleam&quot;</span>])
}
</code></pre>
<h2 id="Inter-module-generate-function-code-action">Inter-module generate function code action</h2>
<p>The &quot;Generate function&quot; code action now works when the missing function is to
be defined in another module. For example:</p>
<pre><code><span class=hl-comment>// src/maths.gleam</span>
<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>add</span>(a: <span class=hl-variant>Int</span>, b: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Int</span> { a <span class=hl-operator>+</span> b }
</code></pre>
<pre><code><span class=hl-comment>// src/app.gleam</span>
<span class=hl-keyword>import</span> <span class=hl-module>maths</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() -&gt; <span class=hl-variant>Nil</span> {
  <span class=hl-keyword>echo</span> <span class=hl-module>maths</span>.<span class=hl-function>add</span>(<span class=hl-number>1</span>, <span class=hl-number>2</span>)
  <span class=hl-keyword>echo</span> <span class=hl-module>maths</span>.<span class=hl-function>subtract</span>(<span class=hl-number>2</span>, <span class=hl-number>1</span>)
  <span class=hl-variant>Nil</span>
}
</code></pre>
<p>The <code>app</code> module is calling a function called <code>subtract</code> from the <code>maths</code>
module, but that function doesn&#39;t exist. Triggering the code action on the call
to <code>maths.subtract</code> will edit the <code>maths.gleam</code> file to add the outline of the
function, for the programmer to complete.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>add</span>(a: <span class=hl-variant>Int</span>, b: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Int</span> { a <span class=hl-operator>+</span> b }

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>subtract</span>(int: <span class=hl-variant>Int</span>, int_2: <span class=hl-variant>Int</span>) -&gt; <span class=hl-variant>Int</span> {
  <span class=hl-keyword>todo</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>! This is a nice
little quality-of-life improvement for Gleam programmers.</p>
<h2 id="Extract-function-code-action">Extract function code action</h2>
<p>And the last code action of this release, one that has been eagerly anticipated
for some time by many Gleam programmers: extract function.</p>
<pre><code><span class=hl-keyword>const</span> head_byte_count = <span class=hl-number>256</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>get_head_of_file</span>() {
  <span class=hl-keyword>let</span> <span class=hl-keyword>assert</span> <span class=hl-variant>Ok</span>(contents) = <span class=hl-function>read_file</span>()
  <span class=hl-keyword>case</span> contents {
    &lt;&lt;head:bytes<span class=hl-operator>-</span><span class=hl-function>size</span>(head_byte_count), _:bits&gt;&gt; -&gt; <span class=hl-variant>Ok</span>(head)
    _ -&gt; <span class=hl-variant>Error</span>(<span class=hl-variant>Nil</span>)
  }
}
</code></pre>
<p>If you were to select the case expression in your editor and trigger the code
action, then it would be extracted to a new function, like so:</p>
<pre><code><span class=hl-keyword>const</span> head_byte_count = <span class=hl-number>256</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>get_head_of_file</span>() {
  <span class=hl-keyword>let</span> <span class=hl-keyword>assert</span> <span class=hl-variant>Ok</span>(contents) = <span class=hl-function>read_file</span>()
  <span class=hl-function>function</span>(contents)
}

<span class=hl-keyword>fn</span> <span class=hl-function>function</span>(contents: <span class=hl-variant>BitArray</span>) -&gt; <span class=hl-variant>Result</span>(<span class=hl-variant>BitArray</span>, <span class=hl-variant>Nil</span>) {
  <span class=hl-keyword>case</span> contents {
    &lt;&lt;head:bytes<span class=hl-operator>-</span><span class=hl-function>size</span>(head_byte_count), _:bits&gt;&gt; -&gt; <span class=hl-variant>Ok</span>(head)
    _ -&gt; <span class=hl-variant>Error</span>(<span class=hl-variant>Nil</span>)
  }
}
</code></pre>
<p>Unfortunately the language server protocol design is rather limiting, so the
Gleam language server cannot prompt the programmer for a suitable name, it has
to use a meaningless name instead. The &quot;rename&quot; feature of the language server
can be triggered to give it a more appropriate name.</p>
<p>I believe that Microsoft&#39;s rewrite of the TypeScript toolchain will include it
using the language server protocol instead of their custom protocol, so
hopefully this will result in them expanding the LSP specification to include
features their custom protocol has, such as code actions being able to ask for
more information.</p>
<p>Thank you again <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Formatter-improvements">Formatter improvements</h2>
<p>Gleam has a code formatter that can clean up a file of Gleam code in an
instant, freeing up time that would be otherwise spent on the busy-work of
manually laying out code. Typically it is run by the programmer&#39;s text editor
when a file is saved. Several improvements have been made to it with this
release.</p>
<p>Bools can be negated with the <code>!</code> operator, and ints can be negated with the
<code>-</code> operator. Negating a value multiple times is redundant and does nothing, so
the formatter now collapses duplicate negations.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>useless_negations</span>() {
  <span class=hl-keyword>let</span> lucky_number = <span class=hl-operator>-</span><span class=hl-number>-11</span>
  <span class=hl-keyword>let</span> lucy_is_a_star = <span class=hl-operator>!</span><span class=hl-operator>!</span><span class=hl-operator>!</span><span class=hl-variant>False</span>
}
</code></pre>
<p>The code is rewritten like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>useless_negations</span>() {
  <span class=hl-keyword>let</span> lucky_number = <span class=hl-number>11</span>
  <span class=hl-keyword>let</span> lucy_is_a_star = <span class=hl-operator>!</span><span class=hl-variant>False</span>
}
</code></pre>
<p>Additionally, the formatter no longer removes blocks from case clause guards,
as the programmer may wish to include them to make code clearer, even if they
are not required according to Gleam&#39;s operator precedency rules. This also
makes the behaviour consistent with the formatting of regular expressions in
Gleam functions.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:
<a href="https://github.com/ankddev">Andrey Kozhev</a>,
<a href="https://github.com/bcpeinhardt">Benjamin Peinhardt</a>,
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>,
<a href="https://github.com/frunobulax-the-poodle">fruno</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/jcha0713">Joohoon Cha</a>,
<a href="https://github.com/matiascr">Matias Carlander</a>,
<a href="https://github.com/GearsDatapacks">Surya Rose</a>, and
<a href="https://github.com/Courtcircuits">Tristan-Mihai Radulescu</a>).</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.13.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a>
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And special thanks to our top sponsors:</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
  <li>
    <a class="sponsor-level2" href="https://williamsandholmes.com" rel="noopener" target="_blank">
      <img alt="Williams &amp; Holmes" src="/images/sponsors/williamsandholmes.svg">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/0riginaln0">0riginaln0</a>
</li>
<li>
<a href="https://github.com/AaronC81">Aaron Christiansen</a>
</li>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/abs0luty">abs0luty</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adam12">Adam Daniels</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adamdecaf">Adam Shannon</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/hashemi">Ahmad Alhashemi</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/adkelley">Alex Kelley</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/aivchen">Andrew Ivchenkov</a>
</li>
<li>
<a href="https://github.com/ankddev">Andrey</a>
</li>
<li>
<a href="https://github.com/andremw">André Mazoni</a>
</li>
<li>
<a href="https://github.com/ayoung19">Andy Young</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/anthony-khong">Anthony Khong</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/Beaudidly">Austin Beau Bodzas</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/benev0">benev0</a>
</li>
<li>
<a href="https://github.com/bcpeinhardt">Benjamin</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/Billuc">Billuc</a>
</li>
<li>
<a href="https://github.com/bisuke22">BISUKE</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/bondiano">bondiano</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettcannon">Brett Cannon</a>
</li>
<li>
<a href="https://github.com/brettkolodny">Brett Kolodny</a>
</li>
<li>
<a href="https://github.com/brian-dawn">Brian Dawn</a>
</li>
<li>
<a href="https://github.com/bdukes">Brian Dukes</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/beeauvin">Cassidy Spring (Bee)</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/madper">Chengjun Xie</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/cvincent">Chris Vincent</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/cdolan">Christopher Dolan</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/comet-ml">Comet</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/cmnstmntmn">Constantin Angheloiu</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/Courtcircuits">Courtcircuits</a>
</li>
<li>
<a href="https://github.com/uberguy">Cris Holm</a>
</li>
<li>
<a href="https://github.com/dagi3d">dagi3d</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/d2718">Dan</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/Giesch">Dan Gieschen Knutson</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/daniellionel01">Daniel Kurz</a>
</li>
<li>
<a href="https://github.com/Daniel-Shunom">Daniel S Jeremiah</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/ndan">Daniil Nevdah</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/dpen2000">David Pendray</a>
</li>
<li>
<a href="https://github.com/dlustre">Dennis Lustre</a>
</li>
<li>
<a href="https://github.com/dependabot%5Bbot%5D">dependabot[bot]</a>
</li>
<li>
<a href="https://github.com/diegogub">Diego</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/duzda">duzda</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/EdRW">Ed Rosewright</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://github.com/treuherz">Eli Treuherz</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/eutampieri">eutampieri</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fpauser">Falk Pauser</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/iFleey">Fleey</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/xikaos">Francisco Budaszewski Zanatta</a>
</li>
<li>
Francisco Budaszewski Zanatta
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/fruno-bulax">fruno</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/pendletong">Gareth Pendleton</a>
</li>
<li>
<a href="https://github.com/allenap">Gavin Panella</a>
</li>
<li>
<a href="https://github.com/GearsDatapacks">GearsDatapacks</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/ginkogruen">ginkogruen</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/godalming123">godalming123</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">graphiteisaac</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/ildorn">Hannes Schnaitter</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/hayleigh-dot-dev">Hayleigh Thompson</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://liberapay.com/Hizuru3/">Hizuru3</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/imlargo">imlargo</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jachin">Jachin Rupe</a>
</li>
<li>
<a href="https://github.com/jacobdalamb">Jacob Lamb</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/jcha0713">jcha0713</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/jihem">Jean-Marc QUERE</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jc00ke">Jesse Cooke</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/vistuleB">JOHN STEINBERGER</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jmcharter">Jon Charter</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/BigJayToDaIzo">Joseph Myers</a>
</li>
<li>
<a href="https://github.com/JosephTLyons">Joseph T. Lyons</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/justisCrocker">justisCrocker</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jorg1piano">Jørgen Andersen</a>
</li>
<li>
<a href="https://github.com/kadei-rat">Kadei</a>
</li>
<li>
<a href="https://github.com/Kamila-P">KamilaP</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/khalidbelk">khalidbelk</a>
</li>
<li>
<a href="https://github.com/krig">Kristoffer Grönlund</a>
</li>
<li>
<a href="https://github.com/Bearfinn">Kritsada Sunthornwutthikrai</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/km-tr">Kuma Taro</a>
</li>
<li>
<a href="https://github.com/jly36963">Landon</a>
</li>
<li>
<a href="https://github.com/lazno">lazno</a>
</li>
<li>
<a href="https://github.com/leah-u">Leah Ulmschneider</a>
</li>
<li>
<a href="https://github.com/leostera">Leandro Ostera</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/rcoder">Lennon Day-Reynolds</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/linqingmo">linqingmo</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/2kool4idkwhat">Luna</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/mvellandi">Mario Vellandi</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/mkdynamic">Mark Dodwell</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/alterationx10">Mark Rudolph</a>
</li>
<li>
<a href="https://github.com/maxdeviant">Marshall Bowers</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/matiascr">matiascr</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/mwhitworth">Matthew Whitworth</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/phmx">Maxim Philippov</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/amiroff">Metin Emiroğlu</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/tymak">Michal Timko</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/ngscheurich">N. G. Scheurich</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/naomieow">Naomi Roberts</a>
</li>
<li>
<a href="https://github.com/nataliethistime">Natalie Rose</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nathanielknight">Nathaniel Knight</a>
</li>
<li>
<a href="https://github.com/hongquan">Nguyễn Hồng Quân</a>
</li>
<li>
<a href="https://github.com/nchapman">Nick Chapman</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/blink1415">Nikolai Steen Kjosnes</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/Nezteb">Noah Betzen</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/nunulk">nunulk</a>
</li>
<li>
<a href="https://github.com/oceanlewis">Ocean</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/nnuuvv">ollie</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/tamectosphere">Pattadon Sa-ngasri</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/peonynopes">peonynopes</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/pierre-rouleau">Pierre Rouleau</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/quentin-bettoum">Quentin BETTOUM</a>
</li>
<li>
<a href="https://github.com/raquentin">Race Williams</a>
</li>
<li>
<a href="https://github.com/raineycat">raineycat</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatillas">Renata Amutio Herrero</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/rclarey">Russell Clarey</a>
</li>
<li>
<a href="https://github.com/sbergen">Sakari Bergen</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/soulsam480">sambit</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/scristobal">Samu</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/Sgregory42">Sgregory42</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/shawndrape">Shawn Drape</a>
</li>
<li>
<a href="https://github.com/shritesh">Shritesh Bhattarai</a>
</li>
<li>
<a href="https://github.com/shxdow">shxdow</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/sobolevn">sobolevn</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/sthagen">Stefan Hagen</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/stephanerangaya">Stephane Rangaya</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/betabrain">TA</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/trescenzi">Thomas Crescenzi</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/tomalexhughes">Tom Hughes</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/tudorluca">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/vshakitskiy">vshakitskiy</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/willramirezdev">Will Ramirez</a>
</li>
<li>
<a href="https://github.com/Willyboar">Willyboar</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/wingdeans">wingdeans</a>
</li>
<li>
<a href="https://github.com/wundersmiths">wundersmiths</a>
</li>
<li>
<a href="https://github.com/yagogarea">yagogarea</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">yoshie</a>
</li>
<li>
<a href="https://github.com/zenconomist">zenconomist</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://github.com/michaelmaysonet74">{:michael, :maysonet}</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>No more dependency management headaches</title><id>https://gleam.run/news/no-more-dependency-management-headaches</id><updated>2025-08-05T00:00:00Z</updated><published>2025-08-05T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/no-more-dependency-management-headaches" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type-safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.12.0">v1.12.0</a> has been published. Let&#39;s
take a look at the highlights.</p>
<h2 id="Understanding-dependency-conflicts">Understanding dependency conflicts</h2>
<p>Gleam packages use semantic versioning, and they specify what ranges of
releases they are compatible with to ensure that all selected versions are
compatible with each other. This is very useful in ensuring that you don&#39;t end
up stuck with invalid versions that cause the project to fail to compile, or
are broken in more confusing subtle ways.</p>
<p>This does, however, mean that sometimes you will have conflicts when adding a
dependency, as there&#39;s no version which is compatible with the existing
versions you have locked. Historically this has been very confusing as we&#39;ve
haven&#39;t able to display much useful information when this happens.</p>
<pre><code><b><span class="code-error">error</span>: Dependency resolution failed</b>

An error occurred while determining what dependency packages and
versions should be downloaded.
The error from the version resolver library was:

Unable to find compatible versions for the version constraints in your
gleam.toml. The conflicting packages are:

- app
- wisp
- mist
- gleam_otp
- gleam_json
</pre></code>
<p>It&#39;s not clear at all what the problem is, or what the programmer might need to
do to resolve the problem. This is not fun for them at all.</p>
<p>Thanks to a lot of hard work from Jak and a new release of the underlying
<a href="https://github.com/pubgrub-rs/pubgrub/">pubgrub</a> version solving algorithm
library Gleam will now provide much clearer error messages:</p>
<pre><code><b><span class="code-error">error</span>: Dependency resolution failed</b>

There's no compatible version of `gleam_otp`:
  - You require wisp >= 1.0.0 and < 2.0.0
    - wisp requires mist >= 1.2.0 and < 5.0.0
    - mist requires gleam_otp >= 0.9.0 and < 1.0.0
  - You require lustre >= 5.2.1 and < 6.0.0
    - lustre requires gleam_otp >= 1.0.0 and < 2.0.0

There's no compatible version of `gleam_json`:
  - You require wisp >= 1.0.0 and < 2.0.0
    - wisp requires gleam_json >= 3.0.0 and < 4.0.0
  - You require gleam_json >= 2.3.0 and < 3.0.0
</pre></code>
<p>Version solving is (perhaps unexpectedly) a very difficult problem! This was
not a trivial improvement to make so a huge thank you to <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
and the pubgrub library maintainers.</p>
<h2 id="Major-update-notifications">Major update notifications</h2>
<p>Another part of the dependency puzzle is knowing when there is a new major
version of any of the dependencies. Typically Gleam packages permit a range of
minor and patch versions, but not new major versions as according to semver
they have breaking changes, so they may not be compatible.</p>
<pre><code><span class=hl-module>[dependencies]</span>
<span class=hl-function>lustre </span>= ">= 5.2.0 and < 6.0.0"
</code></pre>
<p>When there&#39;s a new major version the programmer will need to check if the
package is compatible, and to adjust the code for the new version if
necessary.</p>
<p>To make it easier to understand when this needs to be done the <code>gleam update</code>,
and <code>gleam deps download</code> commands will now print a message when there are new
major versions of packages available. For example:</p>
<pre><code class="language-text">$ gleam update
  Resolving versions

The following dependencies have new major versions available:

gleam_http 1.7.0 -&gt; 4.0.0
gleam_json 1.0.1 -&gt; 3.0.1
lustre     3.1.4 -&gt; 5.1.1
</code></pre>
<p>Thank you <a href="https://github.com/andho">Amjad Mohamed</a> for this!</p>
<h2 id="Future-dependency-management-improvements">Future dependency management improvements</h2>
<p>Dependency packages can be extremely useful for being productive when
programming, but great care must be taken with them, both within a single
project and across the wider ecosystem. We want the experience of using
packages to be enjoyable and beneficial, and want to avoid developers getting
stuck in &quot;dependency hell&quot;. In the coming releases we will provide new
features that help with managing and auditing dependencies, resolving version
conflicts, and to ensure that code published to the package manager is high
quality and suitable for production use as much as possible.</p>
<h2 id="Echo-messages">Echo messages</h2>
<p>Gleam has a convenient <code>echo</code> keyword that is used for quick print-debugging.
Put it in front of an expression and it&#39;ll print the value and the source
location to the console. It returns the value it prints, so it can be
inserted anywhere in the code and not change the semantics of the code. There&#39;s
even a language server code action for removing all <code>echo</code>s from a module once
you are done debugging.</p>
<p>It is now possible to add a custom message to be printed by <code>echo</code>, so you can
add additional information to aid with your debugging.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>echo</span> <span class=hl-number>11</span> <span class=hl-keyword>as</span> <span class=hl-string>&quot;lucky number&quot;</span>
}
</code></pre>
<pre><code class="language-txt">/src/module.gleam:2 lucky number
11
</code></pre>
<p>I&#39;ve also improved the way that <code>echo</code> displays character lists in Erlang, and
circular references and error instances in JavaScript, which should be greatly
useful for folks working with code written in these languages.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Code-size-reduction">Code size reduction</h2>
<p>We&#39;ve made numerous improvements to Gleam&#39;s code generation pipeline which have
resulted in the final output being smaller. This is especially impactful when
compiling to JavaScript to be used in a web browser as there&#39;s an initial cost
to downloading JavaScript programs, especially on lower power devices or with
poor network connectivity.</p>
<p>Code generated for the record update syntax will now reuse existing variables
when possible, reducing the size of the generated code, the number of
variables, and the number of new scopes defined for both Erlang and JavaScript.
For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() -&gt; <span class=hl-variant>Nil</span> {
  <span class=hl-keyword>let</span> trainer = <span class=hl-variant>Trainer</span>(name: <span class=hl-string>&quot;Ash&quot;</span>, badges: <span class=hl-number>0</span>)
  <span class=hl-function>battle</span>(<span class=hl-variant>Trainer</span>(..trainer, badges: <span class=hl-number>1</span>))
}
</code></pre>
<p>This Gleam code compiled for the Erlang VM would previously generate code like
this:</p>
<pre><code><span class=hl-operator>-</span><span class=hl-atom>spec</span> <span class=hl-function>main</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span> <span class=hl-atom>nil</span><span class=hl-punctuation>.</span>
<span class=hl-function>main</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span>
    <span class=hl-variable>Trainer</span> <span class=hl-operator>=</span> <span class=hl-punctuation>{</span><span class=hl-atom>trainer</span><span class=hl-punctuation>,</span> <span class=hl-number>0</span><span class=hl-punctuation>,</span> <span class=hl-punctuation>&lt;&lt;</span><span class=hl-string>&quot;Ash&quot;</span><span class=hl-operator>/</span><span class=hl-atom>utf8</span><span class=hl-punctuation>&gt;&gt;</span><span class=hl-punctuation>}</span><span class=hl-punctuation>,</span>
    <span class=hl-function>battle</span><span class=hl-punctuation>(</span>
        <span class=hl-keyword>begin</span>
            <span class=hl-variable>_record</span> <span class=hl-operator>=</span> <span class=hl-variable>Trainer</span><span class=hl-punctuation>,</span>
            <span class=hl-punctuation>{</span><span class=hl-atom>trainer</span><span class=hl-punctuation>,</span> <span class=hl-number>1</span><span class=hl-punctuation>,</span> <span class=hl-module>erlang</span><span class=hl-punctuation>:</span><span class=hl-function>element</span><span class=hl-punctuation>(</span><span class=hl-number>3</span><span class=hl-punctuation>,</span> <span class=hl-variable>_record</span><span class=hl-punctuation>)</span><span class=hl-punctuation>}</span>
        <span class=hl-keyword>end</span>
    <span class=hl-punctuation>)</span><span class=hl-punctuation>.</span>
</code></pre>
<p>With v1.12&#39;s variable reuse this is generated instead:</p>
<pre><code><span class=hl-operator>-</span><span class=hl-atom>spec</span> <span class=hl-function>main</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span> <span class=hl-atom>nil</span><span class=hl-punctuation>.</span>
<span class=hl-function>main</span><span class=hl-punctuation>(</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>-&gt;</span>
    <span class=hl-variable>Trainer</span> <span class=hl-operator>=</span> <span class=hl-punctuation>{</span><span class=hl-atom>trainer</span><span class=hl-punctuation>,</span> <span class=hl-number>0</span><span class=hl-punctuation>,</span> <span class=hl-punctuation>&lt;&lt;</span><span class=hl-string>&quot;Ash&quot;</span><span class=hl-operator>/</span><span class=hl-atom>utf8</span><span class=hl-punctuation>&gt;&gt;</span><span class=hl-punctuation>}</span><span class=hl-punctuation>,</span>
    <span class=hl-function>battle</span><span class=hl-punctuation>(</span><span class=hl-punctuation>{</span><span class=hl-atom>trainer</span><span class=hl-punctuation>,</span> <span class=hl-number>1</span><span class=hl-punctuation>,</span> <span class=hl-module>erlang</span><span class=hl-punctuation>:</span><span class=hl-function>element</span><span class=hl-punctuation>(</span><span class=hl-number>3</span><span class=hl-punctuation>,</span> <span class=hl-variable>Trainer</span><span class=hl-punctuation>)</span><span class=hl-punctuation>}</span><span class=hl-punctuation>)</span><span class=hl-punctuation>.</span>
</code></pre>
<p>In addition to these the code generated for a <code>case</code> expression on the
JavaScript target has been reduced in size in many cases, and the previous
release&#39;s improved dead-code detection is now use to avoid generating any code
that would go unused in the final program.</p>
<p>These improvements were the work of Surya and myself, thank you
<a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="More-flexible-list-formatting">More flexible list formatting</h2>
<p>Gleam comes with an automatic code formatter, which can be run in an editor
using the Gleam language server, or from the command line with <code>gleam format</code>.
Having a canonical formatter means that all Gleam has the same predictable
style, making it easier to read Gleam code, and removing time consuming debates
about superficial code style.</p>
<p>Previously the formatter wouldn&#39;t give the programmer any control over how
lists are formatted, always putting the elements on a single line if they fit
within the column limit, or spreading them over multiple lines if it does not.
With this release the programmer is given more control! If a list would fit on
a single line they can still opt to have it spread over multiple lines.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>my_favourite_pokemon</span>() -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>String</span>) {
  [<span class=hl-string>&quot;natu&quot;</span>, <span class=hl-string>&quot;chimecho&quot;</span>, <span class=hl-string>&quot;milotic&quot;</span>]
}
</code></pre>
<p>To tell the formatter that this list should be spread over multiple lines a
comma can be added before the <code>]</code>, which will cause it to be formatted like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>my_favourite_pokemon</span>() -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>String</span>) {
  [
    <span class=hl-string>&quot;natu&quot;</span>,
    <span class=hl-string>&quot;chimecho&quot;</span>,
    <span class=hl-string>&quot;milotic&quot;</span>,
  ]
}
</code></pre>
<p>By removing the trailing comma the formatter will try and fit the list on a
single line again.</p>
<p>The formatter will also permit the programmer to control whether to have
elements be placed one-per-line, or to try and fit multiple onto a line, and
single empty lines within lists will be preserved. This will greatly help with
large lists that would benefit from being visually segmented into different
parts.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>! This change
will be very popular, I&#39;m sure.</p>
<h2 id="JSDoc-support">JSDoc support</h2>
<p><a href="https://jsdoc.app/">JSDoc</a> is the most widely used format for in-code
documentation in JavaScript, and it is supported by many editors and
programming tools. Documentation comments in Gleam code will now be included in
the output using JSDoc syntax when compiling to JavaScript.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Unreachable-import-warnings">Unreachable import warnings</h2>
<p>While not commonly done as it tends to make code harder to read, it is possible
to import a function from another module in an unqualified fashioned, meaning
you don&#39;t need to add the <code>module.</code> prefix when using the function in the
importer module.</p>
<p>If a function or a constant is imported in an unqualified fashion and there is
function or constant with the same name defined in the module then the imported
value will not be accessible at all, making the import pointless. The compiler
now emits a warning in this case, so the programmer can identify and fix the
problem.</p>
<p>Thank you <a href="https://github.com/aayush-tripathi">Aayush Tripathi</a>!</p>
<h2 id="Discarded-variable-hints">Discarded variable hints</h2>
<p>The compiler can now tell when an unknown variable might be referring to a
variable that has been discarded with a <code>_</code> prefix, providing an helpful error
message highlighting it. For example, this piece of code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>go</span>() {
  <span class=hl-keyword>let</span> _x = <span class=hl-number>1</span>
  x <span class=hl-operator>+</span> <span class=hl-number>1</span>
}
</code></pre>
<p>Now results in the following error:</p>
<pre><code><b><span class="code-error">error</span>: Unknown variable</b>
<span class="code-decoration">  ┌─</span> /src/one/two.gleam:4:3
<span class="code-decoration">  │</span>
<span class="code-decoration">3 │</span>   let _x = 1
<span class="code-decoration">  │</span>       <span class="code-decoration">-- This value is discarded</span>
<span class="code-decoration">4 │</span>   x + 1
<span class="code-decoration">  │</span>   <span class="code-error">^ So it is not in scope here.</span>

Hint: Change <code>`_x`</code> to <code>`x`</code> or reference another variable
</code></pre>
<p>This new error message also shows off the improved format for secondary labels
in warnings and errors, which provide context for the error message. They are
highlighted in a distinct fashion to show they are secondary, and in language
server clients they will be shown as additional information attached to the
diagnostic.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> for these!</p>
<h2 id="Avoiding-extra-object-allocations">Avoiding extra object allocations</h2>
<p>It is not uncommon when pattern matching to have case clauses where the pattern
and the clause match exactly. These clauses cause the value to be passed through
unchanged, as can be seen here in the <code>Error</code> clause of this code.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>find_book</span>() -&gt; <span class=hl-variant>Result</span>(<span class=hl-variant>Book</span>, <span class=hl-variant>LibraryError</span>) {
  <span class=hl-keyword>case</span> <span class=hl-function>ask_for_isbn</span>() {
    <span class=hl-variant>Error</span>(error) -&gt; <span class=hl-variant>Error</span>(error)
    <span class=hl-variant>Ok</span>(isbn) -&gt; <span class=hl-function>load_book</span>(isbn)
  }
}
</code></pre>
<p>Previously the generated code for this would construct a new <code>Error</code> to contain
the pattern matched <code>error</code> value. With this release the compiler identifies
that the resulting value would be identical to the pattern matched value and
instead reuses that value. It is safe to do this because Gleam is an immutable
language.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Redundant-comparison-warnings">Redundant comparison warnings</h2>
<p>The compiler now emits a warning when performing a redundant comparison that
it can tell is always going to succeed or fail. For example, this piece of
code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>find_line</span>(lines) {
  <span class=hl-module>list</span>.<span class=hl-function>find</span>(lines, <span class=hl-keyword>fn</span>(x) { x <span class=hl-operator>==</span> x })
}
</code></pre>
<p>Would result in the following warning:</p>
<pre><code><b><span class="code-error">warning</span>: Redundant comparison</b>
<span class="code-decoration">  ┌─</span> /src/warning.gleam:2:17
<span class="code-decoration">  │</span>
<span class="code-decoration">1 │</span>   list.find(lines, fn(x) { x == x })
<span class="code-decoration">  │</span>                            <span class="code-error">^^^^^^ This is always `True`</span>

This comparison is redundant since it always succeeds.
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Helpful-import-errors-for-Pythonistas">Helpful import errors for Pythonistas</h2>
<p>When learning a new language it can be common to make mistakes with the syntax,
especially with syntax that is similar but not the same as another language the
programmer is more familiar with.</p>
<p>Gleam&#39;s module import syntax looks similar to Python&#39;s, but it uses <code>/</code> instead
of <code>.</code> in the module name. The compiler now emits a helpful message when this
mistake is made.</p>
<pre><code><b><span class="code-error">error</span>: Syntax error</b>
<span class="code-decoration">  ┌─</span> /src/parse/error.gleam:1:11
<span class="code-decoration">  │</span>
<span class="code-decoration">1 │</span> import one.two.three
<span class="code-decoration">  │</span>           <span class="code-error">^ I was expecting either `/` or `.{` here.</span>

Perhaps you meant one of:

    import one/two
    import one.{two}
</code></pre>
<p>Thank you <a href="https://github.com/zij-it">Zij-IT</a>!</p>
<h2 id="Helpful-list-errors-for-JavaScripters">Helpful list errors for JavaScripters</h2>
<p>Similarly a programmer learning a new language may attempt to use a feature
their other language has that their new language does not.</p>
<p>Gleam has a syntax for prepending to a list, which is similar to JavaScript&#39;s
array spread syntax, but faster as it doesn&#39;t need to allocate a whole new
array and copy the elements across. One big difference to the JavaScript
feature is that it is only for prepending, which can be unexpected for
JavaScript programmers. A helpful error message is now emitted if the
programmer tries to use it to concatenate two lists together.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() -&gt; <span class=hl-variant>Nil</span> {
  <span class=hl-keyword>let</span> xs = [<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>]
  <span class=hl-keyword>let</span> ys = [<span class=hl-number>5</span>, <span class=hl-number>6</span>, <span class=hl-number>7</span>]
  [<span class=hl-number>1</span>, ..xs, ..ys]
}
</code></pre>
<pre><code><b><span class="code-error">error</span>: Syntax error</b>
<span class="code-decoration">  ┌─</span> /src/parse/error.gleam:5:13
<span class="code-decoration">  │</span>
<span class="code-decoration">5 │</span>   [1, ..xs, ..ys]
<span class="code-decoration">  │</span>       <span class="code-decoration">--    </span><span class="code-error">^^ I wasn't expecting a second list here</span>
<span class="code-decoration">  │</span>       <span class="code-decoration">│</span>
<span class="code-decoration">  │</span>       <span class="code-decoration">You're using a list here</span>

Lists are immutable and singly-linked, so to join two or more lists
all the elements of the lists would need to be copied into a new list.
This would be slow, so there is no built-in syntax for it.
</code></pre>
<p>Thank you <a href="https://github.com/carlbordum">Carl Bordum Hansen</a> and
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>.</p>
<h2 id="Argument-labels-hints-in-errors">Argument labels hints in errors</h2>
<p>The error message emitted when a function is called with the wrong number
of arguments has been improved, it now show the labels for the missing
arguments.</p>
<pre><code><b><span class="code-error">error</span>: Incorrect arity</b>
<span class="code-decoration">  ┌─</span> /src/main.gleam:6:3
<span class="code-decoration">  │</span>
<span class="code-decoration">6 │</span>   Pokemon(198, name: "murkrow")
<span class="code-decoration">  │</span>   <span class="code-error">^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Expected 3 arguments, got 2</span>

This call accepts these additional labelled arguments:

  - moves
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Bit-array-improvements">Bit array improvements</h2>
<p>Gleam has an expressive literal syntax for constructing and pattern matching on
binary data, as is common for languages on the Erlang VM. This syntax is
supported when compiling to JavaScript too.</p>
<p>The endianness of a segment can now be specified when constructing or pattern
matching on UTF codepoints in bit arrays.</p>
<p>Calculations are now allowed in the size options of bit array patterns. For
example, the following code is now valid:</p>
<pre><code><span class=hl-keyword>let</span> <span class=hl-keyword>assert</span> &lt;&lt;size, data:bytes<span class=hl-operator>-</span><span class=hl-function>size</span>(size <span class=hl-operator>/</span> <span class=hl-number>8</span> <span class=hl-operator>-</span> <span class=hl-number>1</span>)&gt;&gt; = some_bit_array
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Erlang-local-function-inlining">Erlang local function inlining</h2>
<p>When compiling for the Erlang VM the Gleam build tool will use the Erlang
compiler to produce BEAM bytecode for the Gleam code, so Gleam benefits from
all the optimisations that it includes.</p>
<p>One option that is disabled by default is inlining of functions within the same
module. This Gleam release enables it with conservative configuration that
should result in no increase in generated code size. Some BEAM programs will
see a notable increase in performance thanks to this.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Monorepo-code-links-support">Monorepo code links support</h2>
<p>Gleam generates and publishes HTML documentation for packages as they are
published to Hex, the BEAM ecosystem package manager. In the documentation
there are links to the code for types and functions, so you can see how they
are defined after you have read their documentation.</p>
<p>To support this Gleam expects a git tag to be added to each published release,
and will help you to do so. However, this system didn&#39;t work for monorepos that
contain multiple Gleam projects, as the tags could clash.</p>
<p>The <code>repository</code> section in <code>gleam.toml</code> now allows specifying the <code>tag-prefix</code>
property, which is prepended to the default tag. This prefix allows the
programmer to avoid tag clashes for the different packages in a monorepo</p>
<p>Thank you <a href="https://github.com/sbergen">Sakari Bergen</a>!</p>
<h2 id="CommonJS-module-support">CommonJS module support</h2>
<p>Some Gleam packages may include JavaScript or Erlang modules which are used
with Gleam&#39;s &quot;external function&quot; FFI functionality. With this release you can
now include JavaScript modules with the <code>.cjs</code> file extension, which enables
use of the CommonJS import system.</p>
<p>Thank you <a href="https://github.com/yoshi-monster">yoshi</a>!</p>
<h2 id="Remove-block-code-action">Remove block code action</h2>
<p>The language server now offers a code action to remove blocks that wrap a
single expression. For example, in this code snippet:</p>
<pre><code><span class=hl-keyword>case</span> greeting {
  <span class=hl-variant>User</span>(name:) -&gt; { <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>&lt;&gt;</span> name }
  <span class=hl-comment>//             ^^^^^^^^^^^^^^^^^^^^^ Triggering the code action</span>
  <span class=hl-comment>//                                   with the cursor over this block.</span>
  <span class=hl-variant>Anonymous</span> -&gt; <span class=hl-string>&quot;Hello, stranger!&quot;</span>
}
</code></pre>
<p>Would be turned into:</p>
<pre><code><span class=hl-keyword>case</span> greeting {
  <span class=hl-variant>User</span>(name:) -&gt; <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>&lt;&gt;</span> name
  <span class=hl-variant>Anonymous</span> -&gt; <span class=hl-string>&quot;Hello, stranger!&quot;</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:
<a href="https://github.com/aayush-tripathi">Aayush Tripathi</a>,
<a href="https://github.com/cysabi">cysabi</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/lpil">Louis Pilfold</a>, and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>.</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.12.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a>
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And special thanks to our top sponsors:</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/aayush-tripathi">Aayush</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/akoutmos">Alexander Koutmos</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/ricountzero">Aliaksiej Maroz</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/andho">Andho Mohamed</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/andremw">André Mazoni</a>
</li>
<li>
<a href="https://github.com/ayoung19">Andy Young</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/anthony-khong">Anthony Khong</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/Beaudidly">Austin Beau Bodzas</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/bartekgorny">Bartek Górny</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettcannon">Brett Cannon</a>
</li>
<li>
<a href="https://github.com/brettkolodny">Brett Kolodny</a>
</li>
<li>
<a href="https://github.com/brian-dawn">Brian Dawn</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlbordum">Carl Bordum Hansen</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/ctdio">Charlie Duong</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/cvincent">Chris Vincent</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/comet-ml">Comet</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/cysabi">cysabi</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/d2718">Dan</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/Giesch">Dan Gieschen Knutson</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/ndan">Daniil Nevdah</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/cobac">David Coba</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/dpen2000">David Pendray</a>
</li>
<li>
<a href="https://github.com/dangdennis">Dennis Dang</a>
</li>
<li>
<a href="https://github.com/dennistruemper">dennistruemper</a>
</li>
<li>
<a href="https://github.com/dependabot%5Bbot%5D">dependabot[bot]</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/dusty-phillips">Dusty Phillips</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/EdRW">Ed Rosewright</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://liberapay.com/ijomeli/">elke</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/Shadowsx3">Emma</a>
</li>
<li>
<a href="https://github.com/yellowsman">Endo Shogo</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/iFleey">Fleey</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/allenap">Gavin Panella</a>
</li>
<li>
<a href="https://github.com/GearsDatapacks">GearsDatapacks</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/brasilikum">Georg Hartmann</a>
</li>
<li>
<a href="https://github.com/gmartsenkov">Georgi Martsenkov</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/givensuman">given</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham Vasquez</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">graphiteisaac</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/gunnarahlberg">Gunnar Ahlberg</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/ildorn">Hannes Schnaitter</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/hayleigh-dot-dev">Hayleigh Thompson</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://github.com/losfair">Heyang Zhou</a>
</li>
<li>
<a href="https://liberapay.com/Hizuru3/">Hizuru3</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/bozso">István Bozsó</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jacobdalamb">Jacob Lamb</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jakob753951">Jakob Ladegaard Møller</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/jihem">Jean-Marc QUERE</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jc00ke">Jesse Cooke</a>
</li>
<li>
<a href="https://github.com/jiangplus">jiangplus</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jmcharter">Jon Charter</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/JonasGruenwald">JonasGruenwald</a>
</li>
<li>
<a href="https://github.com/maennchen">Jonatan Männchen</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/JosephTLyons">Joseph T. Lyons</a>
</li>
<li>
<a href="https://github.com/phocks">Joshua Byrd</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jorg1piano">Jørgen Andersen</a>
</li>
<li>
<a href="https://github.com/Kamila-P">KamilaP</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/Bearfinn">Kritsada Sunthornwutthikrai</a>
</li>
<li>
<a href="https://github.com/krystofrezac">Kryštof Řezáč</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/jly36963">Landon</a>
</li>
<li>
<a href="https://github.com/leah-u">Leah Ulmschneider</a>
</li>
<li>
<a href="https://github.com/leostera">Leandro Ostera</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/rcoder">Lennon Day-Reynolds</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/LilyRose2798">Lily Rose</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/2kool4idkwhat">Luna</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/mvellandi">Mario Vellandi</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/mkdynamic">Mark Dodwell</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/martinfojtik">Martin Fojtík</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/mwarger">Mat Warger</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/mwhitworth">Matthew Whitworth</a>
</li>
<li>
<a href="https://github.com/mnuessler">Matthias Nüßler</a>
</li>
<li>
<a href="https://github.com/maxh213">Max Harris</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/amiroff">Metin Emiroğlu</a>
</li>
<li>
<a href="https://github.com/the-mikedavis">Michael Davis</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/mtlynch">Michael Lynch</a>
</li>
<li>
<a href="https://github.com/michaelmaysonet74">Michael Maysonet</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/mrmcc3">Michael McClintock</a>
</li>
<li>
<a href="https://github.com/tymak">Michal Timko</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nathanielknight">Nathaniel Knight</a>
</li>
<li>
<a href="https://github.com/NFIBrokerage">NFIBrokerage</a>
</li>
<li>
<a href="https://github.com/nchapman">Nick Chapman</a>
</li>
<li>
<a href="https://github.com/ndreynolds">Nick Reynolds</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/nik-rev">Nik Revenco</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/blink1415">Nikolai Steen Kjosnes</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/NNBnh">NNB</a>
</li>
<li>
<a href="https://github.com/nnuuvv">nnuuvv</a>
</li>
<li>
<a href="https://github.com/Nezteb">Noah Betzen</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/nunulk">nunulk</a>
</li>
<li>
<a href="https://github.com/oceanlewis">Ocean</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/vidalpaul">paul vidal</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/raquentin">Race Williams</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/renatillas">re.natillas</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://liberapay.com/Karakunai/">Ronan Harris</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/rclarey">Russell Clarey</a>
</li>
<li>
<a href="https://github.com/sbergen">Sakari Bergen</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/soulsam480">sambit</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/scristobal">Samu</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/seanjensengrey">Sean Jensen-Grey</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/Kaholaz">Sebastian Bugge</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/Sgregory42">Sgregory42</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/shawndrape">Shawn Drape</a>
</li>
<li>
<a href="https://github.com/Daniel-Shunom">shunom</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/sthagen">Stefan Hagen</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/SyntacticalAnomaly">SyntacticalAnomaly</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/trescenzi">Thomas Crescenzi</a>
</li>
<li>
<a href="https://github.com/ernstla">Thomas Ernst</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/tkanerva">tkanerva</a>
</li>
<li>
Tolek
</li>
<li>
<a href="https://github.com/tomalexhughes">Tom Hughes</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
Tomek
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/lucamtudor">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/Willyboar">Willyboar</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">yoshi~</a>
</li>
<li>
<a href="https://github.com/zenconomist">zenconomist</a>
</li>
<li>
<a href="https://github.com/Zij-IT">Zij-IT</a>
</li>
<li>
<a href="https://github.com/caifanuncle">zonghan</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Gleam JavaScript gets 30% faster</title><id>https://gleam.run/news/gleam-javascript-gets-30-percent-faster</id><updated>2025-06-02T00:00:00Z</updated><published>2025-06-02T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/gleam-javascript-gets-30-percent-faster" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type-safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.11.0">v1.11.0</a> has been published.</p>
<h2 id="30%-faster-Really">30% faster? Really?</h2>
<p>The title of this article makes a bold claim: Gleam compiled to JavaScript
being 30% faster! Gleam doesn&#39;t add any additional runtime when compiling to
JavaScript, and the generated code is very much like the JavaScript a human
would write, so this is an accomplishment we&#39;re very happy with.</p>
<p>First, a benchmark. <a href="https://github.com/lustre-labs/lustre">Lustre</a> is a
frontend web framework for Gleam, capable of both SPA style and LiveView
style functionality. It has a virtual DOM implementation with comparable
performance to established frameworks in other languages, such as React and Elm.
It is one of the most widely used Gleam packages, and certainly the most widely
used Gleam web framework.</p>
<p>Lustre&#39;s virtual DOM diffing is implemented in Gleam, so improving its
performance will benefit many Gleam users, and it will serve as a good
benchmark to demonstrate the improvements. The charts below show the number of
operations per second for diffing HTML tables of various sizes (higher is
better).</p>
<style>
h4 {
  margin-bottom: 0;
}
.bar-chart {
  margin-top: var(--gap-1);
}
@media (min-width: 960px) {
  h4 {
    width: 150px;
    text-align: right;
  }
  .bar-chart .label {
    flex-basis: 150px;
  }
}
</style>

<h4>10 rows</h4>
<ol class="bar-chart">
  <li> <span class="label"><code>v1.10.0</code></span> <div class="bar" style="flex-basis: max(calc((142285  / 208149) * 70%), 1px);" ></div> 142k </li>
  <li> <span class="label"><code>v1.11.0</code></span> <div class="bar" style="flex-basis: max(calc((208149  / 208149) * 70%), 1px);" ></div> 208k </li>
</ol>

<h4>100 rows</h4>
<ol class="bar-chart">
  <li> <span class="label"><code>v1.10.0</code></span> <div class="bar" style="flex-basis: max(calc((15927  / 21592) * 70%), 1px);" ></div> 15.9k </li>
  <li> <span class="label"><code>v1.11.0</code></span> <div class="bar" style="flex-basis: max(calc((21592 / 21592) * 70%), 1px);" ></div> 21.5k </li>
</ol>

<h4>1000 rows</h4>
<ol class="bar-chart">
  <li> <span class="label"><code>v1.10.0</code></span> <div class="bar" style="flex-basis: max(calc((1521 / 2126) * 70%), 1px);" ></div> 1.5k </li>
  <li> <span class="label"><code>v1.11.0</code></span> <div class="bar" style="flex-basis: max(calc((2126 / 2126) * 70%), 1px);" ></div> 2.1k </li>
</ol>
<p></p>
<p>Without any modification to Lustre itself it has got 30% faster! All other
Gleam projects compiling to JavaScript can expect to similar performance
improvements, with greater improvements to projects with more complex pattern
matching.</p>
<h2 id="OK-how-does-it-work">OK, how does it work?</h2>
<p>Gleam has a single flow control construct, the case expression. It runs
top-to-bottom checking to see which of the given patterns match the value.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>greet</span>(person: <span class=hl-variant>Person</span>) -&gt; <span class=hl-variant>String</span> {
  <span class=hl-keyword>case</span> person {
    <span class=hl-variant>Teacher</span>(students: [], ..) -&gt; <span class=hl-string>&quot;Hello! No students today?&quot;</span>
    <span class=hl-variant>Student</span>(name: <span class=hl-string>&quot;Daria&quot;</span>, ..) -&gt; <span class=hl-string>&quot;Hi Daria&quot;</span>
    <span class=hl-variant>Student</span>(subject: <span class=hl-string>&quot;Physics&quot;</span>, ..) -&gt; <span class=hl-string>&quot;Don&#39;t be late for Physics&quot;</span>
    <span class=hl-variant>Teacher</span>(name:, ..) | <span class=hl-variant>Student</span>(name:, ..) -&gt; <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>&lt;&gt;</span> name <span class=hl-operator>&lt;&gt;</span> <span class=hl-string>&quot;!&quot;</span>
  }
}
</code></pre>
<p>Prior to this release, when compiling to JavaScript code results in <code>if else</code>
chain, as can be seen in the code below.</p>
<pre><code><span class=hl-keyword>export</span> <span class=hl-keyword>function</span> <span class=hl-function>greet</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
  <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>isTeacher</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span> <span class=hl-operator>&amp;&amp;</span> <span class=hl-function>isEmpty</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>students</span><span class=hl-punctuation>)</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hello! No students today?&quot;</span><span class=hl-punctuation>;</span>
  <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>isStudent</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span> <span class=hl-operator>&amp;&amp;</span> <span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>name</span> <span class=hl-operator>===</span> <span class=hl-string>&quot;Daria&quot;</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hi Daria&quot;</span><span class=hl-punctuation>;</span>
  <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>isStudent</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span> <span class=hl-operator>&amp;&amp;</span> <span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>subject</span> <span class=hl-operator>===</span> <span class=hl-string>&quot;Physics&quot;</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>return</span> <span class=hl-string>&quot;Don&#39;t be late for Physics&quot;</span><span class=hl-punctuation>;</span>
  <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>isTeacher</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>+</span> <span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>name</span> <span class=hl-operator>+</span> <span class=hl-string>&quot;!&quot;</span><span class=hl-punctuation>;</span>
  <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>+</span> <span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>name</span> <span class=hl-operator>+</span> <span class=hl-string>&quot;!&quot;</span><span class=hl-punctuation>;</span>
  <span class=hl-punctuation>}</span>
<span class=hl-punctuation>}</span>
</code></pre>
<p><em>Disclaimer: This code has been lightly edited for clarity, but all aspects
related to this implementation change remain the same.</em></p>
<p>This is very understandable and human looking code, but it&#39;s not as efficient
as possible. For example, if the value is a <code>Student</code> with a name other than
&quot;Daria&quot; and a subject other than &quot;Physics&quot; then the <code>isTeacher</code> and <code>isStudent</code>
functions are each called twice, resulting in wasted work.
Similar problems arise with other patterns, especially with the list type as it
would need to be traversed multiple times to check various elements within
them.</p>
<p>The new and improved approach is to transform the linear sequence of checks
into a <em>decision tree</em>, where each check is performed the minimum number of
times to find the matching clause as quickly as possible. This decision tree is
then compiled into a series of nested <code>if else</code> statements in JavaScript.</p>
<pre><code><span class=hl-keyword>export</span> <span class=hl-keyword>function</span> <span class=hl-function>greet</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
  <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>isTeacher</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>)</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-function>isEmpty</span><span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>students</span><span class=hl-punctuation>)</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
      <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hello! No students today?&quot;</span><span class=hl-punctuation>;</span>
    <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-punctuation>{</span>
      <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>+</span> <span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>name</span> <span class=hl-operator>+</span> <span class=hl-string>&quot;!&quot;</span><span class=hl-punctuation>;</span>
    <span class=hl-punctuation>}</span>
  <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-punctuation>{</span>
    <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>name</span> <span class=hl-operator>===</span> <span class=hl-string>&quot;Daria&quot;</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
      <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hi Daria&quot;</span><span class=hl-punctuation>;</span>
    <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-punctuation>{</span>
      <span class=hl-keyword>if</span> <span class=hl-punctuation>(</span><span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>subject</span> <span class=hl-operator>===</span> <span class=hl-string>&quot;Physics&quot;</span><span class=hl-punctuation>)</span> <span class=hl-punctuation>{</span>
        <span class=hl-keyword>return</span> <span class=hl-string>&quot;Don&#39;t be late for Physics&quot;</span><span class=hl-punctuation>;</span>
      <span class=hl-punctuation>}</span> <span class=hl-keyword>else</span> <span class=hl-punctuation>{</span>
        <span class=hl-keyword>return</span> <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>+</span> <span class=hl-variable>person</span><span class=hl-punctuation>.</span><span class=hl-variable>name</span> <span class=hl-operator>+</span> <span class=hl-string>&quot;!&quot;</span><span class=hl-punctuation>;</span>
      <span class=hl-punctuation>}</span>
    <span class=hl-punctuation>}</span>
  <span class=hl-punctuation>}</span>
<span class=hl-punctuation>}</span>
</code></pre>
<p>This does result in a small increase in code size (up to 15% in our tests), but
the uniform nature of the extra code is well suited to compression, with
minification and brotli compression completely removing this extra size and
producing the same application bundle size as with previous Gleam versions.</p>
<p>We have only implemented this optimisation for the JavaScript target and not
the Erlang one as the Erlang Virtual machine implements this optimisation
itself! It is done for us automatically there.</p>
<p>As part of this work the compilers analysis of pattern matching was enhanced,
notably around bit-array patterns. It can now identify when a clause with a bit
array pattern is unreachable because it only matches values that a previous
clause also matches, such as the second clause here:</p>
<pre><code><span class=hl-keyword>case</span> payload {
  &lt;&lt;first_byte, _:bits&gt;&gt; -&gt; first_byte
  &lt;&lt;<span class=hl-number>1</span>, _:bits&gt;&gt; -&gt; <span class=hl-number>1</span>
  _ -&gt; <span class=hl-number>0</span>
}
</code></pre>
<p>Efficient compilation of pattern matching is a surprisingly challenging
problem, and we would not have had so much success without academic research on
the subject. In particular we would like to acknowledge <a href="https://julesjacobs.com/notes/patternmatching/patternmatching.pdf">&quot;How to compile pattern
matching&quot;</a>,
by Jules Jacobs and <a href="https://user.it.uu.se/~kostis/Papers/JFP_06.pdf">&quot;Efficient manipulation of binary data using pattern
matching&quot;</a>, by Per
Gustafsson and Konstantinos Sagonas. Thank you.</p>
<p>This is the culmination of work that was started before Gleam v1, and has been
desired for much longer. A huge thank you to <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
for this final piece.</p>
<p>But that&#39;s not all! There&#39;s lots more new things in this release. Let&#39;s take a
look.</p>
<h2 id="Testing-with-assert">Testing with <code>assert</code></h2>
<p>Types and static analysis are wonderful tools to help you write code, but
you&#39;re always going to need to test programs to know they are working
correctly. Gleam the language historically doesn&#39;t have any built-in testing
functionality, so test libraries define assertion functions that can be used in
tests.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>hello_test</span>() {
  <span class=hl-module>telephone</span>.<span class=hl-function>ring</span>()
  <span class=hl-operator>|&gt;</span> <span class=hl-module>should</span>.<span class=hl-function>equal</span>(<span class=hl-string>&quot;Hello, Joe!&quot;</span>)
}
</code></pre>
<p>This has worked well enough to be productive, but it&#39;s not the world-class
experience we want in Gleam. These assertion functions are just that: they are
functions. All they can do is take arguments and return values. They can&#39;t know
anything about the code that produced those arguments, or the context from
which they are being called. The debugging information that a Gleam test
framework can provide with this is quite limited to compared to other languages
that have either built-in assertion capabilities, a macro system, or other similar
features.</p>
<p>Gleam isn&#39;t a language about types, it&#39;s a language about productivity and
developer joy. This sub-par testing experience wasn&#39;t up to our high standards,
and with this release we&#39;ve made a big step towards correcting that with the
addition of <code>assert</code>.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>hello_test</span>() {
  <span class=hl-keyword>assert</span> <span class=hl-module>telecom</span>.<span class=hl-function>ring</span>() <span class=hl-operator>==</span> <span class=hl-string>&quot;Hello, Joe!&quot;</span>
}
</code></pre>
<p>This new syntax panics if the given expression evaluates to <code>False</code>. What makes
it different to conditionally calling the existing <code>panic</code> syntax is that the
runtime error is annotated with information about the expression that evaluated
to <code>False</code>, so test frameworks can provide detailed debugging information in
the event of a test failure.</p>
<p>Here&#39;s the output that the <code>gleeunit</code> test framework will use. Other Gleam test
frameworks may go further with even better formats!</p>
<pre><code><span class="code-success">...............</span>
<span class="code-error"><b>assert</b></span> <span class="code-comment">test/my_app_test.gleam:215</span>
<span class="code-decoration"> test:</span> my_app_test.hello_test
<span class="code-decoration"> code:</span> assert telecom.ring() == "Hello, Joe!"
<span class="code-decoration"> left:</span> "Hello, Mike!"
<span class="code-decoration">right:</span> <span class="code-comment">literal</span>
<span class="code-decoration"> info:</span> Assertion failed.
<span class="code-success">..........</span>
<span class="code-error">25 tests, 1 failures</span>
</pre></code>
<p>Note how the test framework has enough information to show the assertion code
as it was written in the source file, and can show the values for the left and
right of the <code>==</code> operator.</p>
<p>As well as operators it can also understand function calls and show what each
argument is.</p>
<pre><code><span class="code-success">........</span>
<span class="code-error"><b>assert</b></span> <span class="code-comment">test/my_app_test.gleam:353</span>
<span class="code-decoration"> test:</span> my_app_test.system_test
<span class="code-decoration"> code:</span> assert telecom.is_up(key, strict, 2025)
<span class="code-decoration">    0:</span> "My WIFI"
<span class="code-decoration">    1:</span> True
<span class="code-decoration">    2:</span> <span class="code-comment">literal</span>
<span class="code-decoration"> info:</span> My internet must always be up!
<span class="code-success">.................</span>
<span class="code-error">25 tests, 1 failures</span>
</pre></code>
<p>In that example there was a custom assertion message, displayed under the
<code>info</code> key. This is provided the same way as custom messages for Gleam&#39;s <code>todo</code>
and <code>panic</code> syntaxes, using the <code>as</code> keyword.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>system_test</span>() {
  <span class=hl-keyword>let</span> key = <span class=hl-string>&quot;My WIFI&quot;</span>
  <span class=hl-keyword>let</span> strict = <span class=hl-variant>True</span>

  <span class=hl-keyword>assert</span> <span class=hl-module>telecom</span>.<span class=hl-function>is_up</span>(key, strict, <span class=hl-number>2025</span>)
    <span class=hl-keyword>as</span> <span class=hl-string>&quot;My internet must always be up!&quot;</span>
}
</code></pre>
<p>Upgrading from <code>gleeunit</code>&#39;s assertion functions to the new <code>assert</code> syntax is a
slow and tedious job for a human to do, so Gears has made <a href="https://github.com/gearsDatapacks/asset">a helpful command
line tool</a> to do it automatically! Run
it and your codebase will be updated for you in just a second.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a> for this! It will
make a big difference to all Gleam programmers testing their programs.</p>
<h2 id="gleam-dev"><code>gleam dev</code></h2>
<p>A Gleam application typically has two <code>main</code> functions, one in <code>src/</code> for
running the application, and one in <code>test/</code> for running the tests. The
application main function can be run with the console command <code>gleam run</code>, and
the test one with the command <code>gleam test</code>.
This is easy enough to understand, but what if you have some other code you
need to run in development? For example, if you&#39;re making a backend web
application you might want to have some extra code that configures a local
development database, or compiles some frontend assets. Where would you put the
code that does this?</p>
<p>This is development code that you do not want to ship to production (extra code
and dependencies is a potential security risk), and having code that can make
destructive changes to the database in production is an accident waiting to
happen!</p>
<p>The traditional wisdom is to put a new module and <code>main</code> function the <code>test/</code>
directory (as this code isn&#39;t included in production) and then to run it with
<code>gleam run --module $THE_MODULE</code>. Placing non-test code in a directory called
<code>test</code> isn&#39;t very intuitive, so it&#39;s not uncommon for people to place it in
<code>src</code> instead, resulting in development code and dependencies accidentally
being published.</p>
<p>This release adds a new source directory for development code, <code>dev/</code>. Code in
the <code>dev/</code> directory can import <code>src/</code> code and use development dependencies,
and the <code>$PACKAGENAME_dev</code> module&#39;s <code>main</code> function can be run with the new
<code>gleam dev</code> console command. This should hopefully be a more satisfying and
easy to understand system, preventing future mistakes.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Help-with-understanding-immutability">Help with understanding immutability</h2>
<p>Gleam is an immutable language, which means that values are not updated
in-place, instead new values are constructed from older values, with the
desired changes applied. If you are familiar with mutable languages this may
seem inefficient, but immutable languages apply some <a href="https://en.wikipedia.org/wiki/Persistent_data_structure">clever
optimisations</a> to get
excellent performance and memory usage.</p>
<p>It&#39;s possible for people new to the immutable style to get confused,
accidentally discarding the new updated version of some data. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>call_api</span>(token: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>Response</span>(<span class=hl-variant>String</span>) {
  <span class=hl-keyword>let</span> req = <span class=hl-module>sdk</span>.<span class=hl-function>new_api_request</span>()
  <span class=hl-module>request</span>.<span class=hl-function>set_header</span>(req, <span class=hl-string>&quot;authentication&quot;</span>, <span class=hl-string>&quot;Bearer &quot;</span> <span class=hl-operator>&lt;&gt;</span> token)
  <span class=hl-module>http_client</span>.<span class=hl-function>send</span>(req)
}
</code></pre>
<p>Can you spot the bug?</p>
<p>The <code>set_header</code> function returns a new request value, but it is not assigned
to a variable, so the original request value without the <code>authentication</code>
header is sent instead. The bug is fixed by passing the output of each function
into the next one.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>call_api</span>(token: <span class=hl-variant>String</span>) -&gt; <span class=hl-variant>Response</span>(<span class=hl-variant>String</span>) {
  <span class=hl-module>sdk</span>.<span class=hl-function>new_api_request</span>()
  <span class=hl-operator>|&gt;</span> <span class=hl-module>request</span>.<span class=hl-function>set_header</span>(<span class=hl-string>&quot;authentication&quot;</span>, <span class=hl-string>&quot;Bearer &quot;</span> <span class=hl-operator>&lt;&gt;</span> token)
  <span class=hl-operator>|&gt;</span> <span class=hl-module>http_client</span>.<span class=hl-function>send</span>
}
</code></pre>
<p>To help avoid this mistake the compiler will now emit a warning when a function
without any side effects is called but the return value isn&#39;t used. For example
the following code:</p>
<pre><code><span class=hl-keyword>fn</span> <span class=hl-function>go</span>() -&gt; <span class=hl-variant>Int</span> {
  <span class=hl-function>add</span>(<span class=hl-number>1</span>, <span class=hl-number>2</span>)
  <span class=hl-function>add</span>(<span class=hl-number>3</span>, <span class=hl-number>4</span>)
}
</code></pre>
<p>Will produce the following warning:</p>
<pre><code><b><span class="code-warning">warning</span>: Unused value</b>
<span class="code-decoration">    ┌─</span> /src/main.gleam:4:3
<span class="code-decoration">    │</span>
<span class="code-decoration">  4 │</span>   <span class="code-warning">add(1, 2)</span>
<span class="code-decoration">    │</span>   <span class="code-warning">^^^^^^^^^ This value is never used</span>

This expression computes a value without any side effects, but then the
value isn't used at all. You might want to assign it to a variable, or
delete the expression entirely if it's not needed.
</pre></code>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="JavaScript-bit-array-improvements">JavaScript bit array improvements</h2>
<p>Gleam has a powerful literal syntax for constructing and parsing binary data, a
much loved feature common to BEAM languages. Gleam supports this syntax when
compiling to Erlang or to JavaScript, but some aspects of the syntax were not
yet usable on JavaScript. This release adds support for UTF-16 and UTF-32
encoded segments of data.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Playing-nicely-with-POSIX">Playing nicely with POSIX</h2>
<p>The Gleam build tool has a <code>gleam export erlang-shipment</code> command for compiling
and preparing a project for deployment to a server or similar. It includes a
script for starting the Erlang virtual machine and running the program, but
unfortunately it was written in a way that meant that the program would not
receive POSIX exit signals.</p>
<p><a href="https://github.com/devries">Christopher De Vries</a> has fixed this problem.
Thank you Christopher!</p>
<h2 id="Generated-documentation-improvements">Generated documentation improvements</h2>
<p>When publishing a package to Hex, the BEAM ecosystem package repository, the
Gleam build tool will generate and upload HTML documentation for the code.</p>
<p>When generating documentation, the build tool now prints type variable using
the same names as were used in the source code, making it easier to understand
what these type parameters are. For example, previously this function would
have been rendered like this:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>from_list</span>(entries: <span class=hl-variant>List</span>(#(a, b))) -&gt; <span class=hl-variant>Dict</span>(a, b)
</code></pre>
<p>But now is rendered as the following:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>from_list</span>(entries: <span class=hl-variant>List</span>(#(key, value))) -&gt; <span class=hl-variant>Dict</span>(key, value)
</code></pre>
<p>Another area of the documentation that has been improved is how types imported
from other modules are displayed. These types are now displayed with their
module qualifiers, and hovering over them shows the full module name. For
example, this code:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/dynamic/decode</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>something_decoder</span>() -&gt; decode.<span class=hl-variant>Decoder</span>(<span class=hl-variant>Something</span>) {
  ...
}
</code></pre>
<p>Will now generate the following documentation:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>something_decoder</span>() -&gt; decode.<span class=hl-variant>Decoder</span>(<span class=hl-variant>Something</span>)
</code></pre>
<p>Hovering over the <code>decode.Decoder</code> text will show the following:</p>
<pre><code class="language-txt">gleam/dynamic/decode.{type Decoder}
</code></pre>
<p>Clicking on <code>decode.Decoder</code> will take you to the documentation for that type.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Yet-more-fault-tolerance">Yet more fault tolerance</h2>
<p>Gleam&#39;s compiler implements <em>fault tolerant analysis</em>. This means that when
there is some error in the code that means it is invalid and cannot be compiled,
the compiler can still continue to analyse the code to the best of its ability,
ignoring the invalid parts. Because of this Gleam language server can have a
good understanding of the code and provide IDE feature even when the codebase is
in an invalid state.</p>
<p>This release makes the analysis of lists, tuples, negation operators, <code>panic</code>,
<code>echo</code> and <code>todo</code>, function parameters, and function labels fault tolerant.
We&#39;re covering all the last remaining little case to make the language server
information as fresh and accurate as possible!</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Labels-in-inexhaustive-case-expression-errors">Labels in inexhaustive case expression errors</h2>
<p>Gleam has exhaustiveness checking. This means that pattern matching flow
control must handle all the possible values that the type being matched on
could be. If there are any clauses missing then the program is incomplete,
and the compiler will return a helpful error showing the missing patterns.</p>
<p>This error has been improved to include record field labels, as can be seen at
the bottom of this example:</p>
<pre><code><b><span class="code-error">error</span>: Inexhaustive patterns</b>
<span class="code-decoration">  ┌─</span> /src/main.gleam:6:3
<span class="code-decoration">  │</span>
<span class="code-decoration">6 │</span> <span class="code-error">╭   case person {</span>
<span class="code-decoration">8 │</span> <span class="code-error">│     Teacher(name:) -&gt; io.println("Good morning!")</span>
<span class="code-decoration">7 │</span> <span class="code-error">│     Student(name: "Samara", age: 27) -&gt; io.println("Hello Samara!")</span>
<span class="code-decoration">9 │</span> <span class="code-error">│   }</span>
<span class="code-decoration">  │</span> <span class="code-error">╰───^</span>

This case expression does not have a pattern for all possible values. If it
is run on one of the values without a pattern then it will crash.

The missing patterns are:

    Student(name:, age:)
</pre></code>
<p>This improvement has also upgraded the code action to add missing patterns to a
<code>case</code> expression, now when the missing clauses are added to the code they will
include record labels.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Fill-labels-code-action-for-patterns">Fill labels code action for patterns</h2>
<p>The language server has a code action for filling in possible labels for a
function or record. This can be a convenient time saver when writing code,
especially if you can&#39;t immediately remember what labels the arguments use.</p>
<p>This code action has been upgraded to also work with records in patterns. In
this code the <code>Person</code> record pattern is missing two of its fields, so running
the code action will add them for you.</p>
<pre><code>pub type Person {
  Person(name: String, age: Int, job: String)
}

pub fn age(person: Person) {
<span class=hl-deletion>- let Person(age:) = person</span>
<span class=hl-addition>+ let Person(age:, name:, job:) = person</span>
  age
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Bit-array-truncation-warning">Bit array truncation warning</h2>
<p>The compiler now raises a warning when it can tell that an int segment
with a literal value is going to be truncated. This will help folks understand
a behaviour that may be unexpected.</p>
<pre><code><b><span class="code-warning">warning</span>: Truncated bit array segment</b>
<span class="code-decoration">    ┌─</span> /src/main.gleam:4:5
<span class="code-decoration">    │</span>
<span class="code-decoration">  4 │</span>   &lt;&lt;<span class="code-warning">258</span>&gt;&gt;
<span class="code-decoration">    │</span>     <span class="code-warning">^^^ You can safely replace this with 2</span>

This segment is 1 byte long, but 258 doesn't fit in that many bytes. It
would be truncated by taking its first byte, resulting in the value 2.
</pre></code>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Better-language-server-support-for-constants">Better language server support for constants</h2>
<p>Gleam&#39;s language server has historically been missing hover, autocompletion,
and go-to definition within constants. <a href="https://github.com/GearsDatapacks">Surya Rose</a>
has corrected this by implementing these features. Thank you Surya!</p>
<h2 id="Generate-function-code-action-improvements">Generate function code action improvements</h2>
<p>Gleam&#39;s language server has a code action for generating the outline of a
function that is used in the code but does not yet exist.</p>
<p>It has been upgraded to now choose better argument names based on the labels
and variables used. For example, if the code action is run on the
not-yet-defined function named <code>remove</code>:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>) {
  <span class=hl-keyword>let</span> list = [<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>]
  <span class=hl-keyword>let</span> number = <span class=hl-number>1</span>
  <span class=hl-function>remove</span>(each: number, in: list)
<span class=hl-comment>//^^^^^^ This function doesn&#39;t exist yet!</span>
}
</code></pre>
<p>The language server will then generate the outline of the missing function, and
the code will look like this:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>) {
  <span class=hl-keyword>let</span> list = [<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>]
  <span class=hl-keyword>let</span> number = <span class=hl-number>1</span>
  <span class=hl-function>remove</span>(each: number, in: list)
}

<span class=hl-keyword>fn</span> <span class=hl-function>remove</span>(each number: <span class=hl-variant>Int</span>, in list: <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>)) -&gt; <span class=hl-variant>List</span>(<span class=hl-variant>Int</span>) {
  <span class=hl-keyword>todo</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Generate-variant-code-action">Generate variant code action</h2>
<p>The language server now provides a code action to automatically generate a new
custom type variant, similar to the generate function code action.</p>
<p>In this example the <code>UserPressedButton</code> variant does not exist, but the
compiler can tell from the way that it is used that if it did exist it would be
a variant of the <code>Msg</code> custom type.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Msg</span> {
  <span class=hl-variant>ServerSentResponse</span>(<span class=hl-variant>Json</span>)
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>view</span>() -&gt; <span class=hl-variant>Element</span>(<span class=hl-variant>Msg</span>) {
  <span class=hl-function>div</span>([], [
    <span class=hl-function>button</span>([<span class=hl-function>on_click</span>(<span class=hl-variant>UserPressedButton</span>)], [<span class=hl-function>text</span>(<span class=hl-string>&quot;Press me!&quot;</span>)])
    <span class=hl-comment>//               ^^^^^^^^^^^^^^^^^ This doesn&#39;t exist yet!</span>
  ])
}
</code></pre>
<p>Triggering the code action on the <code>UserPressedButton</code> will add it to the <code>Msg</code>
type:</p>
<pre><code>pub type Msg {
  ServerSentResponse(Json)
<span class=hl-addition>+ UserPressedButton(String)</span>
}
</code></pre>
<p>The code action understood the code well enough to know that this new variant
holds a string value, as that is what the <code>on_click</code> function does with it in
this example. If the variant was used with labels then the labels would be
included in the definition also.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>! Another
excellent code action for &quot;top-down&quot; style programmers.</p>
<h2 id="Remove-unused-imports-code-action-improvements">Remove unused imports code action improvements</h2>
<p>For a long time the Gleam language server has included a code action for
removing unused imports, but it wouldn&#39;t work as well as desired for imports
that include unqualified types and values: they would still remain after
running the action.</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>a_module</span>.{<span class=hl-keyword>type</span> <span class=hl-variant>Unused</span>, unused, used}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  used
}
</code></pre>
<p>Triggering the code action will remove all unused types and values:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>a_module</span>.{used}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  used
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Windows-ARM-binaries">Windows ARM binaries</h2>
<p>We provide precompiled executables for each Gleam release, supporting Windows,
macOS, and Linux. Gleam users and package management systems can download and use these
executables instead of compiling the Gleam project from scratch, which takes a
long time.</p>
<p><a href="https://github.com/maennchen">Jonatan Männchen</a> has added an ARM64 Windows
build. This is useful as ARM based development machines are becoming more and
more common. Thank you Jonatan!</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:
<a href="https://github.com/arielherself">Ariel Parker</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/lpil">Louis Pilfold</a>, 
<a href="https://github.com/mdarse">Mathieu Darse</a>,
<a href="https://github.com/matiascr">Matias Carlander</a>,
<a href="https://github.com/scristobal">Samuel Cristobal</a>, and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>.</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.11.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members 
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a> 
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And especially our top sponsor: Lambda.</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/aexvir">Alex Viscreanu</a>
</li>
<li>
<a href="https://github.com/akoutmos">Alexander Koutmos</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/AndreHogberg">AndreHogberg</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/anthony-khong">Anthony Khong</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/bartekgorny">Bartek Górny</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettcannon">Brett Cannon</a>
</li>
<li>
<a href="https://github.com/brettkolodny">Brett Kolodny</a>
</li>
<li>
<a href="https://github.com/brian-dawn">Brian Dawn</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/ctdio">Charlie Duong</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/cvincent">Chris Vincent</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/insanitybit">Colin</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/comet-ml">Comet</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/sdaigo">Daigo Shitara</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/d2718">Dan</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/dangdennis">Dennis Dang</a>
</li>
<li>
<a href="https://github.com/dennistruemper">dennistruemper</a>
</li>
<li>
<a href="https://github.com/devinalvaro">devinalvaro</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/DoctorCobweb">DoctorCobweb</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://liberapay.com/ijomeli/">elke</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/EMRTS">EMR Technical Solutions</a>
</li>
<li>
<a href="https://github.com/yellowsman">Endo Shogo</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/olgam4">gamachexx</a>
</li>
<li>
<a href="https://github.com/allenap">Gavin Panella</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/brasilikum">Georg Hartmann</a>
</li>
<li>
<a href="https://github.com/george-grec">George</a>
</li>
<li>
<a href="https://github.com/gmartsenkov">Georgi Martsenkov</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham Vasquez</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/ildorn">Hannes Schnaitter</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/hayleigh-dot-dev">Hayleigh Thompson</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://github.com/losfair">Heyang Zhou</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">Isaac</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/bozso">István Bozsó</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jacobdalamb">Jacob Lamb</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jakob753951">Jakob Ladegaard Møller</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/jihem">Jean-Marc QUERE</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jiangplus">jiangplus</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/jmpavlick">John Pavlick</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/Kamila-P">KamilaP</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/hamptokr">Kramer Hampton</a>
</li>
<li>
<a href="https://github.com/Bearfinn">Kritsada Sunthornwutthikrai</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/leah-u">Leah Ulmschneider</a>
</li>
<li>
<a href="https://github.com/leostera">Leandro Ostera</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/rcoder">Lennon Day-Reynolds</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/LilyRose2798">Lily Rose</a>
</li>
<li>
<a href="https://github.com/lucaspellegrinelli">Lucas Pellegrinelli</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/2kool4idkwhat">Luna</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/ideaMarcos">Marcos</a>
</li>
<li>
<a href="https://github.com/marcusandre">marcusandre</a>
</li>
<li>
<a href="https://github.com/AYM1607">Mariano Uvalle</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/mkdynamic">Mark Dodwell</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/martonkaufmann">martonkaufmann</a>
</li>
<li>
<a href="https://github.com/mwarger">Mat Warger</a>
</li>
<li>
<a href="https://github.com/han-tyumi">Matt Champagne</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matthewrobinsondev">Matt Robinson</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/mwhitworth">Matthew Whitworth</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/amiroff">Metin Emiroğlu</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/mrmcc3">Michael McClintock</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nathanielknight">Nathaniel Knight</a>
</li>
<li>
<a href="https://github.com/NFIBrokerage">NFIBrokerage</a>
</li>
<li>
<a href="https://github.com/nchapman">Nick Chapman</a>
</li>
<li>
<a href="https://github.com/ndreynolds">Nick Reynolds</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/blink1415">Nikolai Steen Kjosnes</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/oceanlewis">Ocean</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/nnuuvv">ollie</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/pierrot-lc">Pierrot</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/raquentin">Race Williams</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/renatillas">re.natillas</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://liberapay.com/Karakunai/">Ronan Harris</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/soulsam480">sambit</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/seanjensengrey">Sean Jensen-Grey</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/honsq90">Shuqian Hon</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/sthagen">Stefan Hagen</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/ernstla">Thomas Ernst</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/lucamtudor">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/tymak">tymak</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/bondiano">Vassiliy Kuzenkov</a>
</li>
<li>
<a href="https://github.com/sandsower">Vic Valenzuela</a>
</li>
<li>
<a href="https://github.com/rodrigues">Victor Rodrigues</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/Willyboar">Willyboar</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/HymanZHAN">Xucong Zhan</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">yoshi~</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Global rename and find references</title><id>https://gleam.run/news/global-rename-and-find-references</id><updated>2025-04-14T00:00:00Z</updated><published>2025-04-14T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/global-rename-and-find-references" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type-safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.10.0">v1.10.0</a> has been published. Here&#39;s
what&#39;s new:</p>
<h2 id="Project-wide-call-reference-graph">Project-wide call reference graph</h2>
<p>The compiler has been upgraded to retain more information about the types
and values and how they reference each other in Gleam programs. With this
information the language server (which is included within the <code>gleam</code> binary)
now provides the &quot;find references&quot; feature, so you can find everywhere in your
project where a type or value is used.</p>
<p>The additional information has also been used to improve the &quot;rename&quot; language
server feature. Previously only module-local types and values could be renamed,
but now renaming can be performed across all modules in a project.</p>
<p>Lastly the compiler&#39;s unused-code detection has been greatly improved, fixing
some situations in which it would fail to detect it all previously.</p>
<p>Thank you to <a href="https://github.com/GearsDatapacks">Surya Rose</a> for implementing
this! It is probably our most anticipated addition within the community!</p>
<h2 id="Improved-exhaustiveness-analysis">Improved exhaustiveness analysis</h2>
<p>Gleam&#39;s compiler performs exhaustiveness analysis, ensuring that all possible
variants of the value are handled in flow control, and that there are no
redundant cases which are not reachable due to previous cases.</p>
<p><a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> has spent the time
since the previous release studying the academic literature on the complex
subject of exhaustiveness checking to bring a variety of improvements to our
implementation. The first of these changes has made it into this release:
string pattern analysis. Previously only rudimentary analysis was performed on
strings, and unreachable string patterns could not be detected.</p>
<pre><code><span class=hl-keyword>case</span> a_string {
  <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>&lt;&gt;</span> name -&gt; name
  <span class=hl-string>&quot;Hello, Jak&quot;</span> -&gt; <span class=hl-string>&quot;Jak&quot;</span>
  _ -&gt; <span class=hl-string>&quot;Stranger&quot;</span>
}
</code></pre>
<p>In this code the first pattern matches all the values that the second pattern
matches, so the second pattern is not reachable. The compiler now emits this
warning:</p>
<pre><code>warning: Unreachable case clause
  ┌─ /src/greet.gleam:7:5
  │
7 │     &quot;Hello, Jak&quot; -&gt; &quot;Jak&quot;
  │     ^^^^^^^^^^^^^^^^^^^^^

This case clause cannot be reached as a previous clause matches the same
values.

Hint: It can be safely removed.
</code></pre>
<p>Thank you Giacomo! Excellent work!</p>
<p>Alongside that the compiler now emits a warning when using <code>let assert</code> to
assert a value whose variant has already been inferred, such as in this code:</p>
<pre><code><span class=hl-keyword>let</span> e = <span class=hl-variant>Error</span>(<span class=hl-string>&quot;Some error&quot;</span>)
<span class=hl-keyword>let</span> <span class=hl-keyword>assert</span> <span class=hl-variant>Ok</span>(_) = e <span class=hl-comment>// warning: Pattern will never match</span>
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Operator-analysis-improvements">Operator analysis improvements</h2>
<p>Gleam&#39;s compiler is fault tolerant, meaning that when an error is encountered
in the code it does not stop immediately, instead it shows the error to the
programmer, makes a best-effort attempts to recover and continue analysing
the rest of the code. This behaviour is vital for the language server to
have information about the code even when it&#39;s in an invalid state.</p>
<p>The analysis of binary operators such as <code>+</code> and <code>==</code> have been improved so
that both sides will be checked even in the presence errors. This improves
language server information in some situations, and it also enables improved
error messages.</p>
<p>Gleam doesn&#39;t have operator overloading or interfaces, so each operator works
with a specific type. For example <code>+</code> is only for adding ints, and string
concatenation is done with the <code>&lt;&gt;</code> operator. Previously the error message for
the wrong operator would point to the value and say it is of the wrong type,
but now it points to the operator itself and tells you what the correct
operator would be:</p>
<pre><code class="language-txt">error: Type mismatch
  ┌─ /src/wibble.gleam:2:13
  │
2 │   &quot;Hello, &quot; + &quot;Lucy&quot;
  │             ^ Use &lt;&gt; instead

The + operator can only be used on Ints.
To join two strings together you can use the &lt;&gt; operator.
</code></pre>
<p>The language server willl also offer a code action to fix the error
for you in your editor.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>+</span> <span class=hl-string>&quot;Jak&quot;</span>
<span class=hl-comment>//^^^^^^^^^^^^^^^^^ When hovering anywhere over here</span>
}
</code></pre>
<p>Triggering the code action would fix the compilation error by using the
correct <code>&lt;&gt;</code> operator instead of <code>+</code>:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-string>&quot;Hello, &quot;</span> <span class=hl-operator>&lt;&gt;</span> <span class=hl-string>&quot;Jak&quot;</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Bit-array-improvements">Bit array improvements</h2>
<p>Gleam&#39;s bit array literal syntax provides a powerful and convenient way to
construct and parse binary data.</p>
<p>It is fully supported when targeting the Erlang virtual machine, but some bit
array literals were not fully supported when targeting JavaScript.
<a href="https://github.com/GearsDatapacks">Surya Rose</a> has added support for the
<code>unit</code> option to control the units of the <code>size</code> option, and
<a href="https://github.com/richard-viney">Richard Viney</a> has added support for 16-bit
floats.</p>
<p><a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> has made it possible
to omit the <code>:float</code> option when used with float literals, as the intention is
unambiguous.
These two literals are now equivalent, while previously the former would be a
type error due to lacking sufficient annotations.</p>
<pre><code>&lt;&lt;<span class=hl-number>1.11</span>&gt;&gt;
&lt;&lt;<span class=hl-number>1.11</span>:float&gt;&gt;
</code></pre>
<p>Thank you Surya, Richard, and Giacomo!</p>
<h2 id="JavaScript-codegen-performance-improvements">JavaScript codegen performance improvements</h2>
<p><a href="https://github.com/GearsDatapacks">Surya Rose</a> has improved the JavaScript
code generation to make the code run faster. Where possible
the compiler restructures code to no longer use JavaScript &quot;immediately invoked
function expressions&quot;, removing the overhead of allocating and then calling
these functions.</p>
<p>This is the first of a series of JavaScript performance improvements we are
currently working on, and our initial benchmarks show they will be impactful,
improving the performance of all Gleam programs that compile to JavaScript
without any modification to the programs themeselves.</p>
<p>Thank you Surya!</p>
<h2 id="Cross-platform-deployment-artefacts">Cross platform deployment artefacts</h2>
<p>BEAM bytecode is portable. You can compile your Erlang, Elixir, or Gleam
program on one machine and run it on another with a different operating system
and processor architecture.</p>
<p>One annoyance if you were doing this with Gleam was that the <code>gleam export erlang-shipment</code>
command would try to be clever and give you an entrypoint script for the
operating system you are currently using, so if you compiled on Windows to run
on Linux then you would be missing the POSIX shell entrypoint script.</p>
<p><a href="https://github.com/ummon">Greg Burri</a> has resolved this problem by having the
build tool include all entrypoint scripts, regardless of the operating system
used to build the artefact. Thank you Greg!</p>
<h2 id="Package-information-export">Package information export</h2>
<p><a href="https://github.com/Papipo">Rodrigo Álvarez</a> has created the <code>gleam export package-information</code>
command, which will write information about a Gleam package to file in JSON
format. This information may be useful to other build tools that wish to
compile Gleam code, and Rodrigo is exploring adding support for Gleam
dependencies to Elixir&#39;s Mix build tool.</p>
<p>Thank you Rodrigo! This will be especially exciting for Elixir programmers as
many folks use Gleam and Elixir together.</p>
<h2 id="Fill-unused-fields-code-action">Fill unused fields code action</h2>
<p>The language server can now offer a code action to replace a <code>..</code> in a pattern
with all the fields that it was being used to ignore. For example triggering
the code action on this code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Pokemon</span> {
  <span class=hl-variant>Pokemon</span>(id: <span class=hl-variant>Int</span>, name: <span class=hl-variant>String</span>, moves: <span class=hl-variant>List</span>(<span class=hl-variant>String</span>))
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> <span class=hl-variant>Pokemon</span>(..) = <span class=hl-keyword>todo</span>
  <span class=hl-comment>//          ^ If you put your cursor here</span>
}
</code></pre>
<p>Would result in the code being edited like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Pokemon</span> {
  <span class=hl-variant>Pokemon</span>(id: <span class=hl-variant>Int</span>, name: <span class=hl-variant>String</span>, moves: <span class=hl-variant>List</span>(<span class=hl-variant>String</span>))
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> <span class=hl-variant>Pokemon</span>(id:, name:, moves:) = <span class=hl-keyword>todo</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Improved-JSON-encoder-generation-code-action">Improved JSON encoder generation code action</h2>
<p>The function generated by the &quot;Generate JSON encoder&quot; code action will now fail
to compile if the type has new fields added. The motivation for this may not be
immediately clear, so let&#39;s dig into that a little.</p>
<p>Gleam&#39;s development philosophy is to use static analysis, editor tooling, and
other forms of computer assistance to reduce the mental load for the programmer
as much as possible. With the previous design if the data type definition was
edited the programmer would have to remember about the existance of the JSON
encoder, making it possible to forget and accidentally introduce a bug. With
the new behaviour this mistake is no longer possible.</p>
<p>Here is an example of a type and the encoder function that the language server
will now generate for it. Note the new pattern matching with <code>let</code>.</p>
<pre><code><span class=hl-keyword>type</span> <span class=hl-variant>Person</span> {
  <span class=hl-variant>Person</span>(name: <span class=hl-variant>String</span>, age: <span class=hl-variant>Int</span>)
}

<span class=hl-keyword>fn</span> <span class=hl-function>encode_person</span>(person: <span class=hl-variant>Person</span>) -&gt; json.<span class=hl-variant>Json</span> {
  <span class=hl-keyword>let</span> <span class=hl-variant>Person</span>(name:, age:) = person
  <span class=hl-module>json</span>.<span class=hl-function>object</span>([
    #(<span class=hl-string>&quot;name&quot;</span>, <span class=hl-module>json</span>.<span class=hl-function>string</span>(name)),
    #(<span class=hl-string>&quot;age&quot;</span>, <span class=hl-module>json</span>.<span class=hl-function>int</span>(age)),
  ])
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Remove-echo-code-action">Remove echo code action</h2>
<p>Gleam has the <code>echo</code> keyword for debug printing. It&#39;s convenient for quickly
understanding runtime behaviour of code, but it should never be included in
production code and the build tool will refuse to publish code that uses it.</p>
<p>The language server now offers a code action to remove all <code>echo</code>s in a
module. For example:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>echo</span> <span class=hl-number>1</span> <span class=hl-operator>+</span> <span class=hl-number>2</span>
}
</code></pre>
<p>Triggering the code action would remove the <code>echo</code>:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-number>1</span> <span class=hl-operator>+</span> <span class=hl-number>2</span>
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Extract-constant-code-action">Extract constant code action</h2>
<p>The language server now offers the option to lift non-dynamic expressions into
constants. If the code action is run on the list literal here:</p>
<pre><code><span class=hl-keyword>const</span> lucy = <span class=hl-string>&quot;Lucy&quot;</span>

<span class=hl-keyword>const</span> nubi = <span class=hl-string>&quot;Nubi&quot;</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>list</span>.<span class=hl-function>each</span>([lucy, nubi, <span class=hl-string>&quot;Biffy&quot;</span>], io.println)
}
</code></pre>
<p>The code is updated like so:</p>
<pre><code><span class=hl-keyword>const</span> lucy = <span class=hl-string>&quot;Lucy&quot;</span>

<span class=hl-keyword>const</span> nubi = <span class=hl-string>&quot;Nubi&quot;</span>

<span class=hl-keyword>const</span> values = [lucy, nubi, <span class=hl-string>&quot;Biffy&quot;</span>]

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>list</span>.<span class=hl-function>each</span>(values, io.println)
}
</code></pre>
<p>Thank you <a href="https://github.com/matiascr">Matias Carlander</a>!</p>
<h2 id="Wrap-in-block-code-action">Wrap in block code action</h2>
<p>The language server will offer to wrap assignment or case clause values in
blocks. This is is a convenience for when adding more expressions to some existing
code that previous only had one expression, making everyday Gleam editing that
little bit easier.</p>
<p>For example, with this code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>f</span>(pokemon_type: <span class=hl-variant>PokemonType</span>) {
  <span class=hl-keyword>case</span> pokemon_type {
    <span class=hl-variant>Water</span> -&gt; <span class=hl-function>soak</span>()
    <span class=hl-comment>//       ^^^^^^ Cursor within this expression</span>
    <span class=hl-variant>Fire</span> -&gt; <span class=hl-function>burn</span>()
  }
}
</code></pre>
<p>Triggering the code action results in the code being updated like so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>f</span>(pokemon_type: <span class=hl-variant>PokemonType</span>) {
  <span class=hl-keyword>case</span> pokemon_type {
    <span class=hl-variant>Water</span> -&gt; {
      <span class=hl-function>soak</span>()
    }
    <span class=hl-variant>Fire</span> -&gt; <span class=hl-function>burn</span>()
  }
}
</code></pre>
<p>Thank you <a href="https://github.com/matiascr">Matias Carlander</a>!</p>
<h2 id="Security-and-compliance">Security and compliance</h2>
<p>Gleam&#39;s <a href="https://github.com/gleam-lang/gleam/pkgs/container/gleam">container images</a>
now contain Software Bill of Materials (SBoM) and Supply-chain
Levels for Software Artifacts (SLSA) Provenance information.</p>
<p>This will greatly help with security audits and compliance of software written
with Gleam, and is part of an ongoing effort to evidence production readiness
and promote Gleam adoption within enterprise. This is well timed, as Gleam has
just featured in the <a href="https://www.thoughtworks.com/radar/languages-and-frameworks/gleam">Thoughtworks technology radar</a>
for the first time!</p>
<p>Thank you to <a href="https://github.com/maennchen">Jonatan Männchen</a> and the
<a href="https://erlef.org/">Erlang Ecosystem Foundation</a> for this and their ongoing
support of Gleam and Gleam companies.</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and experience polishers:
<a href="https://github.com/AlecGhost">Alexander Keleschovsky</a>,
<a href="https://github.com/drewolson">Drew Olson</a>,
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>, 
<a href="https://github.com/lpil">Louis Pilfold</a>, 
<a href="https://github.com/matiascr">Matias Carlander</a>, 
<a href="http://github.com/sbergen">Sakari Bergen</a>, 
<a href="https://github.com/metruzanca">Sam Zanca</a>,
<a href="https://github.com/scristobal">Samuel Cristobal</a>, and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>.</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.10.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members 
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a> 
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And especially our top sponsor: Lambda.</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/eelmafia">Alex</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/aexvir">Alex Viscreanu</a>
</li>
<li>
<a href="https://github.com/akoutmos">Alexander Koutmos</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/AndreHogberg">AndreHogberg</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/anthony-khong">Anthony Khong</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/bartekgorny">Bartek Górny</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/drteeth">Benjamin Moss</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/borislav-rangelov">Borislav Rangelov</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brendisurfs">Brendan P.</a>
</li>
<li>
<a href="https://github.com/brettkolodny">brettkolodny</a>
</li>
<li>
<a href="https://github.com/brian-dawn">Brian Dawn</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/ctdio">Charlie Duong</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/clangley">clangley</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/insanitybit">Colin</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/comet-ml">Comet</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/sdaigo">Daigo Shitara</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/davesnx">David Sancho</a>
</li>
<li>
<a href="https://github.com/dangdennis">Dennis Dang</a>
</li>
<li>
<a href="https://github.com/dennistruemper">dennistruemper</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/dmmulroy">Dillon Mulroy</a>
</li>
<li>
<a href="https://github.com/gothy">Dima Utkin</a>
</li>
<li>
<a href="https://github.com/DoctorCobweb">DoctorCobweb</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/dbanty">Dylan Anthony</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/EMRTS">EMR Technical Solutions</a>
</li>
<li>
<a href="https://github.com/yellowsman">Endo Shogo</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/allenap">Gavin Panella</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/brasilikum">Georg Hartmann</a>
</li>
<li>
<a href="https://github.com/george-grec">George</a>
</li>
<li>
<a href="https://github.com/gmartsenkov">Georgi Martsenkov</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham Vasquez</a>
</li>
<li>
<a href="https://github.com/YoyoSaur">Grant Everett</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/ildorn">Hannes Schnaitter</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/hayleigh-dot-dev">Hayleigh Thompson</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://github.com/losfair">Heyang Zhou</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/human154">human154</a>
</li>
<li>
<a href="https://github.com/hpiaia">Humberto Piaia</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">Isaac</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/bozso">István Bozsó</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jacobdalamb">Jacob Lamb</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jakob753951">Jakob Ladegaard Møller</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/hypirion">Jean Niklas L&#39;orange</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/jihem">Jean-Marc QUERE</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/shepherdjerred">Jerred Shepherd</a>
</li>
<li>
<a href="https://github.com/jiangplus">jiangplus</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/jmpavlick">John Pavlick</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/Nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/hamptokr">Kramer Hampton</a>
</li>
<li>
<a href="https://github.com/Bearfinn">Kritsada Sunthornwutthikrai</a>
</li>
<li>
<a href="https://github.com/krystofrezac">Kryštof Řezáč</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof Gasienica-Bednarz</a>
</li>
<li>
<a href="https://github.com/leostera">Leandro Ostera</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/lexx27">Lexx</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/LilyRose2798">Lily Rose</a>
</li>
<li>
<a href="https://github.com/nnuuvv">liv</a>
</li>
<li>
<a href="https://github.com/wowi42">Loïc Tosser</a>
</li>
<li>
<a href="https://github.com/lucaspellegrinelli">Lucas Pellegrinelli</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/2kool4idkwhat">Luna</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/ideaMarcos">Marcos</a>
</li>
<li>
<a href="https://github.com/marcusandre">marcusandre</a>
</li>
<li>
<a href="https://github.com/AYM1607">Mariano Uvalle</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/datayja">Markéta Lisová</a>
</li>
<li>
<a href="https://github.com/foresterre">Martijn Gribnau</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/martonkaufmann">martonkaufmann</a>
</li>
<li>
<a href="https://github.com/han-tyumi">Matt Champagne</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matthewrobinsondev">Matt Robinson</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/matthewj-dev">Matthew Jackson</a>
</li>
<li>
<a href="https://github.com/mwhitworth">Matthew Whitworth</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/amiroff">Metin Emiroğlu</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/mrmcc3">Michael McClintock</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nathanielknight">Nathaniel Knight</a>
</li>
<li>
<a href="https://github.com/NFIBrokerage">NFIBrokerage</a>
</li>
<li>
<a href="https://github.com/nchapman">Nick Chapman</a>
</li>
<li>
<a href="https://github.com/ndreynolds">Nick Reynolds</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/blink1415">Nikolai Steen Kjosnes</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/oceanlewis">Ocean</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/biernacki">Pawel Biernacki</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/pierrot-lc">Pierrot</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/raquentin">Race Williams</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/ray-delossantos">Ray</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/renatillas">re.natillas</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://liberapay.com/Karakunai/">Ronan Harris</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/mooreryan">Ryan Moore</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/soulsam480">sambit</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seancribbs">Sean Cribbs</a>
</li>
<li>
<a href="https://github.com/seanjensengrey">Sean Jensen-Grey</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/sekunho">sekun</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/honsq90">Shuqian Hon</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">simone</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/sthagen">Stefan Hagen</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/stvpwrs">Steve Powers</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/ernstla">Thomas Ernst</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/lucamtudor">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/tymak">tymak</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/bondiano">Vassiliy Kuzenkov</a>
</li>
<li>
<a href="https://github.com/sandsower">Vic Valenzuela</a>
</li>
<li>
<a href="https://github.com/rodrigues">Victor Rodrigues</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/enkerewpo">wheatfox</a>
</li>
<li>
<a href="https://github.com/Willyboar">Willyboar</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/HymanZHAN">Xucong Zhan</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">yoshi~</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Hello echo! Hello git!</title><id>https://gleam.run/news/hello-echo-hello-git</id><updated>2025-03-08T00:00:00Z</updated><published>2025-03-08T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/hello-echo-hello-git" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type-safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.9.0">v1.9.0</a> has been published. Let&#39;s
take a look!</p>
<h2 id="Echo-debug-printing">Echo debug printing</h2>
<p>There are debuggers you can use with Gleam, however the most popular ways
to understand the runtime behaviour of a Gleam program is through writing tests
and through print debugging.</p>
<p>The standard library function <code>io.debug</code> is most commonly used for print
debugging. It takes a value of any type, uses target specific runtime
reflection to turn it into a string of Gleam syntax, and then prints it to
standard-error. This works well, but there are some ways in which this function
is not optimal:</p>
<ul>
<li>
Functions don&#39;t know anything about where they are called from, so it&#39;s not
possible to print the location of the <code>io.debug</code> call along with the value
being printed.
</li>
<li>
There&#39;s no way for the compiler or build tool to know this is a special
function which is only for debugging, so they are unable to prevent you from
accidentally publishing packages that still have debug code in them.
</li>
<li>
Runtime reflection is used to make a string representation of the value, so
any information that no longer exists after compile time cannot be used. This
results in <code>io.debug</code> relying on heuristics to decide how to show the value,
and this can be at-times incorrect.
</li>
</ul>
<p>To improve on this the <code>echo</code> keyword has been introduced. Prefix an expression
with it and the value will be printed to standard-error, along with the path to
the file and line containing the echo expression, so you can click to jump to it
in your editor.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>echo</span> [<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>]
}
</code></pre>
<p>The output of this program will look like this:</p>
<pre><code class="no-highlight"><span class="code-prompt">src/main.gleam:2</span>
[1, 2, 3]</code></pre>
<p>It can also be used in pipelines. Here the list returned by the first <code>list.map</code>
call will be printed.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  [<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>]
  <span class=hl-operator>|&gt;</span> <span class=hl-module>list</span>.<span class=hl-function>map</span>(<span class=hl-keyword>fn</span>(x) { x <span class=hl-operator>+</span> <span class=hl-number>1</span> })
  <span class=hl-operator>|&gt;</span> <span class=hl-keyword>echo</span>
  <span class=hl-operator>|&gt;</span> <span class=hl-module>list</span>.<span class=hl-function>map</span>(<span class=hl-keyword>fn</span>(x) { x <span class=hl-operator>*</span> <span class=hl-number>2</span> })
}
</code></pre>
<p>The build tool is aware this is for debugging, so it&#39;ll let you know if you
forget to remove it before publishing a package for others to use.</p>
<p>Currently it uses the same runtime reflection and heuristics to format the
output, but in future it&#39;ll be enhanced to make use of the compiler&#39;s static
analysis.</p>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>! We had all
manner of annoying CI-related problems when implementing the integration tests
for this feature, Jak&#39;s a very patient and determined programmer indeed!</p>
<h2 id="Git-dependencies">Git dependencies</h2>
<p>There are times when we wish to try out early prototype versions of libraries we
have made in our applications. It may be tempting to publish these unfinished
packages to the package manager, but this would be inappropriate! Only
production-ready packages should be published for other people to use, the Gleam
package ecosystem is to be high quality and easy to depend upon safely.</p>
<p>As a more suitable alternative the build tool now supports depending on packages
within git repositories. Add the git or HTTP URL of a repository along with a
tag, branch, or commit SHA, and the build tool will download it for you and then
treat it like a regular Gleam dependency package.</p>
<pre><code><span class=hl-module>[dependencies]</span>
<span class=hl-function>gleam_stdlib </span>= { git = "https://github.com/gleam-lang/stdlib.git", ref = "957b83b" }
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a> for this much
anticipated feature.</p>
<h2 id="More-powerful-bit-arrays-on-JavaScript">More powerful bit arrays on JavaScript</h2>
<p>Gleam&#39;s bit array syntax allows you to construct and parse binary data in a way
that may be easier to understand than using binary operators. Historically bit
arrays had to be byte aligned, meaning they had to have a number of bits that
was divisible by 8. <a href="https://github.com/richard-viney">Richard Viney</a> has done
some incredible work and lifted this limitation. Thank you Richard!</p>
<p><a href="https://github.com/GearsDatapacks">Surya Rose</a> has also been lifting
JavaScript bit array restrictions, enabling the usage of dynamically sized
segments in bit array patterns. Thank you Surya!</p>
<h2 id="Faster-list-pattern-matching-on-JavaScript">Faster list pattern matching on JavaScript</h2>
<p>The list type is one of Gleam&#39;s primary data structures, it is used very heavily
in Gleam programs. <a href="https://github.com/yoshi-monster">yoshi~</a> has been working
hard to identify potential performance optimisations for the virtual-DOM
implementation of the <a href="https://github.com/lustre-labs/lustre">Lustre</a> framework,
and in the process they identified a way to improve the JavaScript code we
generate when pattern matching on lists.</p>
<p>Programs that compile to JavaScript and make heavy use of list prefix patterns
may now be up to twice as fast!</p>
<h2 id="Go-to-type-definition">Go-to type definition</h2>
<p>Gleam&#39;s built-in language server brings IDE-like functionality to all editors
that support the language server protocol. It has had support for go-to
definition for some time, but with this release <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
has added support for go-to type definition. Place your cursor on an expression
and trigger the feature and the language server will identify the types of all
the values used in the expression and present their definitions for you to view
and to jump to. Thank you Jak!</p>
<h2 id="HexDocs-search-integration">HexDocs search integration</h2>
<p>When a Gleam package is published HTML documentation is generated and published
to HexDocs for users to read. HexDocs have been improving their search
functionality to search for types and functions with in packages themselves, and 
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a> has updated Gleam&#39;s
documentation generator to implement the search index interface so Gleam
packages are included in the search. Thank you Diemo!</p>
<p>Another option for searching within Gleam packages is <a href="https://gloogle.run/search?q=fn%28Int,%20Int%29%20-%3E%20Order">Gloogle</a>,
a Gleam community project, which can even search by function type signature.</p>
<h2 id="Custom-CA-certificates-support">Custom CA certificates support</h2>
<p>Some enterprise networks may perform TLS interception for security reasons. In
these environments custom CA certificates must be used as otherwise requests
will get TLS errors due to the unknown authority of the injected certificates.</p>
<p>The new <code>GLEAM_CACERTS_PATH</code> environment variable can be used to specify a
path to CA certificates for Gleam to use when interacting with the Hex package
manager servers, making Gleam usable in these enterprise environments.
Thank you <a href="https://github.com/winstxnhdw">winstxnhdw</a>!</p>
<h2 id="Convert-to-and-from-pipeline-code-actions">Convert to and from pipeline code actions</h2>
<p>Gleam&#39;s much-loved pipe syntax gives programmers another way to write nested
function calls so that they read top-to-botton and left-to-right.</p>
<p>Two new language server code actions have been added to help you refactor
between the pipe syntax and regular function call syntax. Triggering them on
these two code examples will edit your code to match the other.</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/list</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>list</span>.<span class=hl-function>map</span>([<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>], double)
}
</code></pre>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/list</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  [<span class=hl-number>1</span>, <span class=hl-number>2</span>, <span class=hl-number>3</span>] <span class=hl-operator>|&gt;</span> <span class=hl-module>list</span>.<span class=hl-function>map</span>(double)
}
</code></pre>
<p>You can also choose to pipe arguments other than the first by selecting them in
your editor before triggering the code action. Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="Generate-JSON-encoder-code-action">Generate JSON encoder code action</h2>
<p>Many Gleam programs make use of JSON, a common text-based data exchange format.
With this release the Gleam language server now offers a code action to generate
a function to convert a type into JSON using the <code>gleam_json</code> library. Given
this type definition:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Person</span> {
  <span class=hl-variant>Person</span>(name: <span class=hl-variant>String</span>, age: <span class=hl-variant>Int</span>)
}
</code></pre>
<p>If the code action is triggered on the type definition this function will be
generated:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/json</span>

<span class=hl-keyword>fn</span> <span class=hl-function>encode_person</span>(person: <span class=hl-variant>Person</span>) -&gt; json.<span class=hl-variant>Json</span> {
  <span class=hl-module>json</span>.<span class=hl-function>object</span>([
    #(<span class=hl-string>&quot;name&quot;</span>, <span class=hl-module>json</span>.<span class=hl-function>string</span>(person.name)),
    #(<span class=hl-string>&quot;age&quot;</span>, <span class=hl-module>json</span>.<span class=hl-function>int</span>(person.age)),
  ])
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a> for this code action!</p>
<h2 id="Inline-variable-code-action">Inline variable code action</h2>
<p>The Gleam language server now offers a code action that will inline a variable
that is used only once.</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/io</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> greeting = <span class=hl-string>&quot;Hello!&quot;</span>
  <span class=hl-module>io</span>.<span class=hl-function>println</span>(greeting)
}
</code></pre>
<p>If the code action is triggered on the <code>greeting</code> variable the code will be
edited like so:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/io</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>io</span>.<span class=hl-function>println</span>(<span class=hl-string>&quot;Hello!&quot;</span>)
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Generate-multi-variant-decoder-code-action">Generate multi-variant decoder code action</h2>
<p>Gleam&#39;s <code>Dynamic</code> type represents data of unknown shape that comes from outside
of the Gleam program, for example data sent to a HTTP server as JSON. To convert
data from dynamic into known Gleam types the decoder API is used.</p>
<p>A previous release added convenient a code action which would generate a dynamic
decoder for a given type definition. With this release this code action has been
extended to support multi-variant custom types. For example, given this type
definition:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Person</span> {
  <span class=hl-variant>Adult</span>(age: <span class=hl-variant>Int</span>, job: <span class=hl-variant>String</span>)
  <span class=hl-variant>Child</span>(age: <span class=hl-variant>Int</span>, height: <span class=hl-variant>Float</span>)
}
</code></pre>
<p>If the code action is triggered on it then this function will be generated:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/dynamic/decode</span>

<span class=hl-keyword>fn</span> <span class=hl-function>person_decoder</span>() -&gt; decode.<span class=hl-variant>Decoder</span>(<span class=hl-variant>Person</span>) {
  <span class=hl-keyword>use</span> variant &lt;- <span class=hl-module>decode</span>.<span class=hl-function>field</span>(<span class=hl-string>&quot;type&quot;</span>, decode.string)
  <span class=hl-keyword>case</span> variant {
    <span class=hl-string>&quot;adult&quot;</span> -&gt; {
      <span class=hl-keyword>use</span> age &lt;- <span class=hl-module>decode</span>.<span class=hl-function>field</span>(<span class=hl-string>&quot;age&quot;</span>, decode.int)
      <span class=hl-keyword>use</span> job &lt;- <span class=hl-module>decode</span>.<span class=hl-function>field</span>(<span class=hl-string>&quot;job&quot;</span>, decode.string)
      <span class=hl-module>decode</span>.<span class=hl-function>success</span>(<span class=hl-variant>Adult</span>(age:, job:))
    }
    <span class=hl-string>&quot;child&quot;</span> -&gt; {
      <span class=hl-keyword>use</span> age &lt;- <span class=hl-module>decode</span>.<span class=hl-function>field</span>(<span class=hl-string>&quot;age&quot;</span>, decode.int)
      <span class=hl-keyword>use</span> height &lt;- <span class=hl-module>decode</span>.<span class=hl-function>field</span>(<span class=hl-string>&quot;height&quot;</span>, decode.float)
      <span class=hl-module>decode</span>.<span class=hl-function>success</span>(<span class=hl-variant>Child</span>(age:, height:))
    }
    _ -&gt; <span class=hl-module>decode</span>.<span class=hl-function>failure</span>(<span class=hl-keyword>todo</span> <span class=hl-keyword>as</span> <span class=hl-string>&quot;Zero value for Person&quot;</span>, <span class=hl-string>&quot;Person&quot;</span>)
  }
}
</code></pre>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="String-interpolate-code-action">String interpolate code action</h2>
<p>The language server now offers a convenient code action to interpolate a value
into a string easily. If the cursor is inside a literal string the language
server will offer to split it:</p>
<pre><code><span class=hl-string>&quot;wibble | wobble&quot;</span>
<span class=hl-comment>//      ^ Triggering the action with the cursor</span>
<span class=hl-comment>//        here will produce this:</span>
<span class=hl-string>&quot;wibble &quot;</span> <span class=hl-operator>&lt;&gt;</span> <span class=hl-keyword>todo</span> <span class=hl-operator>&lt;&gt;</span> <span class=hl-string>&quot; wobble&quot;</span>
</code></pre>
<p>And if the cursor is selecting a valid Gleam name, the language server will
offer to interpolate it as a variable:</p>
<pre><code><span class=hl-string>&quot;wibble wobble woo&quot;</span>
<span class=hl-comment>//      ^^^^^^ Triggering the code action if you&#39;re</span>
<span class=hl-comment>//             selecting an entire name, will produce this:</span>
<span class=hl-string>&quot;wibble &quot;</span> <span class=hl-operator>&lt;&gt;</span> wobble <span class=hl-operator>&lt;&gt;</span> <span class=hl-string>&quot; woo&quot;</span>
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> for this!</p>
<h2 id="Module-qualifier-hovering">Module qualifier hovering</h2>
<p>The language server can now show documentation for a module when hovering the
module qualifier of an imported type or value. Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<h2 id="Redundant-function-capture-removal">Redundant function capture removal</h2>
<p>Gleam&#39;s function capture syntax is a shorthand for creating an anonymous
function that takes one argument and calls another function with that argument
and some other values. These two expressions are equivalent:</p>
<pre><code><span class=hl-keyword>let</span> double = <span class=hl-keyword>fn</span>(number) { <span class=hl-module>int</span>.<span class=hl-function>double</span>(number, <span class=hl-number>2</span>) }
<span class=hl-keyword>let</span> double = <span class=hl-module>int</span>.<span class=hl-function>double</span>(_, <span class=hl-number>2</span>)
</code></pre>
<p>If the function capture syntax is used without any additional arguments, then it
is redundant and does nothing that referring the function directly wouldn&#39;t do.</p>
<pre><code><span class=hl-keyword>let</span> print = <span class=hl-module>io</span>.<span class=hl-function>print</span>(_)
</code></pre>
<p>The Gleam code formatter will now remove the redundant function capture syntax
for you, formatting it like so:</p>
<pre><code><span class=hl-keyword>let</span> print = io.print
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers:
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/lostkobrakai">LostKobrakai</a>,
<a href="https://github.com/lpil">Louis Pilfold</a>,
<a href="https://git.ahlcode.fi/nicd">Mikko Ahlroth</a>
<a href="https://github.com/mine-tech-oficial">Pedro Francisco</a>,
<a href="https://github.com/PgBiel">PgBiel</a>,
<a href="https://github.com/richard-viney">Richard Viney</a>, and
<a href="https://github.com/GearsDatapacks">Surya Rose</a>!</p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.9.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or core team members 
<a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a> and
<a href="https://github.com/sponsors/GearsDatapacks">Surya Rose</a> 
on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And especially our top sponsor: Lambda.</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/zeroows">Abdulrhman Alkhodiry</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/eelmafia">Alex</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/aexvir">Alex Viscreanu</a>
</li>
<li>
<a href="https://github.com/akoutmos">Alexander Koutmos</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/AndreHogberg">AndreHogberg</a>
</li>
<li>
<a href="https://github.com/andrewmuratov">Andrew Muratov</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/anthony-khong">Anthony Khong</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/bartekgorny">Bartek Górny</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/bcpeinhardt">Benjamin Peinhardt</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/00bpa">Bjoern Paschen</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brendisurfs">Brendan P.</a>
</li>
<li>
<a href="https://github.com/brettkolodny">brettkolodny</a>
</li>
<li>
<a href="https://github.com/brian-dawn">Brian Dawn</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/ctdio">Charlie Duong</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/clangley">clangley</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/insanitybit">Colin</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/sdaigo">Daigo Shitara</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/strongoose">Dan Strong</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/davesnx">David Sancho</a>
</li>
<li>
<a href="https://github.com/dangdennis">Dennis Dang</a>
</li>
<li>
<a href="https://github.com/dennistruemper">dennistruemper</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/dmmulroy">Dillon Mulroy</a>
</li>
<li>
<a href="https://github.com/gothy">Dima Utkin</a>
</li>
<li>
<a href="https://github.com/poroh">Dmitry Poroh</a>
</li>
<li>
<a href="https://github.com/DoctorCobweb">DoctorCobweb</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/ds2600">ds2600</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/eeeli24">eeeli24</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/EMRTS">EMR Technical Solutions</a>
</li>
<li>
<a href="https://github.com/yellowsman">Endo Shogo</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix Mayer</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/brasilikum">Georg Hartmann</a>
</li>
<li>
<a href="https://github.com/george-grec">George</a>
</li>
<li>
<a href="https://github.com/gmartsenkov">Georgi Martsenkov</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham Vasquez</a>
</li>
<li>
<a href="https://github.com/grottohub">grotto</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/ildorn">Hannes Schnaitter</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/hayleigh-dot-dev">Hayleigh Thompson</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://github.com/losfair">Heyang Zhou</a>
</li>
<li>
<a href="https://github.com/hubertmalkowski">Hubert Małkowski</a>
</li>
<li>
<a href="https://github.com/human154">human154</a>
</li>
<li>
<a href="https://github.com/hpiaia">Humberto Piaia</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/irumiha">Igor Rumiha</a>
</li>
<li>
<a href="https://github.com/nilliax">ILLIA NEGOVORA</a>
</li>
<li>
<a href="https://github.com/intarga">Ingrid</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">Isaac</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/ismaelga">Ismael Abreu</a>
</li>
<li>
<a href="https://github.com/bozso">István Bozsó</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jacobdalamb">Jacob Lamb</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jzwood">Jake Wood</a>
</li>
<li>
<a href="https://github.com/jakob753951">Jakob Ladegaard Møller</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/MightyGoldenOctopus">Jean-Adrien Ducastaing</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/jiangplus">jiangplus</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/johngallagher">John Gallagher</a>
</li>
<li>
<a href="https://github.com/jmpavlick">John Pavlick</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://github.com/Nineluj">Julian Hirn</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/hamptokr">Kramer Hampton</a>
</li>
<li>
<a href="https://github.com/Bearfinn">Kritsada Sunthornwutthikrai</a>
</li>
<li>
<a href="https://github.com/krystofrezac">Kryštof Řezáč</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof G.</a>
</li>
<li>
<a href="https://github.com/leostera">Leandro Ostera</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/LilyRose2798">Lily Rose</a>
</li>
<li>
<a href="https://github.com/nnuuvv">liv</a>
</li>
<li>
<a href="https://github.com/wowi42">Loïc Tosser</a>
</li>
<li>
<a href="https://github.com/lucaspellegrinelli">Lucas Pellegrinelli</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lukasmeihsner">Lukas Meihsner</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/2kool4idkwhat">Luna</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/ideaMarcos">Marcos</a>
</li>
<li>
<a href="https://github.com/marcusandre">marcusandre</a>
</li>
<li>
<a href="https://github.com/AYM1607">Mariano Uvalle</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/foresterre">Martijn Gribnau</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/martonkaufmann">martonkaufmann</a>
</li>
<li>
<a href="https://github.com/han-tyumi">Matt Champagne</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matthewrobinsondev">Matt Robinson</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/mwhitworth">Matthew Whitworth</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/amiroff">Metin Emiroğlu</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/mrmcc3">Michael McClintock</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nathanielknight">Nathaniel Knight</a>
</li>
<li>
<a href="https://github.com/Kuuuuuuuu">Nayuki</a>
</li>
<li>
<a href="https://github.com/NFIBrokerage">NFIBrokerage</a>
</li>
<li>
<a href="https://github.com/nchapman">Nick Chapman</a>
</li>
<li>
<a href="https://github.com/ndreynolds">Nick Reynolds</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/blink1415">Nikolai S. K.</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/oceanlewis">Ocean</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/biernacki">Pawel Biernacki</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/pierrot-lc">Pierrot</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/raquentin">Race Williams</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/ray-delossantos">Ray</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/renatillas">re.natillas</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/robertwayne">Rob</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://liberapay.com/Karakunai/">Ronan Harris</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/mooreryan">Ryan Moore</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/soulsam480">sambit</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/mrgleam">Santi Lertsumran</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/smweber">Scott Weber</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seanjensengrey">Sean Jensen-Grey</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/sekunho">sekun</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/honsq90">Shuqian Hon</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">Simone Vittori</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/sthagen">Stefan Hagen</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/stvpwrs">Steve Powers</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/ernstla">Thomas Ernst</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/ThisGuyCodes">Travis Johnson</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/lucamtudor">Tudor Luca</a>
</li>
<li>
<a href="https://github.com/tymak">tymak</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/sandsower">Vic Valenzuela</a>
</li>
<li>
<a href="https://github.com/rodrigues">Victor Rodrigues</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/Whoops">Walton Hoops</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/enkerewpo">wheatfox</a>
</li>
<li>
<a href="https://github.com/Willyboar">Willyboar</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/HymanZHAN">Xucong Zhan</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/yoshi-monster">yoshi~</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://github.com/zwubs">ZWubs</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
]]></content></entry><entry><title>Gleam gets “rename variable”</title><id>https://gleam.run/news/gleam-gets-rename-variable</id><updated>2025-02-07T00:00:00Z</updated><published>2025-02-07T00:00:00Z</published><author><name>Louis Pilfold</name><uri>https://github.com/lpil</uri></author><link href="https://gleam.run/news/gleam-gets-rename-variable" rel="alternate" /><content type="html"><![CDATA[<p>Gleam is a type-safe and scalable language for the Erlang virtual machine and
JavaScript runtimes. Today Gleam <a href="https://github.com/gleam-lang/gleam/releases/tag/v1.8.0">v1.8.0</a> has been published. Let&#39;s
take a look!</p>
<h2 id="Rename-variables-and-arguments">Rename variables and arguments</h2>
<p>The most desired feature for a long time has probably been &quot;rename&quot; in the
language server. I&#39;m happy to announce that the first iteration of this has been
implemented! Local variables and function arguments can be renamed. For example,
given this code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> wibble = <span class=hl-number>10</span>
  wibble <span class=hl-operator>+</span> <span class=hl-number>1</span>
}
</code></pre>
<p>Triggering the &quot;rename&quot; command in your editor with your cursor on <code>wibble</code> and
then entering <code>my_number</code> will cause the language server to edit your code like
so:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> my_number = <span class=hl-number>10</span>
  my_number <span class=hl-operator>+</span> <span class=hl-number>1</span>
}
</code></pre>
<p>It&#39;s not limited to variables that are used a single time, all the uses will be
converted as required. This is just the first iteration of this feature,
renaming for other things in Gleam code will come in future releases.</p>
<p>Thank you <a href="https://github.com/GearsDatapacks">Surya Rose</a> for this long awaited
feature!</p>
<h2 id="Erlang-documentation-integration">Erlang documentation integration</h2>
<p>Erlang OTP27 added the <code>-doc</code> attribute, a new standard for adding documentation
to Erlang based code. The documentation for functions with this attribute can be
programmatically accessed, for example using the documentation helper in the
Erlang and Elixir REPLs.</p>
<pre><code class="language-txt">Eshell V15.1.3 (press Ctrl+G to abort, type help(). for help)
1&gt; h(gleam@list, map).

  map(List, Fun)

  Returns a new list containing only the elements of the first list after the
  function has been applied to each one.

Examples

     map([2, 4, 6], fn(x) { x * 2 })
     // -&gt; [4, 8, 12]
</code></pre>
<p>As you can see, <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> has
added support for this attribute in the Gleam code generator, so Gleam
documentation can be accessed like this from any BEAM language. The code is
generated in such a fashion that it will continue to work with older version of
Erlang/OTP also. Thank you Jak!</p>
<h2 id="Generate-function-code-action">Generate function code action</h2>
<p>The language server can now generate the definition of functions that do not
yet exist. For example if I write the following piece of code:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/io</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>type</span> <span class=hl-variant>Pokemon</span> {
  <span class=hl-variant>Pokemon</span>(pokedex_number: <span class=hl-variant>Int</span>, name: <span class=hl-variant>String</span>)
}

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>io</span>.<span class=hl-function>println</span>(<span class=hl-function>to_string</span>(pokemon))
}
</code></pre>
<p>Triggering the &quot;generate function&quot; code action on the <code>to_string</code> function call
will cause the language server to edit the code to add the empty function
definition, including type annotations.</p>
<pre><code><span class=hl-keyword>fn</span> <span class=hl-function>to_string</span>(pokemon: <span class=hl-variant>Pokemon</span>) -&gt; <span class=hl-variant>String</span> {
  <span class=hl-keyword>todo</span>
}
</code></pre>
<p>Programmers who write this code &quot;top down&quot; will find this especially convenient.
Thank you to <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>, a &quot;top
down&quot; programmer who I&#39;m pretty sure added this entirely for himself.</p>
<h2 id="Pattern-match-code-action">Pattern match code action</h2>
<p>The language server now suggests a code action to pattern match on a variable.
For example, if you have this code:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> result = <span class=hl-module>list</span>.<span class=hl-function>first</span>(a_list)
}
</code></pre>
<p>Triggering the code action on the <code>result</code> variable will generate the
following code for you:</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-keyword>let</span> result = <span class=hl-module>list</span>.<span class=hl-function>first</span>(a_list)
  <span class=hl-keyword>case</span> result {
    <span class=hl-variant>Ok</span>(value) -&gt; <span class=hl-keyword>todo</span>
    <span class=hl-variant>Error</span>(value) -&gt; <span class=hl-keyword>todo</span>
  }
}
</code></pre>
<p>This works with values of any type, adding all the patterns you would need to
exhaustively pattern match on them. It also works for function arguments as well
as variables. Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="More-fault-tolerant-compilation">More fault tolerant compilation</h2>
<p>Fault tolerant compilation is what allows the language server to still help you
work with your code even when it is in an invalid state, a feature which is
vital for a good experience refactoring or fixing Gleam code.</p>
<p><a href="https://github.com/GearsDatapacks">Surya Rose</a> and <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
have improved code analysis to make the compilation of body-less case
expressions and function pipelines fault tolerant. This will be extra
impactful for autocompletion while writing new code. Thank you both for this!</p>
<h2 id="Result-wrapping-hints">Result wrapping hints</h2>
<p>Gleam uses a result type for error handling instead of exceptions. At times the
programmer may forget to add the <code>Ok</code> or <code>Error</code> needed in fallible functions,
so <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a> has made the
compiler suggest where to add these to solve a type mismatch.</p>
<pre><code><span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>greet_logged_user</span>() {
  <span class=hl-keyword>use</span> &lt;- <span class=hl-module>bool</span>.<span class=hl-function>guard</span>(when: <span class=hl-operator>!</span>logged_in, return: <span class=hl-variant>Error</span>(<span class=hl-variant>Nil</span>))
  <span class=hl-string>&quot;Hello!&quot;</span>
}
</code></pre>
<pre><code class="language-txt">error: Type mismatch
  ┌─ /main.gleam:7:3
  │
7 │   &quot;Hello!&quot;
  │   ^^^^^^^^ Did you mean to wrap this in an `Ok`?

Expected type:

    Result(a, Nil)

Found type:

    String
</code></pre>
<p>Thank you Jak!</p>
<h2 id="gleam-deps-tree"><code>gleam deps tree</code></h2>
<p>Gleam uses the Hex, the package manager for the BEAM ecosystem. The build tool
will automatically download and compile appropriate versions of the dependencies
your project needs, along with their dependencies.</p>
<p>The new <code>gleam deps tree</code> command can be used to view the relationship between
all your dependencies.</p>
<pre><code class="language-txt">$ gleam deps tree

project_a v1.0.0
├── package_b v0.52.0
└── package_c v1.2.0
    └── package_b v0.52.0
</code></pre>
<p>The <code>--package</code> option can be used to view just a portion of the dependency
tree.</p>
<pre><code class="language-txt">$ gleam deps tree --package package_c

package_c v1.2.0
└── package_b v0.52.0
</code></pre>
<p>And the <code>--invert</code> option can be used to view all paths from a package to the
root of the project, which can be very useful for understanding why a particular
package version was included in the project.</p>
<pre><code class="language-txt">$ gleam deps tree --invert package_b

package_b v0.52.0
├── package_c v1.2.0
│   └── project_a v1.0.0
└── project_a v1.0.0
</code></pre>
<p>Thank you <a href="https://github.com/ramkarthik">Ramkarthik Krishnamurthy</a> for this
new command!</p>
<h2 id="HTML-documentation-hotkeys">HTML documentation hotkeys</h2>
<p>Gleam can generate HTML documentation for your code when you run <code>gleam docs
build</code>, and it will automatically generate and publish this documentation to
<a href="https://hexdocs.pm/">HexDocs</a> when publishing a package.</p>
<p><a href="https://github.com/soulsam480">Sambit Sahoo</a> has added hotkeys, making the
search input be focused when <code>cmd/ctrl + k</code>, <code>s</code> or <code>/</code> is pressed. Thank you!</p>
<h2 id="Invalid-project-name-correction">Invalid project name correction</h2>
<p>Gleam project names have to be all lowercase letters and underscores and
numbers, and not collide with any Gleam keywords. The <code>glean new</code> command would
reject invalid names, but now it will suggest a valid name instead and ask if
the programmer would like to use that instead.</p>
<pre><code class="language-txt">$ gleam new type
We were not able to create your project as `type` is a reserved word in
Gleam.

Would you like to name your project &#39;type_app&#39; instead? [y/n]:
</code></pre>
<p>Thank you <a href="https://github.com/diemogebhardt">Diemo Gebhardt</a> for this!</p>
<h2 id="Better-"fill-labels"-code-action">Better &quot;fill labels&quot; code action</h2>
<p>The language server can now fill in the labels of any function call, even when
only some of the arguments are provided. For example:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/string</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>string</span>.<span class=hl-function>replace</span>(<span class=hl-string>&quot;wibble&quot;</span>)
}
</code></pre>
<p>Will be completed to:</p>
<pre><code><span class=hl-keyword>import</span> <span class=hl-module>gleam/string</span>

<span class=hl-keyword>pub</span> <span class=hl-keyword>fn</span> <span class=hl-function>main</span>() {
  <span class=hl-module>string</span>.<span class=hl-function>replace</span>(<span class=hl-string>&quot;wibble&quot;</span>, each: <span class=hl-keyword>todo</span>, with: <span class=hl-keyword>todo</span>)
}
</code></pre>
<p>Thank you <a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>!</p>
<h2 id="And-the-rest">And the rest</h2>
<p>And thank you to the bug fixers and error message improvers:
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>,
<a href="https://github.com/Frank-III">Jiangda Wang</a>,
<a href="https://github.com/jrstrunk">John Strunk</a>,
<a href="https://github.com/oneness">Kasim</a>,
<a href="https://github.com/massivefermion">shayan</a>,
<a href="https://github.com/GearsDatapacks">Surya Rose</a>, and
<a href="https://github.com/joshi-monster">yoshi</a></p>
<p>For full details of the many fixes and improvements they&#39;ve implemented see <a href="https://github.com/gleam-lang/gleam/blob/main/changelog/v1.8.md">the
changelog</a>.</p>
<h2 id="A-call-for-support">A call for support</h2>
<p>Gleam is not owned by a corporation; instead it is entirely supported by
sponsors, most of which contribute between $5 and $20 USD per month, and Gleam
is my sole source of income.</p>
<p>We have made great progress towards our goal of being able to appropriately pay
the core team members, but we still have further to go. Please consider
supporting <a href="https://github.com/sponsors/lpil">the project</a> or <a href="https://github.com/sponsors/giacomocavalieri">Giacomo Cavalieri</a>
specifically on GitHub Sponsors.</p>
<a class="sponsor-level0" href="https://github.com/sponsors/lpil" rel="noopener" target="_blank">
  <img src="/images/community/github.svg" alt="GitHub Sponsors" style="filter: invert(1)"/>
</a>
<p>Thank you to all our sponsors! And especially our top sponsor: Lambda.</p>
<ul class="top-sponsors">
  <li>
    <a class="sponsor-level1" href="https://lambdaclass.com/" rel="noopener" target="_blank" >
      <img src="/images/sponsors/lambda-class-white.png" alt="Lambda Class">
    </a>
  </li>
</ul>
<ul>
<li>
<a href="https://github.com/00bpa">00bpa</a>
</li>
<li>
<a href="https://github.com/agundy">Aaron Gunderson</a>
</li>
<li>
<a href="https://github.com/zeroows">Abdulrhman Alkhodiry</a>
</li>
<li>
<a href="https://github.com/abeljim">Abel Jimenez</a>
</li>
<li>
<a href="https://github.com/ad-ops">ad-ops</a>
</li>
<li>
<a href="https://github.com/AdamBrodzinski">Adam Brodzinski</a>
</li>
<li>
<a href="https://github.com/adjohnston">Adam Johnston</a>
</li>
<li>
<a href="https://github.com/adam-wyluda">Adam Wyłuda</a>
</li>
<li>
<a href="https://github.com/thebugcatcher">Adi Iyengar</a>
</li>
<li>
<a href="https://github.com/amouat">Adrian Mouat</a>
</li>
<li>
<a href="https://github.com/JitPackJoyride">Ajit Krishna</a>
</li>
<li>
<a href="https://github.com/Guria">Aleksei Gurianov</a>
</li>
<li>
<a href="https://alembic.com.au">Alembic</a>
</li>
<li>
<a href="https://github.com/eelmafia">Alex</a>
</li>
<li>
<a href="https://github.com/ahouseago">Alex Houseago</a>
</li>
<li>
<a href="https://github.com/rawhat">Alex Manning</a>
</li>
<li>
<a href="https://github.com/aexvir">Alex Viscreanu</a>
</li>
<li>
<a href="https://github.com/akoutmos">Alexander Koutmos</a>
</li>
<li>
<a href="https://github.com/muonoum">Alexander Stensrud</a>
</li>
<li>
<a href="https://github.com/defgenx">Alexandre Del Vecchio</a>
</li>
<li>
<a href="https://github.com/Acepie">Ameen Radwan</a>
</li>
<li>
<a href="https://github.com/abueide">Andrea Bueide</a>
</li>
<li>
<a href="https://github.com/AndreHogberg">AndreHogberg</a>
</li>
<li>
<a href="https://github.com/antharuu">Antharuu</a>
</li>
<li>
<a href="https://github.com/anthony-khong">Anthony Khong</a>
</li>
<li>
<a href="https://github.com/Illbjorn">Anthony Maxwell</a>
</li>
<li>
<a href="https://github.com/amscotti">Anthony Scotti</a>
</li>
<li>
<a href="https://github.com/vereym">Antoni</a>
</li>
<li>
<a href="https://github.com/aweagel">Arthur Weagel</a>
</li>
<li>
<a href="https://github.com/aryairani">Arya Irani</a>
</li>
<li>
<a href="https://github.com/azureflash">Azure Flash</a>
</li>
<li>
<a href="https://github.com/chiroptical">Barry Moore II</a>
</li>
<li>
<a href="https://github.com/bartekgorny">Bartek Górny</a>
</li>
<li>
<a href="https://github.com/requestben">Ben Martin</a>
</li>
<li>
<a href="https://github.com/bgmarx">Ben Marx</a>
</li>
<li>
<a href="https://github.com/benmyles">Ben Myles</a>
</li>
<li>
<a href="https://github.com/bbkane">Benjamin Kane</a>
</li>
<li>
<a href="https://github.com/bcpeinhardt">Benjamin Peinhardt</a>
</li>
<li>
<a href="https://github.com/bgwdotdev">bgw</a>
</li>
<li>
<a href="https://github.com/bjartelund">Bjarte Aarmo Lund</a>
</li>
<li>
<a href="https://github.com/bmehder">Brad Mehder</a>
</li>
<li>
<a href="https://github.com/brettkolodny">brettkolodny</a>
</li>
<li>
<a href="https://github.com/brian-dawn">Brian Dawn</a>
</li>
<li>
<a href="https://github.com/bglusman">Brian Glusman</a>
</li>
<li>
<a href="https://github.com/bruce">Bruce Williams</a>
</li>
<li>
<a href="https://github.com/nono">Bruno Michel</a>
</li>
<li>
<a href="https://github.com/bucsi">bucsi</a>
</li>
<li>
<a href="https://github.com/camray">Cam Ray</a>
</li>
<li>
<a href="https://github.com/cameronpresley">Cameron Presley</a>
</li>
<li>
<a href="https://github.com/carlomunguia">Carlo Munguia</a>
</li>
<li>
<a href="https://github.com/csaltos">Carlos Saltos</a>
</li>
<li>
<a href="https://github.com/chadselph">Chad Selph</a>
</li>
<li>
<a href="https://github.com/ctdio">Charlie Duong</a>
</li>
<li>
<a href="https://github.com/charlie-n01r">Charlie Govea</a>
</li>
<li>
<a href="https://github.com/chazwatkins">Chaz Watkins</a>
</li>
<li>
<a href="https://github.com/choonkeat">Chew Choon Keat</a>
</li>
<li>
<a href="https://github.com/ceedon">Chris Donnelly</a>
</li>
<li>
<a href="https://github.com/Morzaram">Chris King</a>
</li>
<li>
<a href="https://github.com/chrislloyd">Chris Lloyd</a>
</li>
<li>
<a href="https://github.com/utilForever">Chris Ohk</a>
</li>
<li>
<a href="https://github.com/Chriscbr">Chris Rybicki</a>
</li>
<li>
<a href="https://github.com/christophershirk">Christopher David Shirk</a>
</li>
<li>
<a href="https://github.com/devries">Christopher De Vries</a>
</li>
<li>
<a href="https://github.com/cdaringe">Christopher Dieringer</a>
</li>
<li>
<a href="https://github.com/christopherhjung">Christopher Jung</a>
</li>
<li>
<a href="https://github.com/christhekeele">Christopher Keele</a>
</li>
<li>
<a href="https://github.com/specialblend">CJ Salem</a>
</li>
<li>
<a href="https://github.com/clangley">clangley</a>
</li>
<li>
<a href="https://github.com/CliffordAnderson">Clifford Anderson</a>
</li>
<li>
<a href="https://github.com/codecrafters-io">CodeCrafters</a>
</li>
<li>
<a href="https://github.com/coder">Coder</a>
</li>
<li>
<a href="https://github.com/colelawrence">Cole Lawrence</a>
</li>
<li>
<a href="https://github.com/insanitybit">Colin</a>
</li>
<li>
<a href="https://github.com/Comamoca">Comamoca</a>
</li>
<li>
<a href="https://github.com/Lucostus">Constantin (Cleo) Winkler</a>
</li>
<li>
<a href="https://github.com/jcorentin">Corentin J.</a>
</li>
<li>
<a href="https://github.com/sdaigo">Daigo Shitara</a>
</li>
<li>
<a href="https://github.com/dvic">Damir Vandic</a>
</li>
<li>
<a href="https://github.com/ddresselhaus">Dan Dresselhaus</a>
</li>
<li>
<a href="https://github.com/DanielleMaywood">Danielle Maywood</a>
</li>
<li>
<a href="https://github.com/pinnet">Danny Arnold</a>
</li>
<li>
<a href="https://github.com/despairblue">Danny Martini</a>
</li>
<li>
<a href="https://github.com/davydog187">Dave Lucia</a>
</li>
<li>
<a href="https://github.com/dbernheisel">David Bernheisel</a>
</li>
<li>
<a href="https://github.com/davidcornu">David Cornu</a>
</li>
<li>
<a href="https://github.com/davesnx">David Sancho</a>
</li>
<li>
<a href="https://github.com/dangdennis">Dennis Dang</a>
</li>
<li>
<a href="https://github.com/dennistruemper">dennistruemper</a>
</li>
<li>
<a href="https://github.com/diemogebhardt">Diemo Gebhardt</a>
</li>
<li>
<a href="https://github.com/dmmulroy">Dillon Mulroy</a>
</li>
<li>
<a href="https://github.com/gothy">Dima Utkin</a>
</li>
<li>
<a href="https://github.com/poroh">Dmitry Poroh</a>
</li>
<li>
<a href="https://github.com/DoctorCobweb">DoctorCobweb</a>
</li>
<li>
<a href="https://github.com/floodfx">Donnie Flood</a>
</li>
<li>
<a href="https://github.com/ds2600">ds2600</a>
</li>
<li>
<a href="https://github.com/gdcrisp">Dylan Carlson</a>
</li>
<li>
<a href="https://github.com/eberfreitas">Éber Freitas Dias</a>
</li>
<li>
<a href="https://github.com/edhinrichsen">Ed Hinrichsen</a>
</li>
<li>
<a href="https://github.com/edongashi">Edon Gashi</a>
</li>
<li>
<a href="https://github.com/eeeli24">eeeli24</a>
</li>
<li>
<a href="https://github.com/enoonan">Eileen Noonan</a>
</li>
<li>
<a href="https://github.com/dropwhile">eli</a>
</li>
<li>
<a href="https://github.com/Emma-Fuller">Emma</a>
</li>
<li>
<a href="https://github.com/EMRTS">EMR Technical Solutions</a>
</li>
<li>
<a href="https://github.com/yellowsman">Endo Shogo</a>
</li>
<li>
<a href="https://github.com/ekosz">Eric Koslow</a>
</li>
<li>
<a href="https://github.com/eterps">Erik Terpstra</a>
</li>
<li>
<a href="https://liberapay.com/erikareads/">erikareads</a>
</li>
<li>
<a href="https://github.com/ErikML">ErikML</a>
</li>
<li>
<a href="https://github.com/erlend-axelsson">erlend-axelsson</a>
</li>
<li>
<a href="https://github.com/oberernst">Ernesto Malave</a>
</li>
<li>
<a href="https://github.com/EthanOlpin">Ethan Olpin</a>
</li>
<li>
<a href="https://github.com/evaldobratti">Evaldo Bratti</a>
</li>
<li>
<a href="https://github.com/evanj2357">Evan Johnson</a>
</li>
<li>
<a href="https://github.com/evanasse">evanasse</a>
</li>
<li>
<a href="https://github.com/fabridamicelli">Fabrizio Damicelli</a>
</li>
<li>
<a href="https://github.com/fmesteban">Fede Esteban</a>
</li>
<li>
<a href="https://github.com/yerTools">Felix Mayer</a>
</li>
<li>
<a href="https://github.com/nandofarias">Fernando Farias</a>
</li>
<li>
<a href="https://github.com/ffigiel">Filip Figiel</a>
</li>
<li>
<a href="https://github.com/floriank">Florian Kraft</a>
</li>
<li>
<a href="https://github.com/francishamel">Francis Hamel</a>
</li>
<li>
<a href="https://github.com/Frank-III">frankwang</a>
</li>
<li>
<a href="https://github.com/gvrooyen">G-J van Rooyen</a>
</li>
<li>
<a href="https://github.com/gabrielvincent">Gabriel Vincent</a>
</li>
<li>
<a href="https://github.com/gahjelle">Geir Arne Hjelle</a>
</li>
<li>
<a href="https://github.com/brasilikum">Georg Hartmann</a>
</li>
<li>
<a href="https://github.com/george-grec">George</a>
</li>
<li>
<a href="https://github.com/ggobbe">ggobbe</a>
</li>
<li>
<a href="https://github.com/giacomocavalieri">Giacomo Cavalieri</a>
</li>
<li>
<a href="https://github.com/giovannibonetti">Giovanni Kock Bonetti</a>
</li>
<li>
<a href="https://github.com/GV14982">Graham Vasquez</a>
</li>
<li>
<a href="https://github.com/grottohub">grotto</a>
</li>
<li>
<a href="https://github.com/nirev">Guilherme de Maio</a>
</li>
<li>
<a href="https://github.com/guillheu">Guillaume Heu</a>
</li>
<li>
<a href="https://github.com/ghivert">Guillaume Hivert</a>
</li>
<li>
<a href="https://github.com/H-274">H-274</a>
</li>
<li>
<a href="https://github.com/hammad-r-javed">Hammad Javed</a>
</li>
<li>
<a href="https://github.com/kwando">Hannes Nevalainen</a>
</li>
<li>
<a href="https://github.com/ildorn">Hannes Schnaitter</a>
</li>
<li>
<a href="https://github.com/oderwat">Hans Raaf</a>
</li>
<li>
<a href="https://github.com/jhundman">Hayes Hundman</a>
</li>
<li>
<a href="https://github.com/hayleigh-dot-dev">Hayleigh Thompson</a>
</li>
<li>
<a href="https://github.com/hibachrach">Hazel Bachrach</a>
</li>
<li>
<a href="https://github.com/hdahlheim">Henning Dahlheim</a>
</li>
<li>
<a href="https://github.com/tudborg">Henrik Tudborg</a>
</li>
<li>
<a href="https://github.com/h14h">Henry Firth</a>
</li>
<li>
<a href="https://github.com/henrysdev">Henry Warren</a>
</li>
<li>
<a href="https://github.com/losfair">Heyang Zhou</a>
</li>
<li>
<a href="https://github.com/human154">human154</a>
</li>
<li>
<a href="https://github.com/hpiaia">Humberto Piaia</a>
</li>
<li>
<a href="https://github.com/iainh">Iain H</a>
</li>
<li>
<a href="https://github.com/Ian-GL">Ian González</a>
</li>
<li>
<a href="https://github.com/ianmjones">Ian M. Jones</a>
</li>
<li>
<a href="https://github.com/igordsm">Igor Montagner</a>
</li>
<li>
<a href="https://github.com/irumiha">Igor Rumiha</a>
</li>
<li>
<a href="https://github.com/nilliax">ILLIA NEGOVORA</a>
</li>
<li>
<a href="https://github.com/intarga">Ingrid</a>
</li>
<li>
<a href="https://github.com/inoas">inoas</a>
</li>
<li>
<a href="https://github.com/graphiteisaac">Isaac</a>
</li>
<li>
<a href="https://github.com/isaacharrisholt">Isaac Harris-Holt</a>
</li>
<li>
<a href="https://github.com/imcquee">Isaac McQueen</a>
</li>
<li>
<a href="https://github.com/ismaelga">Ismael Abreu</a>
</li>
<li>
<a href="https://github.com/bozso">István Bozsó</a>
</li>
<li>
<a href="https://github.com/ivarvong">Ivar Vong</a>
</li>
<li>
<a href="https://github.com/jacobdalamb">Jacob Lamb</a>
</li>
<li>
<a href="https://github.com/jakecleary">Jake Cleary</a>
</li>
<li>
<a href="https://github.com/jamesbirtles">James Birtles</a>
</li>
<li>
<a href="https://github.com/jamesmacaulay">James MacAulay</a>
</li>
<li>
<a href="https://github.com/janpieper">Jan Pieper</a>
</li>
<li>
<a href="https://github.com/monzool">Jan Skriver Sørensen</a>
</li>
<li>
<a href="https://github.com/jlgeering">Jean-Luc Geering</a>
</li>
<li>
<a href="https://github.com/okkdev">Jen Stehlik</a>
</li>
<li>
<a href="https://github.com/jiangplus">jiangplus</a>
</li>
<li>
<a href="https://github.com/hunkyjimpjorps">Jimpjorps™</a>
</li>
<li>
<a href="https://github.com/joeykilpatrick">Joey Kilpatrick</a>
</li>
<li>
<a href="https://github.com/joeytrapp">Joey Trapp</a>
</li>
<li>
<a href="https://github.com/johan-st">Johan Strand</a>
</li>
<li>
<a href="https://github.com/JohnBjrk">John Björk</a>
</li>
<li>
<a href="https://github.com/johngallagher">John Gallagher</a>
</li>
<li>
<a href="https://github.com/jmpavlick">John Pavlick</a>
</li>
<li>
<a href="https://github.com/jrstrunk">John Strunk</a>
</li>
<li>
<a href="https://github.com/xjojorx">Jojor</a>
</li>
<li>
<a href="https://github.com/jonlambert">Jon Lambert</a>
</li>
<li>
<a href="https://github.com/igern">Jonas E. P</a>
</li>
<li>
<a href="https://github.com/JonasHedEng">Jonas Hedman Engström</a>
</li>
<li>
<a href="https://github.com/jooaf">jooaf</a>
</li>
<li>
<a href="https://github.com/joseph-lozano">Joseph Lozano</a>
</li>
<li>
<a href="https://github.com/joshocalico">Joshua Steele</a>
</li>
<li>
<a href="https://liberapay.com/d2quadra/">Julian Lukwata</a>
</li>
<li>
<a href="https://github.com/schurhammer">Julian Schurhammer</a>
</li>
<li>
<a href="https://github.com/justinlubin">Justin Lubin</a>
</li>
<li>
<a href="https://github.com/Neofox">Jérôme Schaeffer</a>
</li>
<li>
<a href="https://github.com/jkbrinso">Kemp Brinson</a>
</li>
<li>
<a href="https://github.com/keroami">Kero van Gelder</a>
</li>
<li>
<a href="https://github.com/kevinschweikert">Kevin Schweikert</a>
</li>
<li>
<a href="https://github.com/hamptokr">Kramer Hampton</a>
</li>
<li>
<a href="https://github.com/Bearfinn">Kritsada Sunthornwutthikrai</a>
</li>
<li>
<a href="https://github.com/krystofrezac">Kryštof Řezáč</a>
</li>
<li>
<a href="https://github.com/krzysztofgb">Krzysztof G.</a>
</li>
<li>
<a href="https://github.com/leostera">Leandro Ostera</a>
</li>
<li>
<a href="https://github.com/leejarvis">Lee Jarvis</a>
</li>
<li>
<a href="https://github.com/leonqadirie">Leon Qadirie</a>
</li>
<li>
<a href="https://github.com/LeartS">Leonardo Donelli</a>
</li>
<li>
<a href="https://github.com/defp">lidashuang</a>
</li>
<li>
<a href="https://github.com/LilyRose2798">Lily Rose</a>
</li>
<li>
<a href="https://github.com/wowi42">Loïc Tosser</a>
</li>
<li>
<a href="https://github.com/lucaspellegrinelli">Lucas Pellegrinelli</a>
</li>
<li>
<a href="https://github.com/lbjarre">Lukas Bjarre</a>
</li>
<li>
<a href="https://github.com/lukasmeihsner">Lukas Meihsner</a>
</li>
<li>
<a href="https://github.com/lamdor">Luke Amdor</a>
</li>
<li>
<a href="https://github.com/2kool4idkwhat">Luna</a>
</li>
<li>
<a href="https://github.com/manuel-rubio">Manuel Rubio</a>
</li>
<li>
<a href="https://github.com/ideaMarcos">Marcos</a>
</li>
<li>
<a href="https://github.com/marcusandre">marcusandre</a>
</li>
<li>
<a href="https://github.com/AYM1607">Mariano Uvalle</a>
</li>
<li>
<a href="https://github.com/mariuskalvo">Marius Kalvø</a>
</li>
<li>
<a href="https://github.com/markholmes">Mark Holmes</a>
</li>
<li>
<a href="https://github.com/markmark206">Mark Markaryan</a>
</li>
<li>
<a href="https://github.com/datayja">Markéta Lisová</a>
</li>
<li>
<a href="https://github.com/foresterre">Martijn Gribnau</a>
</li>
<li>
<a href="https://github.com/Janiczek">Martin Janiczek</a>
</li>
<li>
<a href="https://github.com/poelstra">Martin Poelstra</a>
</li>
<li>
<a href="https://github.com/rechsteiner">Martin Rechsteiner</a>
</li>
<li>
<a href="https://github.com/martonkaufmann">martonkaufmann</a>
</li>
<li>
<a href="https://github.com/klemola">Matias Klemola</a>
</li>
<li>
<a href="https://github.com/han-tyumi">Matt Champagne</a>
</li>
<li>
<a href="https://github.com/mhheise">Matt Heise</a>
</li>
<li>
<a href="https://github.com/m">Matt Mullenweg</a>
</li>
<li>
<a href="https://github.com/matthewrobinsondev">Matt Robinson</a>
</li>
<li>
<a href="https://github.com/matt-savvy">Matt Savoia</a>
</li>
<li>
<a href="https://github.com/mattvanhorn">Matt Van Horn</a>
</li>
<li>
<a href="https://github.com/mwhitworth">Matthew Whitworth</a>
</li>
<li>
<a href="https://github.com/maxmcd">Max McDonnell</a>
</li>
<li>
<a href="https://github.com/max-tern">max-tern</a>
</li>
<li>
<a href="https://github.com/metame">metame</a>
</li>
<li>
<a href="https://github.com/metatexx">METATEXX GmbH</a>
</li>
<li>
<a href="https://github.com/amiroff">Metin Emiroğlu</a>
</li>
<li>
<a href="https://github.com/stunthamster">Michael Duffy</a>
</li>
<li>
<a href="https://github.com/michaeljones">Michael Jones</a>
</li>
<li>
<a href="https://github.com/monocursive">Michael Mazurczak</a>
</li>
<li>
<a href="https://github.com/karlsson">Mikael Karlsson</a>
</li>
<li>
<a href="https://liberapay.com/Daybowbow/">Mike</a>
</li>
<li>
<a href="https://github.com/mroach">Mike Roach</a>
</li>
<li>
<a href="https://liberapay.com/mikej/">Mikey J</a>
</li>
<li>
<a href="https://github.com/MoeDevelops">MoeDev</a>
</li>
<li>
<a href="https://github.com/rykawamu">MzRyuKa</a>
</li>
<li>
<a href="https://github.com/n8nio">n8n - Workflow Automation</a>
</li>
<li>
<a href="https://github.com/natanaelsirqueira">Natanael Sirqueira</a>
</li>
<li>
<a href="https://github.com/nathanielknight">Nathaniel Knight</a>
</li>
<li>
<a href="https://github.com/Kuuuuuuuu">Nayuki</a>
</li>
<li>
<a href="https://github.com/NFIBrokerage">NFIBrokerage</a>
</li>
<li>
<a href="https://github.com/arcanemachine">Nicholas Moen</a>
</li>
<li>
<a href="https://github.com/nchapman">Nick Chapman</a>
</li>
<li>
<a href="https://github.com/ndreynolds">Nick Reynolds</a>
</li>
<li>
<a href="https://github.com/NicklasXYZ">Nicklas Sindlev Andersen</a>
</li>
<li>
<a href="https://github.com/NicoVIII">NicoVIII</a>
</li>
<li>
<a href="https://github.com/mrniket">Niket Shah</a>
</li>
<li>
<a href="https://github.com/ninanomenon">Ninaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</a>
</li>
<li>
<a href="http://www.ninefx.com">NineFX</a>
</li>
<li>
<a href="https://github.com/nomio">Nomio</a>
</li>
<li>
<a href="https://github.com/oceanlewis">Ocean</a>
</li>
<li>
<a href="https://github.com/osebelin">Olaf Sebelin</a>
</li>
<li>
<a href="https://github.com/OldhamMade">OldhamMade</a>
</li>
<li>
<a href="https://github.com/spaghettiguru">Oleg Yuzvik</a>
</li>
<li>
<a href="https://github.com/CanadaHonk">Oliver Medhurst</a>
</li>
<li>
<a href="https://github.com/otosky">Oliver Tosky</a>
</li>
<li>
<a href="https://github.com/optizio">optizio</a>
</li>
<li>
<a href="https://github.com/daslaf">Osman Cea</a>
</li>
<li>
<a href="https://github.com/PastMoments">PastMoments</a>
</li>
<li>
<a href="https://github.com/Davorak">Patrick Wheeler</a>
</li>
<li>
<a href="https://github.com/pguse">Paul Guse</a>
</li>
<li>
<a href="https://github.com/biernacki">Pawel Biernacki</a>
</li>
<li>
<a href="https://github.com/Tulkdan">Pedro Correa</a>
</li>
<li>
<a href="https://github.com/petejodo">Pete Jodo</a>
</li>
<li>
<a href="https://github.com/pvsr">Peter Rice</a>
</li>
<li>
<a href="https://github.com/philpax">Philpax</a>
</li>
<li>
<a href="https://github.com/pierrot-lc">Pierrot</a>
</li>
<li>
<a href="https://github.com/sz-piotr">Piotr Szlachciak</a>
</li>
<li>
<a href="https://github.com/qdentity">Qdentity</a>
</li>
<li>
<a href="https://github.com/raquentin">Race Williams</a>
</li>
<li>
<a href="https://github.com/stoft">Rasmus</a>
</li>
<li>
<a href="https://github.com/ray-delossantos">Ray</a>
</li>
<li>
<a href="https://github.com/chouzar">Raúl Chouza</a>
</li>
<li>
<a href="https://github.com/renatillas">re.natillas</a>
</li>
<li>
<a href="https://github.com/redmar">Redmar Kerkhoff</a>
</li>
<li>
<a href="https://github.com/reillysiemens">Reilly Tucker Siemens</a>
</li>
<li>
<a href="https://github.com/renatomassaro">Renato Massaro</a>
</li>
<li>
<a href="https://github.com/renovatorruler">Renovator</a>
</li>
<li>
<a href="https://github.com/richard-viney">Richard Viney</a>
</li>
<li>
<a href="https://github.com/rico">Rico Leuthold</a>
</li>
<li>
<a href="https://github.com/rinx">Rintaro Okamura</a>
</li>
<li>
<a href="https://github.com/ripta">Ripta Pasay</a>
</li>
<li>
<a href="https://github.com/robertwayne">Rob</a>
</li>
<li>
<a href="https://github.com/TanklesXL">Robert Attard</a>
</li>
<li>
<a href="https://github.com/rellen">Robert Ellen</a>
</li>
<li>
<a href="https://github.com/malkomalko">Robert Malko</a>
</li>
<li>
<a href="https://github.com/Papipo">Rodrigo Álvarez</a>
</li>
<li>
<a href="https://liberapay.com/Karakunai/">Ronan Harris</a>
</li>
<li>
<a href="https://github.com/rotabull">Rotabull</a>
</li>
<li>
<a href="https://github.com/reinefjord">Rupus Reinefjord</a>
</li>
<li>
<a href="https://github.com/ustitc">Ruslan Ustitc</a>
</li>
<li>
<a href="https://github.com/mooreryan">Ryan Moore</a>
</li>
<li>
<a href="https://github.com/samaaron">Sam Aaron</a>
</li>
<li>
<a href="https://github.com/metruzanca">Sam Zanca</a>
</li>
<li>
<a href="https://github.com/soulsam480">sambit</a>
</li>
<li>
<a href="https://github.com/bkspace">Sammy Isseyegh</a>
</li>
<li>
<a href="https://github.com/castletaste">Savva</a>
</li>
<li>
<a href="https://github.com/sasa1977">Saša Jurić</a>
</li>
<li>
<a href="https://github.com/scotttrinh">Scott Trinh</a>
</li>
<li>
<a href="https://github.com/smweber">Scott Weber</a>
</li>
<li>
<a href="https://github.com/scottwey">Scott Wey</a>
</li>
<li>
<a href="https://github.com/star-szr">Scott Zhu Reeves</a>
</li>
<li>
<a href="https://github.com/seanjensengrey">Sean Jensen-Grey</a>
</li>
<li>
<a href="https://github.com/SeanRoberts">Sean Roberts</a>
</li>
<li>
<a href="https://github.com/sporto">Sebastian Porto</a>
</li>
<li>
<a href="https://github.com/sekunho">sekun</a>
</li>
<li>
<a href="https://github.com/tehprofessor">Seve Salazar</a>
</li>
<li>
<a href="https://github.com/codemonkey76">Shane Poppleton</a>
</li>
<li>
<a href="https://github.com/honsq90">Shuqian Hon</a>
</li>
<li>
<a href="https://github.com/sigmasternchen">Sigma</a>
</li>
<li>
<a href="https://github.com/simonewebdesign">Simone Vittori</a>
</li>
<li>
<a href="https://github.com/bytesource">Stefan</a>
</li>
<li>
<a href="https://github.com/sthagen">Stefan Hagen</a>
</li>
<li>
<a href="https://github.com/steinareliassen">Steinar Eliassen</a>
</li>
<li>
<a href="https://github.com/Qard">Stephen Belanger</a>
</li>
<li>
<a href="https://github.com/stvpwrs">Steve Powers</a>
</li>
<li>
<a href="https://github.com/Strandinator">Strandinator</a>
</li>
<li>
<a href="https://github.com/threepointone">Sunil Pai</a>
</li>
<li>
<a href="https://github.com/slafs">Sławomir Ehlert</a>
</li>
<li>
<a href="https://github.com/Theosaurus-Rex">Theo Harris</a>
</li>
<li>
<a href="https://github.com/thomaswhyyou">Thomas</a>
</li>
<li>
<a href="https://github.com/tcoopman">Thomas Coopman</a>
</li>
<li>
<a href="https://github.com/ernstla">Thomas Ernst</a>
</li>
<li>
<a href="https://github.com/tmbrwn">Tim Brown</a>
</li>
<li>
<a href="https://github.com/timgluz">Timo Sulg</a>
</li>
<li>
<a href="https://github.com/tomjschuster">Tom Schuster</a>
</li>
<li>
<a href="https://github.com/tomekowal">Tomasz Kowal</a>
</li>
<li>
<a href="https://github.com/tommaisey">tommaisey</a>
</li>
<li>
<a href="https://github.com/ThisGuyCodes">Travis Johnson</a>
</li>
<li>
<a href="https://github.com/TristanCacqueray">Tristan de Cacqueray</a>
</li>
<li>
<a href="https://github.com/tsloughter">Tristan Sloughter</a>
</li>
<li>
<a href="https://github.com/tymak">tymak</a>
</li>
<li>
<a href="https://github.com/UniH">Uni Huang</a>
</li>
<li>
<a href="https://github.com/upsidedownsweetfood">upsidedowncake</a>
</li>
<li>
<a href="https://github.com/vvzen">Valerio Viperino</a>
</li>
<li>
<a href="https://github.com/sandsower">Vic Valenzuela</a>
</li>
<li>
<a href="https://github.com/rodrigues">Victor Rodrigues</a>
</li>
<li>
<a href="https://github.com/PerpetualPossum">Viv Verner</a>
</li>
<li>
<a href="https://github.com/yelps">Volker Rabe</a>
</li>
<li>
<a href="https://github.com/weizhliu">Weizheng Liu</a>
</li>
<li>
<a href="https://github.com/enkerewpo">wheatfox</a>
</li>
<li>
<a href="https://github.com/Willyboar">Willyboar</a>
</li>
<li>
<a href="https://github.com/wilsonsilva">Wilson Silva</a>
</li>
<li>
<a href="https://github.com/HymanZHAN">Xucong Zhan</a>
</li>
<li>
<a href="https://github.com/yamen">Yamen Sader</a>
</li>
<li>
<a href="https://github.com/Yasuo-Higano">Yasuo Higano</a>
</li>
<li>
<a href="https://github.com/joshi-monster">yoshi~</a>
</li>
<li>
<a href="https://github.com/gasparinzsombor">Zsombor Gasparin</a>
</li>
<li>
<a href="https://liberapay.com/~1814730/">~1814730</a>
</li>
<li>
<a href="https://liberapay.com/~1847917/">~1847917</a>
</li>
<li>
<a href="https://liberapay.com/~1867501/">~1867501</a>
</li>
</ul>
<div style="text-align: center">
  <a class="button" href="https://tour.gleam.run/">Try Gleam</a>
</div>
<p>This release is dedicated to the memory of my grandfather, Len Pilfold, who
passed away in January.</p>
]]></content></entry></feed>