<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lucamug</title>
    <description>The latest articles on DEV Community by lucamug (@lucamug).</description>
    <link>https://dev.to/lucamug</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F39148%2F79ec2166-383f-4585-be50-d7d9892ec81e.png</url>
      <title>DEV Community: lucamug</title>
      <link>https://dev.to/lucamug</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucamug"/>
    <language>en</language>
    <item>
      <title>Elm 2023, a year in review</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Tue, 16 Apr 2024 06:01:16 +0000</pubDate>
      <link>https://dev.to/lucamug/elm-2023-a-year-in-review-23d6</link>
      <guid>https://dev.to/lucamug/elm-2023-a-year-in-review-23d6</guid>
      <description>&lt;p&gt;2023 has been another exciting year for Elm. I didn't have time to review everything so this year I collected only the podcasts (42 total episodes combining together Elm Radio and Elm Town podcasts) and the Elm Weekly newsletter (52 issues in total).&lt;/p&gt;

&lt;p&gt;Couple of highlight of the year were&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The talk "&lt;a href="https://www.youtube.com/watch?v=XZ3w_jec1v8" rel="noopener noreferrer"&gt;The Economics of Programming Languages&lt;/a&gt;" by Evan Czaplicki at the Strange Loop 2023 conference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XZ3w_jec1v8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Fevan-talk.png" title="The Economics of Programming Languages" alt="The Economics of Programming Languages" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://elm.camp/elm-camp-archive" rel="noopener noreferrer"&gt;Elm Camp Europe 2023&lt;/a&gt;, an unconference held in Denmark from June 28th to June 30th.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.camp/elm-camp-archive" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Funconference.png" title="Elm Camp Europe 2023" alt="Elm Camp Europe 2023" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also this year, a new &lt;a href="https://elm.camp/" rel="noopener noreferrer"&gt;Elm Camp event&lt;/a&gt; has been organized, taking place from the 18th to the 21st of June, 2024 at Colehayes Park, Devon, United Kingdom.&lt;/p&gt;

&lt;p&gt;At the bottom of this post, you can find a partial list of companies that use Elm.&lt;/p&gt;

&lt;p&gt;If you want to keep up with Elm's related news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscribe to the &lt;a href="https://www.elmweekly.nl/" rel="noopener noreferrer"&gt;Elm Weekly newsletter&lt;/a&gt; or follow it on &lt;a href="https://twitter.com/elmweekly" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://elm-lang.org/community/slack" rel="noopener noreferrer"&gt;Elm community on Slack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;a href="https://discourse.elm-lang.org/" rel="noopener noreferrer"&gt;discourse.elm-lang.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/elmlang" rel="noopener noreferrer"&gt;@elmlang on Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Listen to the &lt;a href="https://elm-radio.com/" rel="noopener noreferrer"&gt;Elm Radio podcast&lt;/a&gt; and the &lt;a href="https://elm.town/" rel="noopener noreferrer"&gt;Elm Town podcast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Browse the &lt;a href="https://elmcraft.org/" rel="noopener noreferrer"&gt;Elmcraft website&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;a href="https://incrementalelm.com/chat/" rel="noopener noreferrer"&gt;Incremental Elm Discord&lt;/a&gt; for working on Elm open source projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the previous editions of this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/lucamug/elm-2022-a-year-in-review-33pp"&gt;Elm 2022, a year in review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/lucamug/elm-2021-a-year-in-review-4pho"&gt;Elm 2021, a year in review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also &lt;a href="https://twitter.com/luca_mug" rel="noopener noreferrer"&gt;follow me on Twitter&lt;/a&gt;, as I usually repost Elm related stuff, or &lt;a href="https://twitter.com/luca_mug" rel="noopener noreferrer"&gt;Send me a DM&lt;/a&gt; in case you have any feedback.&lt;/p&gt;

&lt;p&gt;Here we go 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  January 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;2nd&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/security/" rel="noopener noreferrer"&gt;Elm Radio episode #73 - Security in Elm&lt;/a&gt; "We discuss what makes Elm's security vulnerability surface area smaller, and what frontend security considerations are important in Elm apps."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/security/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #73 - Security in Elm" alt="Elm Radio episode #73 - Security in Elm" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;4th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-246" rel="noopener noreferrer"&gt;Elm Weekly issue #246&lt;/a&gt; "Hope everyone is having a great start to 2023. With the start of new things is there anyone that'd like to see Elm Weekly on other platforms beyond…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-246" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #246" alt="Elm Weekly issue #246" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;11th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-247" rel="noopener noreferrer"&gt;Elm Weekly issue #247&lt;/a&gt; "I couldn’t find a section to fit this in, but found it too cute not to include. An animation of a classic robot from &lt;a class="mentioned-user" href="https://dev.to/lucamug"&gt;@lucamug&lt;/a&gt;. Articles and Discussion…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-247" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #247" alt="Elm Weekly issue #247" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;16th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-widgets/" rel="noopener noreferrer"&gt;Elm Radio episode #74 - Plug and Play Design Systems with Georges Boris&lt;/a&gt; "Georges Boris joins us to share two new packages for theming and stateless widgets with minimal boilerplate."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-widgets/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #74 - Plug and Play Design Systems with Georges Boris" alt="Elm Radio episode #74 - Plug and Play Design Systems with Georges Boris" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;18th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-248" rel="noopener noreferrer"&gt;Elm Weekly issue #248&lt;/a&gt; "Articles and Discussion Keys to Elm: Type Annotations @azurewaters talks about type annotations, and how to read and write them. Tools and Projects Geet…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-248" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #248" alt="Elm Weekly issue #248" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;25th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-249" rel="noopener noreferrer"&gt;Elm Weekly issue #249&lt;/a&gt; "Articles and Discussion Tools and Projects MIDI Surf A customizable, browser-based MIDI controller from Chris Wells Wood. elm-tooling Arm Binaries…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-249" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #249" alt="Elm Weekly issue #249" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;30th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-pages-scripts/" rel="noopener noreferrer"&gt;Elm Radio episode #75 - elm-pages scripts&lt;/a&gt; "We discuss elm-pages BackendTasks and how to run them as scripts with a single command."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-pages-scripts/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #75 - elm-pages scripts" alt="Elm Radio episode #75 - elm-pages scripts" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  February 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;1th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-250" rel="noopener noreferrer"&gt;Elm Weekly issue #250&lt;/a&gt; "Articles and Discussion Haskell for Elm Developers Flavio Corpa shares some notes on learning Haskell for someone already familiar with Elm. A Nice…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-250" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #250" alt="Elm Weekly issue #250" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;8th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-251" rel="noopener noreferrer"&gt;Elm Weekly issue #251&lt;/a&gt; "Articles and Discussion Conway's Game of Life, and Emergence There are lots of ways to learn about Conways’s Game of Life and Elm but I really want to…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-251" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #251" alt="Elm Weekly issue #251" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;13th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/vite/" rel="noopener noreferrer"&gt;Elm Radio episode #76 - Elm and Vite&lt;/a&gt; "Lindsay Wardell joins us to talk about Vite and how to set it up for your Elm project."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/vite/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #76 - Elm and Vite" alt="Elm Radio episode #76 - Elm and Vite" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;15th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-252" rel="noopener noreferrer"&gt;Elm Weekly issue #252&lt;/a&gt; "Articles and Discussion Elm 2022, a year in review &lt;a class="mentioned-user" href="https://dev.to/lucamug"&gt;@lucamug&lt;/a&gt; has once again collected all the happenings in the Elm community! 3시간 만에 다 배우는 Elm 가이드 영상 I…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-252" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #252" alt="Elm Weekly issue #252" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;22nd&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-253" rel="noopener noreferrer"&gt;Elm Weekly issue #253&lt;/a&gt; "With the continued Earthquakes in Turkey I thought I’d do something a little out of the ordinary for the newsletter. If you find yourself able to donate…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-253" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #253" alt="Elm Weekly issue #253" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;27th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-app-url/" rel="noopener noreferrer"&gt;Elm Radio episode #77 - elm-app-url with Simon Lydell&lt;/a&gt; "Simon Lydell joins us to talk about a new approach to URL parsing in Elm that is both simple and powerful."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-app-url/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #77 - elm-app-url with Simon Lydell" alt="Elm Radio episode #77 - elm-app-url with Simon Lydell" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  March 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;1th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-254" rel="noopener noreferrer"&gt;Elm Weekly issue #254&lt;/a&gt; "Tools and Projects Elm-like JSON decoding in Java A package from Ethan McCue for decoding JSON in Java, heavily inspired by Elm. elm-card-game A package…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-254" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #254" alt="Elm Weekly issue #254" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;8th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-255" rel="noopener noreferrer"&gt;Elm Weekly issue #255&lt;/a&gt; "New Elm conferences?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-255" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #255" alt="Elm Weekly issue #255" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;13th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/tailwind-color-params/" rel="noopener noreferrer"&gt;Elm Radio episode #78 - Color parameters in elm-tailwind-modules with Philipp Krüger&lt;/a&gt; "Philipp joins us to talk about color parameters in elm-tailwind-modules and how that brings the tool closer to an ideal expression of a design system in Elm."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/tailwind-color-params/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #78 - Color parameters in elm-tailwind-modules with Philipp Krüger" alt="Elm Radio episode #78 - Color parameters in elm-tailwind-modules with Philipp Krüger" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;15th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-256" rel="noopener noreferrer"&gt;Elm Weekly issue #256&lt;/a&gt; "The Elm community has been super busy over the past couple months! I typically hold back 1 or 2 blog posts or videos so that each week I can provide you…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-256" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #256" alt="Elm Weekly issue #256" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;22nd&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-257" rel="noopener noreferrer"&gt;Elm Weekly issue #257&lt;/a&gt; "Articles and Discussion Why is Elm such a delightful programming language? Marcio Frayze brings us another great piece on the joys of programming with…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-257" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #257" alt="Elm Weekly issue #257" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;28th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/scaffolding-elm-code/" rel="noopener noreferrer"&gt;Elm Radio episode #79 - Scaffolding Elm Code&lt;/a&gt; "We discuss the benefits of automating your Elm boilerplate, and design techniques for APIs that generate code."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/scaffolding-elm-code/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #79 - Scaffolding Elm Code" alt="Elm Radio episode #79 - Scaffolding Elm Code" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;29th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-258" rel="noopener noreferrer"&gt;Elm Weekly issue #258&lt;/a&gt; "Articles and Discussion Haskell for Elm developers: giving names to stuff (Part 3 - Monads!) The 3rd installment in Flavio Corpa’s Haskell for Elm devs…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-258" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #258" alt="Elm Weekly issue #258" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  April 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;5th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-259" rel="noopener noreferrer"&gt;Elm Weekly issue #259&lt;/a&gt; "Articles and Discussion Syntax Error #2: print it like a boss The 2nd issue of the Syntax Error newsletter has a section dedicated to Elm, both for it’s…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-259" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #259" alt="Elm Weekly issue #259" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;11th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-and-ai/" rel="noopener noreferrer"&gt;Elm Radio episode #80 - Elm and AI&lt;/a&gt; "Can we get strong guarantees from AI tools that are known to hallucinate? We discuss some strategies, and ways that Elm might be a great target for AI assistance."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-and-ai/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #80 - Elm and AI" alt="Elm Radio episode #80 - Elm and AI" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;12th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-260" rel="noopener noreferrer"&gt;Elm Weekly issue #260&lt;/a&gt; "Does your company use Elm? Do you like supporting the Elm community? Well now your company can support the Elm community too through GitHub Sponsoring…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-260" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #260" alt="Elm Weekly issue #260" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;18th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-54-aloha-with-kevin-yank" rel="noopener noreferrer"&gt;Elm Town episode #54 - Aloha with Kevin Yank&lt;/a&gt; "Kevin Yank shares the challenges Culture Amp faced when scaling Elm &amp;amp; React with a Design System team in the middle, and how an acquisition tipped the ultimate decision to move Elm from “adopt” to “contain” at the company."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-54-aloha-with-kevin-yank" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #54 - Aloha with Kevin Yank" alt="Elm Town episode #54 - Aloha with Kevin Yank" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;19th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-261" rel="noopener noreferrer"&gt;Elm Weekly issue #261&lt;/a&gt; "Elm Camp The first Elm Unconference is happening in late June, giving opportunity for Elm makers &amp;amp; tool builders to gather, communicate and collaborate…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-261" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #261" alt="Elm Weekly issue #261" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;24th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-form/" rel="noopener noreferrer"&gt;Elm Radio episode #81 - elm-form&lt;/a&gt; "We discuss the power of decoupling from data types using low-level data, and how dillonkearns/elm-form gives you simpler wiring that feels like magic but isn't."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-form/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #81 - elm-form" alt="Elm Radio episode #81 - elm-form" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;26th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-262" rel="noopener noreferrer"&gt;Elm Weekly issue #262&lt;/a&gt; "Tools and Projects elm-review 2.13.0 Mostly a rewrite of the internals, but also a bonus of being much faster! Tooty An experimental multi-account…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-262" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #262" alt="Elm Weekly issue #262" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  May 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;2nd&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-55-from-algorithms-animation-to-building-a-decentralized-finance-app" rel="noopener noreferrer"&gt;Elm Town episode #55 - From algorithms &amp;amp; animation to building a decentralized finance app&lt;/a&gt; "Dwayne Crooks stops in to share his appreciation of algorithms, experience learning Elm, challenges building Elm 2048, and how he uses Elm at work to build things like the decentralized finance app, Qoda."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-55-from-algorithms-animation-to-building-a-decentralized-finance-app" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #55 - From algorithms &amp;amp; animation to building a decentralized finance app" alt="Elm Town episode #55 - From algorithms &amp;amp; animation to building a decentralized finance app" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;3rd&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-263" rel="noopener noreferrer"&gt;Elm Weekly issue #263&lt;/a&gt; "Articles and Discussion Programming in Style: From Pattern Matching to Point Free Peter Urbak shows us how to go from a case of having nested pattern…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-263" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #263" alt="Elm Weekly issue #263" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;8th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/haskell/" rel="noopener noreferrer"&gt;Elm Radio episode #82 - Elm and Haskell with Flavio Corpa&lt;/a&gt; "Flavio Corpa joins us to discuss the similarities and differences between Elm and Haskell, and how learning Haskell can help you write better Elm code."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/haskell/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #82 - Elm and Haskell with Flavio Corpa" alt="Elm Radio episode #82 - Elm and Haskell with Flavio Corpa" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;10th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-264" rel="noopener noreferrer"&gt;Elm Weekly issue #264&lt;/a&gt; "Articles and Discussion Experiments with GPT James Carlson gives a brief look at their GPT Lab experiment and some of the art they’ve generated with it…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-264" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #264" alt="Elm Weekly issue #264" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;10th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-2641" rel="noopener noreferrer"&gt;Elm Weekly issue #2641&lt;/a&gt; "Unfortunately 1 of the links in today’s issue is sometimes broken and in a very odd way. So I’m sending out a “patch” so that everyone can enjoy the…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-2641" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #2641" alt="Elm Weekly issue #2641" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;16th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-56-why-dont-you-do-it-in-elm" rel="noopener noreferrer"&gt;Elm Town episode #56 - Why don’t you do it in Elm?&lt;/a&gt; "Théophile Kalumbu comes by to talk about how Elm makes developing a frontend fun, building a design system explorer, iterating quickly, and getting Elm to production."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-56-why-dont-you-do-it-in-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #56 - Why don’t you do it in Elm?" alt="Elm Town episode #56 - Why don’t you do it in Elm?" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;17th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-265" rel="noopener noreferrer"&gt;Elm Weekly issue #265&lt;/a&gt; "Articles and Discussion How to use accounts-ui with Elm and Meteor in 10 minutes A short walk-through of how to setup accounts-ui and accounts-password…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-265" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #265" alt="Elm Weekly issue #265" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;22nd&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-review-data-extractors/" rel="noopener noreferrer"&gt;Elm Radio episode #83 - elm-review Data Extractors&lt;/a&gt; "We discuss elm-review's Data Extractors and how they open up your elm-review context to external tools like data visualizations."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-review-data-extractors/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #83 - elm-review Data Extractors" alt="Elm Radio episode #83 - elm-review Data Extractors" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;24th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-266" rel="noopener noreferrer"&gt;Elm Weekly issue #266&lt;/a&gt; "Articles and Discussion Using Lamdera professionally Martin Stewart talks about using Lamdera at Realia and the tools they built. Why I use Elm in 2023…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-266" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #266" alt="Elm Weekly issue #266" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;30th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-57-brilliant-ways-to-use-elm" rel="noopener noreferrer"&gt;Elm Town episode #57 - Brilliant ways to use Elm&lt;/a&gt; "Aaron Strick shares what it was like learning Elm at NoRedInk, and explains some of the "zany" (delightful) ways Elm is used at Brilliant."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-57-brilliant-ways-to-use-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #57 - Brilliant ways to use Elm" alt="Elm Town episode #57 - Brilliant ways to use Elm" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;31st&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-267" rel="noopener noreferrer"&gt;Elm Weekly issue #267&lt;/a&gt; "Tools and Projects Learn the game Go An app that teaches you how to play Go. Built with Elm by Artur Honzawa. Wyrhta Ceramics Built with Elm Land, Mika…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-267" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #267" alt="Elm Weekly issue #267" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  June 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;7th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-268" rel="noopener noreferrer"&gt;Elm Weekly issue #268&lt;/a&gt; "Articles and Discussion 2023 年、改めて React と Elm Architecture を比較する A short comparison of React and Elm by &lt;a class="mentioned-user" href="https://dev.to/jinjor"&gt;@jinjor&lt;/a&gt;. Tools and Projects orus-io/elm-spa…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-268" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #268" alt="Elm Weekly issue #268" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;13th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-58-unblocking-users-with-quality-software" rel="noopener noreferrer"&gt;Elm Town episode #58 - Unblocking users with quality software&lt;/a&gt; "Tessa Kelly shares her experience unblocking users while building quality software, explains how to avoid the "accessibility dongle" using the Elm philosophy, and considers some tesk9/accessible-html design changes."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-58-unblocking-users-with-quality-software" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #58 - Unblocking users with quality software" alt="Elm Town episode #58 - Unblocking users with quality software" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;14th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-269" rel="noopener noreferrer"&gt;Elm Weekly issue #269&lt;/a&gt; "Tools and Projects Best Web Vitals A little app that keeps score on Google Core Web Vitals for any site. To showcase the best scores globally and to…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-269" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #269" alt="Elm Weekly issue #269" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;19th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/great-docs/" rel="noopener noreferrer"&gt;Elm Radio episode #84 - Writing Great Docs&lt;/a&gt; "We discuss why the baseline for Elm docs is so high, how to navigate docs as a user, and how to make your own docs great."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/great-docs/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #84 - Writing Great Docs" alt="Elm Radio episode #84 - Writing Great Docs" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;21st&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-270" rel="noopener noreferrer"&gt;Elm Weekly issue #270&lt;/a&gt; "Articles and Discussion Showing Any Playing Card From a Deck With Elm Mapping playing cards to Unicode characters, and more. Tools and Projects Enig…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-270" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #270" alt="Elm Weekly issue #270" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;27th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-59-elm-camp-with-katja-mordaunt" rel="noopener noreferrer"&gt;Elm Town episode #59 - Elm Camp with Katja Mordaunt&lt;/a&gt; "Katja Mordaunt talks about Elm vibes versus other programming communities and gives us the low-down on Elm Camp (&lt;a href="https://elm.camp/)" rel="noopener noreferrer"&gt;https://elm.camp/)&lt;/a&gt;."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-59-elm-camp-with-katja-mordaunt" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #59 - Elm Camp with Katja Mordaunt" alt="Elm Town episode #59 - Elm Camp with Katja Mordaunt" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;28th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-271" rel="noopener noreferrer"&gt;Elm Weekly issue #271&lt;/a&gt; "This week is a little short as I’m traveling for Elm Camp &amp;amp; July 4th there won’t be a newsletter as I’ll be traveling home from a vacation. The regular…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-271" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #271" alt="Elm Weekly issue #271" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  July 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;3rd&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/why-we-care-about-elm/" rel="noopener noreferrer"&gt;Elm Radio episode #85 - Why We Care About Elm&lt;/a&gt; "We discuss our backstories, our core values and beliefs as developers, and why Elm speaks to us."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/why-we-care-about-elm/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #85 - Why We Care About Elm" alt="Elm Radio episode #85 - Why We Care About Elm" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;11th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-60-productivity-and-the-culture-of-moving-a-little-bit-slower" rel="noopener noreferrer"&gt;Elm Town episode #60 - Productivity and the culture of moving a little bit slower&lt;/a&gt; "Wolfgang Schuster shares his journey with Elm, describes writing &amp;amp; deleting Elm code at Vendr, and explains the productivity gains in an ecosystem that values building things for the end user."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-60-productivity-and-the-culture-of-moving-a-little-bit-slower" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #60 - Productivity and the culture of moving a little bit slower" alt="Elm Town episode #60 - Productivity and the culture of moving a little bit slower" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;12th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-272" rel="noopener noreferrer"&gt;Elm Weekly issue #272&lt;/a&gt; "Back Home &amp;amp; Busy"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-272" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #272" alt="Elm Weekly issue #272" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;17th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-pages-v3/" rel="noopener noreferrer"&gt;Elm Radio episode #86 - elm-pages v3&lt;/a&gt; "We discuss the new elm-pages v3 release and the new suite of features for full-stack server-side rendered Elm."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-pages-v3/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #86 - elm-pages v3" alt="Elm Radio episode #86 - elm-pages v3" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;19th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-273" rel="noopener noreferrer"&gt;Elm Weekly issue #273&lt;/a&gt; "Articles and Discussion How Writing Code in Elm Changed How I Want to Write Code in Python @dneaves shares how Elm has impacted their Python. Elm Camp…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-273" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #273" alt="Elm Weekly issue #273" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;25th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-61-turning-the-pages-with-dillon-kearns" rel="noopener noreferrer"&gt;Elm Town episode #61 - Turning the pages with Dillon Kearns&lt;/a&gt; "Dillon Kearns turns the pages of his journey with Elm, from applying meta-learning techniques as a classical piano player &amp;amp; agile coach to building a full-stack Elm framework (elm-pages)...."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-61-turning-the-pages-with-dillon-kearns" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #61 - Turning the pages with Dillon Kearns" alt="Elm Town episode #61 - Turning the pages with Dillon Kearns" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;26th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-274" rel="noopener noreferrer"&gt;Elm Weekly issue #274&lt;/a&gt; "Articles and Discussion Demystifying Pratt Parsers Martin Janiczek walks us through writing a Pratt parser. Useful for parsing things that have order of…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-274" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #274" alt="Elm Weekly issue #274" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;31st&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/evergreen/" rel="noopener noreferrer"&gt;Elm Radio episode #87 - Evergreen Migrations with Mario Rogic&lt;/a&gt; "Mario walks us through how Evergreen gives you type-safety between versions of your application, and some improvements in Lamdera 1.1.0."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/evergreen/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #87 - Evergreen Migrations with Mario Rogic" alt="Elm Radio episode #87 - Evergreen Migrations with Mario Rogic" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  August 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;2nd&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-275" rel="noopener noreferrer"&gt;Elm Weekly issue #275&lt;/a&gt; "Articles and Discussion Quiz Craft: the frontend story Antoine Vandermeersch takes us on a journey of building a front end for their quiz app. Tools and…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-275" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #275" alt="Elm Weekly issue #275" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;9th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-276" rel="noopener noreferrer"&gt;Elm Weekly issue #276&lt;/a&gt; "Articles and Discussion 7 GUIs Dwayne Crooks’ implementation of 7GUIs: A GUI Programming Benchmark. How to manage HTTP requests on page load with elm…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-276" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #276" alt="Elm Weekly issue #276" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;14th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/avoiding-unused-code/" rel="noopener noreferrer"&gt;Elm Radio episode #88 - Avoiding Unused Code&lt;/a&gt; "We discuss how to avoid unused Elm code, why it matters, and what leads to unused code in the first place."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/avoiding-unused-code/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #88 - Avoiding Unused Code" alt="Elm Radio episode #88 - Avoiding Unused Code" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;16th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-277" rel="noopener noreferrer"&gt;Elm Weekly issue #277&lt;/a&gt; "Articles and Discussion Taking Screenshots with Elm 0.19 Flavio Corpa demonstrates for us how to take screenshots in Elm. Wrapper modules can lead to…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-277" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #277" alt="Elm Weekly issue #277" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;22nd&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-63-opening-the-doors-of-functional-programming" rel="noopener noreferrer"&gt;Elm Town episode #63 - Opening the doors of functional programming&lt;/a&gt; "Join Mika Naylor on her journey with functional programming through the doors of Elm to Elm Land and beyond."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-63-opening-the-doors-of-functional-programming" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #63 - Opening the doors of functional programming" alt="Elm Town episode #63 - Opening the doors of functional programming" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;23rd&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-278" rel="noopener noreferrer"&gt;Elm Weekly issue #278&lt;/a&gt; "Articles and Discussion Useful Chompers Dwayne Crooks walks us through building some useful chompers with elm/parser. Tools and Projects SubGrid A…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-278" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #278" alt="Elm Weekly issue #278" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;28th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/human-side-of-open-source/" rel="noopener noreferrer"&gt;Elm Radio episode #89 - The Human Side of Open Source&lt;/a&gt; "We discuss the role of Open Source Software and how we approach leadership and communication in our projects."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/human-side-of-open-source/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #89 - The Human Side of Open Source" alt="Elm Radio episode #89 - The Human Side of Open Source" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;30th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-279" rel="noopener noreferrer"&gt;Elm Weekly issue #279&lt;/a&gt; "Articles and Discussion Smart Event Listeners Applying the idea of “parse, don’t validate” to event handlers, with Dwayne Crooks. Talks and Podcasts 🍿…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-279" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #279" alt="Elm Weekly issue #279" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  September 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;5th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-64-the-network-effect" rel="noopener noreferrer"&gt;Elm Town episode #64 - The network effect&lt;/a&gt; "Martin Stewart comes back to share his experience using Elm and Lamdera to make all the things, from games to professional apps."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-64-the-network-effect" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #64 - The network effect" alt="Elm Town episode #64 - The network effect" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;6th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-280" rel="noopener noreferrer"&gt;Elm Weekly issue #280&lt;/a&gt; "State of Elm 2023 The community run survey is back again this year. Articles and Discussion Bring your own DOM - Part 2 - TUIs Wolfgang Schuster walks…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-280" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #280" alt="Elm Weekly issue #280" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;8th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-62-the-map-to-elm-land" rel="noopener noreferrer"&gt;Elm Town episode #62 - The map to Elm Land&lt;/a&gt; "Ryan Haskell-Glatz talks about making Elm mainstream, learning through iterations of elm-spa, and how experiences at Vendr shaped Elm Land."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-62-the-map-to-elm-land" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #62 - The map to Elm Land" alt="Elm Town episode #62 - The map to Elm Land" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;11th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-land/" rel="noopener noreferrer"&gt;Elm Radio episode #90 - elm-land with Ryan Haskell-Glatz&lt;/a&gt; "We discuss elm-land, how it compares to elm-spa, and its philosophy of making Elm mainstream."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-land/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #90 - elm-land with Ryan Haskell-Glatz" alt="Elm Radio episode #90 - elm-land with Ryan Haskell-Glatz" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;13th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-281" rel="noopener noreferrer"&gt;Elm Weekly issue #281&lt;/a&gt; "Articles and Discussion Why Elm Might Be a Better Choice Than React for Your Next Web Project Charlotte Neill shares why Elm is their choice for web…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-281" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #281" alt="Elm Weekly issue #281" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;19th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-65-lets-roll-with-it" rel="noopener noreferrer"&gt;Elm Town episode #65 - Let's roll with it&lt;/a&gt; "We review Jeroen Engels' journey with Elm from ESLint to elm-review. Jeroen even gives tips on how to introduce rules to a team."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-65-lets-roll-with-it" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #65 - Let's roll with it" alt="Elm Town episode #65 - Let's roll with it" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;20th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-282" rel="noopener noreferrer"&gt;Elm Weekly issue #282&lt;/a&gt; "Games! 🕹️"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-282" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #282" alt="Elm Weekly issue #282" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;21st&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=XZ3w_jec1v8" rel="noopener noreferrer"&gt;The Economics of Programming Languages&lt;/a&gt; - A presentation by &lt;strong&gt;by Evan Czaplicki&lt;/strong&gt; at Strange Loop 2023&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XZ3w_jec1v8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FXZ3w_jec1v8%2Fmqdefault.jpg" title="The Economics of Programming Languages" alt="The Economics of Programming Languages" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;25th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/code-reading-club/" rel="noopener noreferrer"&gt;Elm Radio episode #91 - Code Reading Club with Katja Mordaunt&lt;/a&gt; "We discuss Code Reading Club, how improving your code reading skills can make you a better programmer, and the readability of Elm code."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/code-reading-club/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #91 - Code Reading Club with Katja Mordaunt" alt="Elm Radio episode #91 - Code Reading Club with Katja Mordaunt" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;27th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-283" rel="noopener noreferrer"&gt;Elm Weekly issue #283&lt;/a&gt; "Tools and Projects elm-to-gh-pages An example project from Isaac Van Doren for how to setup GitHub Actions to deploy your Elm app to GitHub Pages…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-283" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #283" alt="Elm Weekly issue #283" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  October 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;3rd&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-66-a-gateway-to-scientific-research" rel="noopener noreferrer"&gt;Elm Town episode #66 - A gateway to scientific research&lt;/a&gt; "Chris Martin shares how he grew Elm wings while building Exosphere, a user-friendly, open-source tool to help scientists do research."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-66-a-gateway-to-scientific-research" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #66 - A gateway to scientific research" alt="Elm Town episode #66 - A gateway to scientific research" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;4th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-284" rel="noopener noreferrer"&gt;Elm Weekly issue #284&lt;/a&gt; "It was brought to my attention last week that is my 100th issue! It doesn’t help that I’m not too attentive to the numbers, but also it really does feel…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-284" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #284" alt="Elm Weekly issue #284" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;9th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-news/" rel="noopener noreferrer"&gt;Elm Radio episode #92 - Elm News with Wolfgang Schuster&lt;/a&gt; "Wolfgang joins us to discuss his philosophy and approach to sharing what's new in the Elm community."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-news/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #92 - Elm News with Wolfgang Schuster" alt="Elm Radio episode #92 - Elm News with Wolfgang Schuster" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;11th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-285" rel="noopener noreferrer"&gt;Elm Weekly issue #285&lt;/a&gt; "Tools and Projects Queens Lair A chess puzzle game from Lucas Payr. New macOS ARM binary A new release of the Elm binary for ARM based macs. Connect 4…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-285" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #285" alt="Elm Weekly issue #285" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;17th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-67-breaking-things-down-with-gingko-writer" rel="noopener noreferrer"&gt;Elm Town episode #67 - Breaking things down with Gingko Writer&lt;/a&gt; "Adriano Ferrari talks about how Elm allows him to solely support Gingko Writer and make progress on new projects while also homeschooling."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-67-breaking-things-down-with-gingko-writer" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #67 - Breaking things down with Gingko Writer" alt="Elm Town episode #67 - Breaking things down with Gingko Writer" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;18th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-286" rel="noopener noreferrer"&gt;Elm Weekly issue #286&lt;/a&gt; "Articles and Discussion Worst Elm Code Possible A summary from Mario's elm-camp session on what bad Elm looks like. Tools and Projects…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-286" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #286" alt="Elm Weekly issue #286" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;23rd&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-visualization/" rel="noopener noreferrer"&gt;Elm Radio episode #93 - elm-visualization with Jakub Hampl&lt;/a&gt; "Jakub Hampl joins us to discuss elm-visualization and how it enables powerful flexibility through its low-level building blocks philosophy."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-visualization/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #93 - elm-visualization with Jakub Hampl" alt="Elm Radio episode #93 - elm-visualization with Jakub Hampl" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;25th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-287" rel="noopener noreferrer"&gt;Elm Weekly issue #287&lt;/a&gt; "Articles and Discussion Rebuilding Final Fantasy Legend in Elm Jesse Warden talks about their journey so far of rebuilding Final Fantasy Legend. Elm…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-287" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #287" alt="Elm Weekly issue #287" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;31st&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-68-shared-joy-with-mario-rogic" rel="noopener noreferrer"&gt;Elm Town episode #68 - Shared joy with Mario Rogic&lt;/a&gt; "Mario Rogic shares his journeys, both physically around the world and strategically, as he built &amp;amp; rebuilt Lamdera."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-68-shared-joy-with-mario-rogic" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #68 - Shared joy with Mario Rogic" alt="Elm Town episode #68 - Shared joy with Mario Rogic" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  November 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;1th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-288" rel="noopener noreferrer"&gt;Elm Weekly issue #288&lt;/a&gt; "Articles and Discussion Final Fantasy Legend Level Editor Update A short post from Jesse on 2D grids in Elm. Do you have opinions about coding style…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-288" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #288" alt="Elm Weekly issue #288" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;6th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-concurrent-task/" rel="noopener noreferrer"&gt;Elm Radio episode #94 - elm-concurrent-task with Andrew MacMurray&lt;/a&gt; "Andrew MacMurray joins us to discuss &lt;code&gt;elm-concurrent-task&lt;/code&gt; which allows you to run JavaScript functions with a Task style API."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-concurrent-task/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #94 - elm-concurrent-task with Andrew MacMurray" alt="Elm Radio episode #94 - elm-concurrent-task with Andrew MacMurray" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;8th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-289" rel="noopener noreferrer"&gt;Elm Weekly issue #289&lt;/a&gt; "Articles and Discussion Tools and Projects A Text-to-Drumbeat App A fun tool for turning text into music, from James Carlson. orus-io/elm-nats A pure…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-289" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #289" alt="Elm Weekly issue #289" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;14th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-69-a-vision-for-tooling-with-simon-lydell" rel="noopener noreferrer"&gt;Elm Town episode #69 - A vision for tooling with Simon Lydell&lt;/a&gt; "Simon Lydell tells his origin story from Firefox power user to full-time Elm engineer. Then we talk about his work in the community building tools &amp;amp; contributing to core."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-69-a-vision-for-tooling-with-simon-lydell" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #69 - A vision for tooling with Simon Lydell" alt="Elm Town episode #69 - A vision for tooling with Simon Lydell" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;15th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-290" rel="noopener noreferrer"&gt;Elm Weekly issue #290&lt;/a&gt; "Tools and Projects upsiflu/less-ui An experimental package from Flupsi for building UIs, with a demo to help get you started…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-290" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #290" alt="Elm Weekly issue #290" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;20th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-open-api/" rel="noopener noreferrer"&gt;Elm Radio episode #95 - elm-open-api with Wolfgang Schuster&lt;/a&gt; "Wolfgang Schuster joins us to discuss generating type-safe SDKs using elm-open-api."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-open-api/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #95 - elm-open-api with Wolfgang Schuster" alt="Elm Radio episode #95 - elm-open-api with Wolfgang Schuster" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;22nd&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-291" rel="noopener noreferrer"&gt;Elm Weekly issue #291&lt;/a&gt; "Articles and Discussion Using GitHub Copilot with Elm Per Lundholm talks about using Copilot with Elm. Tools and Projects Elm Tauri App A new template…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-291" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #291" alt="Elm Weekly issue #291" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;28th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-70-getting-out-of-the-basement-with-jim-carlson" rel="noopener noreferrer"&gt;Elm Town episode #70 - Getting out of the basement with Jim Carlson&lt;/a&gt; "Jim Carlson shares his discoveries in software development through the people he's met in the community and the projects he's building. We also discuss how a history in mathematics shapes his work."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-70-getting-out-of-the-basement-with-jim-carlson" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #70 - Getting out of the basement with Jim Carlson" alt="Elm Town episode #70 - Getting out of the basement with Jim Carlson" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;29th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-292" rel="noopener noreferrer"&gt;Elm Weekly issue #292&lt;/a&gt; "Tools and Projects elm-performance-tools An experimental tool for measuring the performance of your Elm code. Built with Elm: Adaptiv Adaptiv has remade…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-292" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #292" alt="Elm Weekly issue #292" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  December 2023
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;4th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/bundle-size/" rel="noopener noreferrer"&gt;Elm Radio episode #96 - Optimizing Bundle Size&lt;/a&gt; "We discuss Elm's strengths and weaknesses for optimizing bundle size, and how find and fix your app's bundle size bottlenecks."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/bundle-size/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-radio.png" title="Elm Radio episode #96 - Optimizing Bundle Size" alt="Elm Radio episode #96 - Optimizing Bundle Size" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;6th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-293" rel="noopener noreferrer"&gt;Elm Weekly issue #293&lt;/a&gt; "Articles and Discussion AOC23 - 1 December by @thelayeredmind @thelayeredmind walks us through learning Elm &amp;amp; solving Advent of Code day 1. Tools and…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-293" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #293" alt="Elm Weekly issue #293" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;12th&lt;/em&gt; - &lt;a href="https://elm.town/episodes/elm-town-71-embracing-wins-with-lindsay-wardell" rel="noopener noreferrer"&gt;Elm Town episode #71 - Embracing wins with Lindsay Wardell&lt;/a&gt; "Lindsay Wardell tells how she persevered to write her own story as a programmer and shares her views on JavaScript frameworks &amp;amp; fatigue."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm.town/episodes/elm-town-71-embracing-wins-with-lindsay-wardell" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-town.png" title="Elm Town episode #71 - Embracing wins with Lindsay Wardell" alt="Elm Town episode #71 - Embracing wins with Lindsay Wardell" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;13th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-294" rel="noopener noreferrer"&gt;Elm Weekly issue #294&lt;/a&gt; "Articles and Discussion AOC23 - 2 December by @thelayeredmind @thelayeredmind walks us through learning Elm &amp;amp; solving Advent of Code day 2. Tools and…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-294" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #294" alt="Elm Weekly issue #294" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;20th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-295" rel="noopener noreferrer"&gt;Elm Weekly issue #295&lt;/a&gt; "Articles and Discussion On continuation-passing style and the factorial function Dwayne Crooks writes about continuation-passing style and Elm. Record…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-295" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #295" alt="Elm Weekly issue #295" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;27th&lt;/em&gt; - &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-296" rel="noopener noreferrer"&gt;Elm Weekly issue #296&lt;/a&gt; "A few months ago I thought it’d be cool if I started storing all of the issues in spreadsheets (might move to a database in the future). This was mostly…"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-296" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2023%2Felm-weekly.png" title="Elm Weekly issue #296" alt="Elm Weekly issue #296" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Partial list of companies that use Elm
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.ableton.com/en/about/" rel="noopener noreferrer"&gt;Ableton&lt;/a&gt; ⬩  &lt;a href="https://www.acima.com/" rel="noopener noreferrer"&gt;Acima&lt;/a&gt; ⬩  &lt;a href="https://www.acko.com/" rel="noopener noreferrer"&gt;ACKO&lt;/a&gt; ⬩  &lt;a href="https://www.activestate.com/" rel="noopener noreferrer"&gt;ActiveState&lt;/a&gt; ⬩  &lt;a href="https://adrima.es" rel="noopener noreferrer"&gt;Adrima&lt;/a&gt; ⬩  &lt;a href="https://ajrintl.com/" rel="noopener noreferrer"&gt;AJR International&lt;/a&gt; ⬩  &lt;a href="https://almapay.com/" rel="noopener noreferrer"&gt;Alma&lt;/a&gt; ⬩  &lt;a href="https://astrosat.net/" rel="noopener noreferrer"&gt;Astrosat&lt;/a&gt; ⬩  &lt;a href="https://www.avasecurity.com/" rel="noopener noreferrer"&gt;Ava&lt;/a&gt; ⬩  &lt;a href="https://www.avetta.com/" rel="noopener noreferrer"&gt;Avetta&lt;/a&gt; ⬩  &lt;a href="https://www.azara.io/" rel="noopener noreferrer"&gt;Azara&lt;/a&gt; ⬩  &lt;a href="https://meine-barmenia.de/" rel="noopener noreferrer"&gt;Barmenia&lt;/a&gt; ⬩  &lt;a href="https://basiq.io/" rel="noopener noreferrer"&gt;Basiq&lt;/a&gt; ⬩  &lt;a href="http://www.beautifuldestinations.com/" rel="noopener noreferrer"&gt;Beautiful Destinations&lt;/a&gt; ⬩  &lt;a href="http://bec-systems.com" rel="noopener noreferrer"&gt;BEC Systems&lt;/a&gt; ⬩  &lt;a href="https://www.bekk.no/" rel="noopener noreferrer"&gt;Bekk&lt;/a&gt; ⬩  &lt;a href="https://bellroy.com/" rel="noopener noreferrer"&gt;Bellroy&lt;/a&gt; ⬩  &lt;a href="https://bendyworks.com" rel="noopener noreferrer"&gt;Bendyworks&lt;/a&gt; ⬩  &lt;a href="https://www.bernoullifinance.com/" rel="noopener noreferrer"&gt;Bernoulli Finance&lt;/a&gt; ⬩  &lt;a href="https://bluedogtraining.com.au/" rel="noopener noreferrer"&gt;Blue Fog Training&lt;/a&gt; ⬩  &lt;a href="https://web.bravotran.com/" rel="noopener noreferrer"&gt;BravoTran&lt;/a&gt; ⬩  &lt;a href="https://www.brilliant.org/" rel="noopener noreferrer"&gt;Brilliant&lt;/a&gt; ⬩  &lt;a href="https://budapestschool.org/en/" rel="noopener noreferrer"&gt;Budapest School&lt;/a&gt; ⬩  &lt;a href="https://buildr.com/" rel="noopener noreferrer"&gt;Buildr&lt;/a&gt; ⬩  &lt;a href="https://cachix.org/" rel="noopener noreferrer"&gt;Cachix&lt;/a&gt; ⬩  &lt;a href="https://calculojuridico.com.br/" rel="noopener noreferrer"&gt;CalculoJuridico&lt;/a&gt; ⬩  &lt;a href="https://www.carerev.com/" rel="noopener noreferrer"&gt;CareRev&lt;/a&gt; ⬩  &lt;a href="https://www.carfax.com/" rel="noopener noreferrer"&gt;CARFAX&lt;/a&gt; ⬩  &lt;a href="https://www.caribou.com/" rel="noopener noreferrer"&gt;Caribou&lt;/a&gt; ⬩  &lt;a href="https://www.carwow.co.uk/" rel="noopener noreferrer"&gt;carwow&lt;/a&gt; ⬩  &lt;a href="https://www.cbancnetwork.com" rel="noopener noreferrer"&gt;CBANC&lt;/a&gt; ⬩  &lt;a href="https://circuithub.com/" rel="noopener noreferrer"&gt;CircuitHub&lt;/a&gt; ⬩  &lt;a href="https://www.cngroup.dk/" rel="noopener noreferrer"&gt;CN Group CZ&lt;/a&gt; ⬩  &lt;a href="https://cointracking.info/" rel="noopener noreferrer"&gt;CoinTracking&lt;/a&gt; ⬩  &lt;a href="https://concourse-ci.org" rel="noopener noreferrer"&gt;Concourse CI&lt;/a&gt; ⬩  &lt;a href="https://consensys.net/" rel="noopener noreferrer"&gt;Consensys&lt;/a&gt; ⬩  &lt;a href="https://s.tech.cornell.edu/" rel="noopener noreferrer"&gt;Cornell Tech&lt;/a&gt; ⬩  &lt;a href="https://www.corvusinsurance.com/" rel="noopener noreferrer"&gt;Corvus&lt;/a&gt; ⬩  &lt;a href="https://www.crowdstrike.com/" rel="noopener noreferrer"&gt;Crowdstrike&lt;/a&gt; ⬩  &lt;a href="https://cultureamp.com" rel="noopener noreferrer"&gt;Culture Amp&lt;/a&gt; ⬩  &lt;a href="https://www.dayoneapp.com/" rel="noopener noreferrer"&gt;Day One&lt;/a&gt; ⬩  &lt;a href="https://deepgram.com" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt; ⬩  &lt;a href="https://diesdas.digital" rel="noopener noreferrer"&gt;diesdas.digital&lt;/a&gt; ⬩  &lt;a href="https://www.dividat.com" rel="noopener noreferrer"&gt;Dividat&lt;/a&gt; ⬩  &lt;a href="https://www.driebit.nl/nl/about" rel="noopener noreferrer"&gt;Driebit&lt;/a&gt; ⬩  &lt;a href="https://drip.com" rel="noopener noreferrer"&gt;Drip&lt;/a&gt; ⬩  &lt;a href="https://www.emirates.com/" rel="noopener noreferrer"&gt;Emirates&lt;/a&gt; ⬩  &lt;a href="https://www.esparklearning.com" rel="noopener noreferrer"&gt;eSpark&lt;/a&gt; ⬩  &lt;a href="https://www.exrny.com/" rel="noopener noreferrer"&gt;EXR&lt;/a&gt; ⬩  &lt;a href="http://www.featurespace.com/" rel="noopener noreferrer"&gt;Featurespace&lt;/a&gt; ⬩  &lt;a href="https://field33.com/" rel="noopener noreferrer"&gt;Field 33&lt;/a&gt; ⬩  &lt;a href="https://fission.codes" rel="noopener noreferrer"&gt;Fission&lt;/a&gt; ⬩  &lt;a href="https://withflint.com/" rel="noopener noreferrer"&gt;Flint&lt;/a&gt; ⬩  &lt;a href="https://folq.no/" rel="noopener noreferrer"&gt;Folq&lt;/a&gt; ⬩  &lt;a href="https://www.ford.com/" rel="noopener noreferrer"&gt;Ford&lt;/a&gt; ⬩  &lt;a href="https://www.frende.no/" rel="noopener noreferrer"&gt;Forsikring&lt;/a&gt; ⬩  &lt;a href="https://www.foxhound.systems/" rel="noopener noreferrer"&gt;Foxhound Systems&lt;/a&gt; ⬩  &lt;a href="http://futurice.com/" rel="noopener noreferrer"&gt;Futurice&lt;/a&gt; ⬩  &lt;a href="https://www.fgirot.se/" rel="noopener noreferrer"&gt;FörsäkringsGirot&lt;/a&gt; ⬩  &lt;a href="https://generative.vision/" rel="noopener noreferrer"&gt;Generative&lt;/a&gt; ⬩  &lt;a href="https://www.genesys.com/" rel="noopener noreferrer"&gt;Genesys&lt;/a&gt; ⬩  &lt;a href="https://www.geora.io/" rel="noopener noreferrer"&gt;Geora&lt;/a&gt; ⬩  &lt;a href="http://www.gizra.com/" rel="noopener noreferrer"&gt;Gizra&lt;/a&gt; ⬩  &lt;a href="https://www.gwi.com/" rel="noopener noreferrer"&gt;GWI&lt;/a&gt; ⬩  &lt;a href="https://www.hambs.com.au/" rel="noopener noreferrer"&gt;HAMBS&lt;/a&gt; ⬩  &lt;a href="https://hatchcare.com/" rel="noopener noreferrer"&gt;Hatch&lt;/a&gt; ⬩  &lt;a href="https://www.wearehearken.com" rel="noopener noreferrer"&gt;Hearken&lt;/a&gt; ⬩  &lt;a href="https://hellorse.fr/" rel="noopener noreferrer"&gt;hello RSE&lt;/a&gt; ⬩  &lt;a href="https://engineering.hubtran.com" rel="noopener noreferrer"&gt;HubTran&lt;/a&gt; ⬩  &lt;a href="https://www.ibm.com/" rel="noopener noreferrer"&gt;IBM&lt;/a&gt; ⬩  &lt;a href="https://idein.jp/" rel="noopener noreferrer"&gt;Idein&lt;/a&gt; ⬩  &lt;a href="https://www.goilluminate.com" rel="noopener noreferrer"&gt;Illuminate&lt;/a&gt; ⬩  &lt;a href="https://www.improbable.io/" rel="noopener noreferrer"&gt;Improbable&lt;/a&gt; ⬩  &lt;a href="https://hendrikbelitz.de/" rel="noopener noreferrer"&gt;Innovation through understanding&lt;/a&gt; ⬩  &lt;a href="https://insurello.se" rel="noopener noreferrer"&gt;Insurello&lt;/a&gt; ⬩  &lt;a href="https://iwantmyname.com/" rel="noopener noreferrer"&gt;iwantmyname&lt;/a&gt; ⬩  &lt;a href="https://jambit.com" rel="noopener noreferrer"&gt;jambit&lt;/a&gt; ⬩  &lt;a href="https://www.jobvite.com/" rel="noopener noreferrer"&gt;Jobvite&lt;/a&gt; ⬩  &lt;a href="http://www.kovnet.nl" rel="noopener noreferrer"&gt;KOVnet&lt;/a&gt; ⬩  &lt;a href="http://kulkul.tech/" rel="noopener noreferrer"&gt;Kulkul&lt;/a&gt; ⬩  &lt;a href="https://logisticallyinc.com" rel="noopener noreferrer"&gt;Logistically&lt;/a&gt; ⬩  &lt;a href="https://de.luko.eu/" rel="noopener noreferrer"&gt;Luko&lt;/a&gt; ⬩  &lt;a href="https://www.metronomics.com/" rel="noopener noreferrer"&gt;Metronome Growth Systems&lt;/a&gt; ⬩  &lt;a href="https://www.microsoft.com" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt; ⬩  &lt;a href="https://www.midwayusa.com/" rel="noopener noreferrer"&gt;MidwayUSA&lt;/a&gt; ⬩  &lt;a href="https://getmimo.com" rel="noopener noreferrer"&gt;Mimo&lt;/a&gt; ⬩  &lt;a href="https://themindgym.com/" rel="noopener noreferrer"&gt;Mind Gym&lt;/a&gt; ⬩  &lt;a href="https://themindgym.com/" rel="noopener noreferrer"&gt;MindGym&lt;/a&gt; ⬩  &lt;a href="https://www.nextdlp.com/" rel="noopener noreferrer"&gt;Next DLP&lt;/a&gt; ⬩  &lt;a href="https://nlx.ai" rel="noopener noreferrer"&gt;NLX&lt;/a&gt; ⬩  &lt;a href="https://www.nomalab.com" rel="noopener noreferrer"&gt;Nomalab&lt;/a&gt; ⬩  &lt;a href="https://nomiadherence.com/" rel="noopener noreferrer"&gt;Nomi&lt;/a&gt; ⬩  &lt;a href="https://www.noredink.com/" rel="noopener noreferrer"&gt;NoRedInk&lt;/a&gt; ⬩  &lt;a href="https://novabench.com/" rel="noopener noreferrer"&gt;Novabench&lt;/a&gt; ⬩  &lt;a href="https://www.nzherald.co.nz/" rel="noopener noreferrer"&gt;NZ Herald&lt;/a&gt; ⬩  &lt;a href="https://permutive.com/" rel="noopener noreferrer"&gt;Permutive&lt;/a&gt; ⬩  &lt;a href="https://phrase.com/lp/translation-management-system/" rel="noopener noreferrer"&gt;Phrase&lt;/a&gt; ⬩  &lt;a href="https://www.gopinata.com/" rel="noopener noreferrer"&gt;PINATA&lt;/a&gt; ⬩  &lt;a href="http://www.pinmeto.com" rel="noopener noreferrer"&gt;PinMeTo&lt;/a&gt; ⬩  &lt;a href="https://www.pivotaltracker.com/" rel="noopener noreferrer"&gt;Pivotal Tracker&lt;/a&gt; ⬩  &lt;a href="https://www.powerreviews.com/" rel="noopener noreferrer"&gt;PowerReviews&lt;/a&gt; ⬩  &lt;a href="https://practle.io/" rel="noopener noreferrer"&gt;Practle&lt;/a&gt; ⬩  &lt;a href="https://www.prima.it/" rel="noopener noreferrer"&gt;Prima&lt;/a&gt; ⬩  &lt;a href="https://global.rakuten.com/corp/" rel="noopener noreferrer"&gt;Rakuten&lt;/a&gt; ⬩  &lt;a href="https://roompact.com/" rel="noopener noreferrer"&gt;Roompact&lt;/a&gt; ⬩  &lt;a href="https://savr.com/" rel="noopener noreferrer"&gt;SAVR&lt;/a&gt; ⬩  &lt;a href="https://scoville.jp/" rel="noopener noreferrer"&gt;Scoville&lt;/a&gt; ⬩  &lt;a href="https://scrive.com" rel="noopener noreferrer"&gt;Scrive&lt;/a&gt; ⬩  &lt;a href="https://www.scrivito.com/" rel="noopener noreferrer"&gt;Scrivito&lt;/a&gt; ⬩  &lt;a href="https://www.serenytics.com/" rel="noopener noreferrer"&gt;Serenytics&lt;/a&gt; ⬩  &lt;a href="https://www.smallbrooks.com" rel="noopener noreferrer"&gt;Smallbrooks&lt;/a&gt; ⬩  &lt;a href="https://snapview.net" rel="noopener noreferrer"&gt;Snapview&lt;/a&gt; ⬩  &lt;a href="https://www.sopost.com/" rel="noopener noreferrer"&gt;SoPost&lt;/a&gt; ⬩  &lt;a href="https://www.splinkns.com/" rel="noopener noreferrer"&gt;Splink&lt;/a&gt; ⬩  &lt;a href="https://spottt.fr/" rel="noopener noreferrer"&gt;Spottt&lt;/a&gt; ⬩  &lt;a href="https://www.stax.io/" rel="noopener noreferrer"&gt;Stax&lt;/a&gt; ⬩  &lt;a href="https://www.stowga.com" rel="noopener noreferrer"&gt;Stowga&lt;/a&gt; ⬩  &lt;a href="https://structionsite.com/" rel="noopener noreferrer"&gt;StructionSite&lt;/a&gt; ⬩  &lt;a href="https://for-school.studyplus.co.jp/" rel="noopener noreferrer"&gt;Studyplus For School&lt;/a&gt; ⬩  &lt;a href="https://www.symbaloo.com" rel="noopener noreferrer"&gt;Symbaloo&lt;/a&gt; ⬩  &lt;a href="https://www.talend.com/" rel="noopener noreferrer"&gt;Talend&lt;/a&gt; ⬩  &lt;a href="https://www.tallink.com/" rel="noopener noreferrer"&gt;Tallink &amp;amp; Silja Line&lt;/a&gt; ⬩  &lt;a href="http://testdouble.com" rel="noopener noreferrer"&gt;Test Double&lt;/a&gt; ⬩  &lt;a href="https://thoughtbot.com/services/elm" rel="noopener noreferrer"&gt;thoughtbot&lt;/a&gt; ⬩  &lt;a href="https://www.travelperk.com/" rel="noopener noreferrer"&gt;Travel Perk&lt;/a&gt; ⬩  &lt;a href="https://truqu.com/" rel="noopener noreferrer"&gt;TruQu&lt;/a&gt; ⬩  &lt;a href="https://twave.io/" rel="noopener noreferrer"&gt;TWave&lt;/a&gt; ⬩  &lt;a href="https://www.tylertech.com/" rel="noopener noreferrer"&gt;Tyler&lt;/a&gt; ⬩  &lt;a href="https://www.uncover.co/" rel="noopener noreferrer"&gt;Uncover&lt;/a&gt; ⬩  &lt;a href="https://www.unisonweb.org/" rel="noopener noreferrer"&gt;Unison&lt;/a&gt; ⬩  &lt;a href="https://veeva.com/" rel="noopener noreferrer"&gt;Veeva&lt;/a&gt; ⬩  &lt;a href="https://www.vendr.com/" rel="noopener noreferrer"&gt;Vendr&lt;/a&gt; ⬩  &lt;a href="https://verityplatform.com/" rel="noopener noreferrer"&gt;Verity&lt;/a&gt; ⬩  &lt;a href="https://www.vnator.tech/" rel="noopener noreferrer"&gt;Vnator&lt;/a&gt; ⬩  &lt;a href="https://www.vy.no/" rel="noopener noreferrer"&gt;Vy&lt;/a&gt; ⬩  &lt;a href="https://www.ww-ag.com/de/ww-interaction-solutions" rel="noopener noreferrer"&gt;W&amp;amp;W Interaction Solutions&lt;/a&gt; ⬩  &lt;a href="https://www.watermarkinsights.com/" rel="noopener noreferrer"&gt;Watermark&lt;/a&gt; ⬩  &lt;a href="https://webbhuset.se" rel="noopener noreferrer"&gt;Webbhuset&lt;/a&gt; ⬩  &lt;a href="https://www.wejoinin.com" rel="noopener noreferrer"&gt;Wejoinin&lt;/a&gt; ⬩  &lt;a href="https://zalora.com/" rel="noopener noreferrer"&gt;Zalora&lt;/a&gt; ⬩  &lt;a href="https://zeit.io" rel="noopener noreferrer"&gt;ZEIT.IO&lt;/a&gt; ⬩  &lt;a href="https://www.zettle.com" rel="noopener noreferrer"&gt;Zettle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This list is extracted from several sources, such as &lt;a href="https://github.com/jah2488/elm-companies" rel="noopener noreferrer"&gt;elm-companies&lt;/a&gt;, &lt;a href="https://stackshare.io/elm" rel="noopener noreferrer"&gt;Stackshare.io&lt;/a&gt;, blog posts, videos, talks, atc.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;This is all ❤️&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>elm</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Elm 2022, a year in review</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Tue, 31 Jan 2023 01:17:40 +0000</pubDate>
      <link>https://dev.to/lucamug/elm-2022-a-year-in-review-33pp</link>
      <guid>https://dev.to/lucamug/elm-2022-a-year-in-review-33pp</guid>
      <description>&lt;p&gt;2022 has been another exciting year for Elm, with many interesting packages, blog posts, videos, podcasts, demos, tutorials, applications, and so on. &lt;/p&gt;

&lt;p&gt;Let's have a look at it in retrospect.&lt;/p&gt;

&lt;p&gt;This is a list of relevant materials. I am sure there is stuff that I missed. &lt;a href="https://twitter.com/luca_mug" rel="noopener noreferrer"&gt;Send me a DM&lt;/a&gt; in case you think there is something that I should add or remove.&lt;/p&gt;

&lt;p&gt;At the bottom, you will also find some of the companies that hired Elm developers in 2022 and a partial list of companies that use Elm.&lt;/p&gt;

&lt;p&gt;If you want to keep up with Elm's related news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscribe to the &lt;a href="https://www.elmweekly.nl/" rel="noopener noreferrer"&gt;Elm Weekly newsletter&lt;/a&gt; or follow it on &lt;a href="https://twitter.com/elmweekly" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://elm-lang.org/community/slack" rel="noopener noreferrer"&gt;Elm community on Slack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;a href="https://discourse.elm-lang.org/" rel="noopener noreferrer"&gt;discourse.elm-lang.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/elmlang" rel="noopener noreferrer"&gt;@elmlang on Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Listen to the &lt;a href="https://elm-radio.com/" rel="noopener noreferrer"&gt;Elm Radio podcast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Browse the &lt;a href="https://elmcraft.org/" rel="noopener noreferrer"&gt;Elmcraft website&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;a href="https://incrementalelm.com/chat/" rel="noopener noreferrer"&gt;Incremental Elm Discord&lt;/a&gt; for working on Elm open source projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also check the previous &lt;a href="https://dev.to/lucamug/elm-2021-a-year-in-review-4pho"&gt;Elm 2021, a year in review&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here we go 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  January 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;3rd&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/elmls-2-4-0-and-vscode-client-2-4-0-are-out/8041" rel="noopener noreferrer"&gt;ElmLS 2.4.0 and VSCode Client 2.4.0 are out&lt;/a&gt; by &lt;strong&gt;Kolja Lampe&lt;/strong&gt; (A new releases of the language server and the VSCode client. New features include: fuzzy matching when using the workspace symbol search, ignoring suppressed elm-review errors, and lots more.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;3rd&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/whats-working-for-elm" rel="noopener noreferrer"&gt;Elm Radio episode #47 - What's Working for Elm&lt;/a&gt; "We look at what we can learn by understanding what's working well for Elm and the Elm ecosystem."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/whats-working-for-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #47 - What's Working for Elm" alt="Elm Radio episode #47 - What's Working for Elm" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;7th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/early-release-of-the-elm-pair-editor-tool/8052" rel="noopener noreferrer"&gt;Early release of the Elm-pair editor tool&lt;/a&gt; by &lt;strong&gt;Jasper Woudenberg&lt;/strong&gt; (Early release of elm-pair, an editor integration that got teased a couple years ago.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;8th&lt;/em&gt; - Project &lt;a href="https://twitter.com/robheghan/status/1479693960108863488" rel="noopener noreferrer"&gt;elm-css 17.0.2&lt;/a&gt; by &lt;strong&gt;Robin H. Hansen&lt;/strong&gt; (elm-css 17.0.2 is released with huge improvements in performance)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;8th&lt;/em&gt; - Post &lt;a href="https://dev.to/marciofrayze/simple-code-is-different-from-simplistic-code-elm-vs-javascript-1pp?utm_campaign=Elm%20Weekly&amp;amp;utm_medium=email&amp;amp;utm_source=Revue%20newsletter"&gt;Simple code is different from simplistic code: Elm vs JavaScript&lt;/a&gt; by &lt;strong&gt;Marcio Frayze&lt;/strong&gt; (A short journey into the nuance between "simple" vs "simplistic" code, using JavaScript and Elm as examples.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/marciofrayze/simple-code-is-different-from-simplistic-code-elm-vs-javascript-1pp?utm_campaign=Elm%20Weekly&amp;amp;utm_medium=email&amp;amp;utm_source=Revue%20newsletter"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-08-simple.webp" title="Simple code is different from simplistic code: Elm vs JavaScript" alt="Simple code is different from simplistic code: Elm vs JavaScript" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;10th&lt;/em&gt; - Announcement &lt;a href="https://rhg.dev/blog/aoc-2021/" rel="noopener noreferrer"&gt;Advent of Code 2021&lt;/a&gt; by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (A handful of videos teaching Elm through Advent of Code. With this blog post he recaps each of the 7 days he recorded.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://rhg.dev/blog/aoc-2021/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-10-advent.png" title="Advent of Code 2021" alt="Advent of Code 2021" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;11th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=flUASpYouEw" rel="noopener noreferrer"&gt;Introduction to Elm (with Lindsay Wardell) | Some Antics&lt;/a&gt; - A presentation by &lt;strong&gt;Ben Myers&lt;/strong&gt; (Elm is a delightful functional programming language with an emphasis on tooling. Join us as Lindsay Wardell shows us how we can get started with Elm today!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=flUASpYouEw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FflUASpYouEw%2Fmqdefault.jpg" title="Introduction to Elm (with Lindsay Wardell) | Some Antics" alt="Introduction to Elm (with Lindsay Wardell) | Some Antics" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;12th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=3n17wHe5wEw" rel="noopener noreferrer"&gt;Functional Programming for Pragmatists&lt;/a&gt; - A presentation by &lt;strong&gt;Richard Feldman&lt;/strong&gt; at GOTO Copenhagen 2021 (Do you care more about how well code works than how conceptually elegant it feels? Are you more interested in how effectively you can build and maintain software than how buzzword-compliant it is? Then this is the talk for you! People like functional programming for different reasons. Some like it for the conceptual elegance, or the mathematical properties. Richard? He likes to build things. He likes it when the software he builds works well and is easy to maintain. For the past decade he's been using functional programming both professionally and as a hobbyist, and has found it has helped him ship higher quality software in less time than in the decade he spent writing object-oriented code before.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3n17wHe5wEw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F3n17wHe5wEw%2Fmqdefault.jpg" title="Functional Programming for Pragmatists" alt="Functional Programming for Pragmatists" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;15th&lt;/em&gt; - Project &lt;a href="https://www.raycast.com/HenriqueBuss/elm-search" rel="noopener noreferrer"&gt;Elm Search&lt;/a&gt; by &lt;strong&gt;Henrique Buss&lt;/strong&gt; (For those using Mac's, now there is an Elm Search extension for Raycast. Helping you to more quickly find packages, functions, and more!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.raycast.com/HenriqueBuss/elm-search" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-15-raycast.png" title="Elm Search" alt="Elm Search" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;15th&lt;/em&gt; - Post &lt;a href="https://dev.to/jmpavlick/learning-elm-the-wrong-way-a-series-probably-2ohp"&gt;Learning Elm the Wrong Way: A Series (Probably)&lt;/a&gt; by &lt;strong&gt;John Pavlick&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;16th&lt;/em&gt; - Post &lt;a href="https://jxxcarlson.medium.com/lambda-calculus-an-elm-cli-fd537071db2b" rel="noopener noreferrer"&gt;Lambda Calculus: an Elm CLI&lt;/a&gt; by &lt;strong&gt;James Carlson&lt;/strong&gt; (How to build a calculator in Lambda Calculus.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jxxcarlson.medium.com/lambda-calculus-an-elm-cli-fd537071db2b" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-16-lambda.webp" title="Lambda Calculus: an Elm CLI" alt="Lambda Calculus: an Elm CLI" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;17th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/if-it-compiles-it-works" rel="noopener noreferrer"&gt;Elm Radio episode #48 - If It Compiles It Works&lt;/a&gt; "What do we really mean when we say "if it compiles it works?" And how do we make sure our apps stay that way?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/if-it-compiles-it-works" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #48 - If It Compiles It Works" alt="Elm Radio episode #48 - If It Compiles It Works" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;19th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=kZiDEgHgqgs" rel="noopener noreferrer"&gt;Elm Part 1 - Setup Elm and Write Your First Program&lt;/a&gt; - A presentation by &lt;strong&gt;Kindson The Tech Pro&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=kZiDEgHgqgs" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FkZiDEgHgqgs%2Fmqdefault.jpg" title="Elm Part 1 - Setup Elm and Write Your First Program" alt="Elm Part 1 - Setup Elm and Write Your First Program" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;19th&lt;/em&gt; - Post &lt;a href="https://twitter.com/balov_bohdan/status/1483673274185916417" rel="noopener noreferrer"&gt;Why I decided to learn Elm and drop React&lt;/a&gt; by &lt;strong&gt;Bohdan Balov&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;20th&lt;/em&gt; - Post &lt;a href="https://underjord.io/my-elm-experience.html" rel="noopener noreferrer"&gt;My Elm experience&lt;/a&gt; by &lt;strong&gt;Underjord&lt;/strong&gt; (Coming head first into Elm as, primarily, an Elixir developer.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;21st&lt;/em&gt; - Post &lt;a href="https://medium.com/@crawftv/rethinking-maybes-for-elm-beginners-eb9bc5c98631" rel="noopener noreferrer"&gt;Rethinking Maybes for Elm beginners&lt;/a&gt; by &lt;strong&gt;Crawford Collins&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://medium.com/@crawftv/rethinking-maybes-for-elm-beginners-eb9bc5c98631" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-21-maybe.jpeg" title="Rethinking Maybes for Elm beginners" alt="Rethinking Maybes for Elm beginners" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;23rd&lt;/em&gt; - Announcement &lt;a href="https://twitter.com/MacCSOutreach/status/1407421891623673858" rel="noopener noreferrer"&gt;McMaster Start Coding has taught over 22,222 kids!&lt;/a&gt; by &lt;strong&gt;McMaster Start Coding&lt;/strong&gt; (Attention #Elm coders! Thanks to your participation, McMaster Start Coding has taught over 22,222 kids! To celebrate we are hosting a contest, and winners get free entry into a summer camp! We will select 2 winners every week, for 5 weeks straight!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/MacCSOutreach/status/1407421891623673858" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fmcmaster.jpeg" title="McMaster Start Coding has taught over 22,222 kids!" alt="McMaster Start Coding has taught over 22,222 kids!" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;28th&lt;/em&gt; - Post &lt;a href="https://dev.to/jmpavlick/you-cant-do-nested-record-updates-in-elm-hjh"&gt;"You can't do nested record updates in Elm."&lt;/a&gt; by &lt;strong&gt;John Pavlick&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;January &lt;em&gt;29th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=78hsFWaOAJ4" rel="noopener noreferrer"&gt;Wordle in Elm in 1h13m17s (PB, timelapse)&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=78hsFWaOAJ4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F78hsFWaOAJ4%2Fmqdefault.jpg" title="Wordle in Elm in 1h13m17s (PB, timelapse)" alt="Wordle in Elm in 1h13m17s (PB, timelapse)" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;29th&lt;/em&gt; - Post &lt;a href="https://twitter.com/DuncanMalashock/status/1487129193326465028" rel="noopener noreferrer"&gt;Twitter thread about components&lt;/a&gt; by &lt;strong&gt;Duncan Malashock&lt;/strong&gt; (In @elmlang, your UI elements don't need to be "components" the way they might be in React. So what should they be? Here are a number of common patterns for different requirements.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/DuncanMalashock/status/1487129193326465028" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-29-twitter-duncan.png" title="Twitter thread about components" alt="Twitter thread about components" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;30th&lt;/em&gt; - Post &lt;a href="https://dev.to/lucamug/elm-vs-hyperscript-2m3m"&gt;Elm vs HyperScript - A Wordle implementation&lt;/a&gt; by &lt;strong&gt;Luca Mugnaini&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/lucamug/elm-vs-hyperscript-2m3m"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-01-30-wordle-luca-mugnaini.webp" title="Elm vs HyperScript - A Wordle implementation" alt="Elm vs HyperScript - A Wordle implementation" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;January &lt;em&gt;31st&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/optimizing-elm" rel="noopener noreferrer"&gt;Elm Radio episode #49 - Optimizing Performance with Robin Hansen&lt;/a&gt; "We talk about Robin's work optimizing Elm, and the opportunities that remain for Elm performance improvements."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/optimizing-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #49 - Optimizing Performance with Robin Hansen" alt="Elm Radio episode #49 - Optimizing Performance with Robin Hansen" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  February 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;3rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=E9Yf7l_Iff4" rel="noopener noreferrer"&gt;Implementing WORDLE in Elm in under 82 minutes!&lt;/a&gt; - A presentation by &lt;strong&gt;Flavio Corpa&lt;/strong&gt; (Code on Github: &lt;a href="https://github.com/kutyel/elm-wordle" rel="noopener noreferrer"&gt;https://github.com/kutyel/elm-wordle&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=E9Yf7l_Iff4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FE9Yf7l_Iff4%2Fmqdefault.jpg" title="Implementing WORDLE in Elm in under 82 minutes!" alt="Implementing WORDLE in Elm in under 82 minutes!" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;5th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=9yCw_ut9Ik8" rel="noopener noreferrer"&gt;Learning Elm while launching a project, good idea?&lt;/a&gt; - A presentation by &lt;strong&gt;Loïc Knuchel&lt;/strong&gt; at Elm Online Meetup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=9yCw_ut9Ik8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F9yCw_ut9Ik8%2Fmqdefault.jpg" title="Learning Elm while launching a project, good idea?" alt="Learning Elm while launching a project, good idea?" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;7th&lt;/em&gt; - Post &lt;a href="https://dev.to/lucamug/typescript-and-elm-3g38"&gt;Differences between TypeScript and Elm&lt;/a&gt; by &lt;strong&gt;Luca Mugnaini&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/lucamug/typescript-and-elm-3g38"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Ftypescript.webp" title="Differences between TypeScript and Elm" alt="Differences between TypeScript and Elm" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;8th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=MPyUvtPFDSg" rel="noopener noreferrer"&gt;The Ideal Programming Language&lt;/a&gt; - A presentation by &lt;strong&gt;Richard Feldman &amp;amp; Erik Doernenburg&lt;/strong&gt; at GOTO 2021&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=MPyUvtPFDSg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FMPyUvtPFDSg%2Fmqdefault.jpg" title="The Ideal Programming Language" alt="The Ideal Programming Language" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;10th&lt;/em&gt; - Game &lt;a href="https://jew.ski/three-tenths/" rel="noopener noreferrer"&gt;Three Tenths&lt;/a&gt; by &lt;strong&gt;Chris Andrejewski&lt;/strong&gt; (A game of precision where you must strike at exactly three tenths (3/10, 0.3, 3:7) along a given path.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;13th&lt;/em&gt; - Post &lt;a href="https://dev.to/jmpavlick/hungary-for-the-power-a-closer-look-at-hungarian-notation-282d"&gt;Hungary for the Power: A Closer Look at Hungarian Notation&lt;/a&gt; by &lt;strong&gt;John Pavlick&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;14th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/large-codebases" rel="noopener noreferrer"&gt;Elm Radio episode #50 - Large Elm Codebases with Ju Liu&lt;/a&gt; "Ju Liu joins us to share some tips and techniques from working with a large Elm codebase at NoRedInk."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/large-codebases" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #50 - Large Elm Codebases with Ju Liu" alt="Elm Radio episode #50 - Large Elm Codebases with Ju Liu" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;15th&lt;/em&gt; - Podcast &lt;a href="https://open.spotify.com/episode/160njJY0gC66lAqq4feBAm" rel="noopener noreferrer"&gt;Software Unscripted: Interactive Style Guides&lt;/a&gt; by &lt;strong&gt;Richard Feldman&lt;/strong&gt; (Richard Feldman discusses interactive style guides with Tessa Kelly &amp;amp; Ben Dansby)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://open.spotify.com/episode/160njJY0gC66lAqq4feBAm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Funscripted-tessa.png" title="Software Unscripted: Interactive Style Guides" alt="Software Unscripted: Interactive Style Guides" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;16th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/intellij-elm-plugin-future/8163/" rel="noopener noreferrer"&gt;IntelliJ Elm Plugin future&lt;/a&gt; by &lt;strong&gt;clojj&lt;/strong&gt; (Clojj announced the renovation of the IntellyJ Elm Plugin and already had some success with elm-review integration, Lamdera project support)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;17th&lt;/em&gt; - Post &lt;a href="https://www.lindsaykwardell.com/blog/utilizing-elm-in-a-web-worker/" rel="noopener noreferrer"&gt;Utilizing Elm in a Web Worker&lt;/a&gt; by &lt;strong&gt;Lindsay Wardell&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.lindsaykwardell.com/blog/utilizing-elm-in-a-web-worker/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fweb-workers.png" title="Utilizing Elm in a Web Worker" alt="Utilizing Elm in a Web Worker" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;17th&lt;/em&gt; - Post &lt;a href="https://rhg.dev/blog/exploring-graphql-input/" rel="noopener noreferrer"&gt;GraphQL and Elm&lt;/a&gt; by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Making inputs that don't bust your face.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://rhg.dev/blog/exploring-graphql-input/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-02-17-graphql.png" title="GraphQL and Elm" alt="GraphQL and Elm" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;21st&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=_lmpAsy1RQ4" rel="noopener noreferrer"&gt;Writing a MMORPG game in Elm on both client and server&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Janiczek&lt;/strong&gt; at NDC Oslo 2021 (For the better part of last year I've been writing a multiplayer browser game, with both frontend and backend written in the Elm language. I'll talk about my setup, the good, bad and ugly of this approach, anecdotes from development, what surprised me and what the future holds. Who said Elm's for frontend only‽)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_lmpAsy1RQ4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F_lmpAsy1RQ4%2Fmqdefault.jpg" title="Writing a MMORPG game in Elm on both client and server" alt="Writing a MMORPG game in Elm on both client and server" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;21st&lt;/em&gt; - Project &lt;a href="https://twitter.com/anthonny_q/status/1495771601463386113" rel="noopener noreferrer"&gt;Meteor with Elm starter kit&lt;/a&gt; by &lt;strong&gt;Anthonny Quérouil&lt;/strong&gt; (I have just updated my starter kit to work with @elmlang and &lt;a class="mentioned-user" href="https://dev.to/meteorjs"&gt;@meteorjs&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/anthonny_q/status/1495771601463386113" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fmeteor.jpeg" title="Meteor with Elm starter kit" alt="Meteor with Elm starter kit" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;21st&lt;/em&gt; - Game &lt;a href="https://twitter.com/FlavioCorpa/status/1495429932511600642" rel="noopener noreferrer"&gt;Katakana Wordle&lt;/a&gt; by &lt;strong&gt;Flavio Corpa&lt;/strong&gt; (Learn a new KATAKANA word EVERY day!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/FlavioCorpa/status/1495429932511600642" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fkatakana.jpeg" title="Katakana Wordle" alt="Katakana Wordle" width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;22nd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=I0zhcetpXzg" rel="noopener noreferrer"&gt;elm interreactor - Clickable compiler messages for the lazy&lt;/a&gt; - A presentation by &lt;strong&gt;Jan Wirth&lt;/strong&gt; at Elm Online Meetup (A clickable compiler messages for the lazy.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=I0zhcetpXzg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FI0zhcetpXzg%2Fmqdefault.jpg" title="elm interreactor - Clickable compiler messages for the lazy" alt="elm interreactor - Clickable compiler messages for the lazy" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;22nd&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/announcing-elmcraft-a-place-for-all-things-elm/8189" rel="noopener noreferrer"&gt;Announcing Elmcraft - a place for all things Elm&lt;/a&gt; by &lt;strong&gt;Mario Rogic&lt;/strong&gt; (Announcing Elmcraft, a place for curated list of books on Elm, podcasts or other learning materials.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;February &lt;em&gt;22nd&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/super-lightweight-svg-identicon-avatar-generator/8172" rel="noopener noreferrer"&gt;Minidenticons ported to Elm&lt;/a&gt; by &lt;strong&gt;Laurent Payot&lt;/strong&gt; (Minidenticons, a super-lightweight SVG identicon generator for client-side avatars)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://discourse.elm-lang.org/t/super-lightweight-svg-identicon-avatar-generator/8172" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fminidenticons.png" title="Minidenticons ported to Elm" alt="Minidenticons ported to Elm" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;26th&lt;/em&gt; - Post &lt;a href="https://blog.joelabshier.com/converting-react-app-to-elm-app/" rel="noopener noreferrer"&gt;React to Elm: Migrating React to Elm in Three Ways&lt;/a&gt; by &lt;strong&gt;Joel Abshier&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://blog.joelabshier.com/converting-react-app-to-elm-app/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Freact-to-elm.png" title="React to Elm: Migrating React to Elm in Three Ways" alt="React to Elm: Migrating React to Elm in Three Ways" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;28th&lt;/em&gt; - Post &lt;a href="https://jfmengels.net/modulo-cons/" rel="noopener noreferrer"&gt;Tail recursion, but modulo cons&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jfmengels.net/modulo-cons/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Ftail-recursion.png" title="Tail recursion, but modulo cons" alt="Tail recursion, but modulo cons" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;February &lt;em&gt;28th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/primitive-obsession" rel="noopener noreferrer"&gt;Elm Radio episode #51 - Primitive Obsession&lt;/a&gt; "We discuss the Primitive Obsession code smell, and how introducing types with semantic meaning can improve your Elm codebase."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/primitive-obsession" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #51 - Primitive Obsession" alt="Elm Radio episode #51 - Primitive Obsession" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  March 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;4th&lt;/em&gt; - Post &lt;a href="https://blog.joelabshier.com/getting-started-with-vite-for-react-and-elm/" rel="noopener noreferrer"&gt;Getting Started with Vite for React and Elm&lt;/a&gt; by &lt;strong&gt;Joel Abshier&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;7th&lt;/em&gt; - Project &lt;a href="https://twitter.com/luca_mug/status/1500596376631070722" rel="noopener noreferrer"&gt;elm-map&lt;/a&gt; by &lt;strong&gt;Luca Mugnaini&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/luca_mug/status/1500596376631070722" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-map.jpeg" title="elm-map" alt="elm-map" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;11th&lt;/em&gt; - Post &lt;a href="https://allanderek.prose.sh/poor-persons-functors" rel="noopener noreferrer"&gt;SimulatedHttp, functors and sed&lt;/a&gt; by &lt;strong&gt;Allanderek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;14th&lt;/em&gt; - Post &lt;a href="https://dev.to/jesterxl/using-the-builder-pattern-for-elm-components-35j4"&gt;Using the Builder Pattern for Elm Components&lt;/a&gt; by &lt;strong&gt;Jesse Warden&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;14th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/category-theory" rel="noopener noreferrer"&gt;Elm Radio episode #52 - Category Theory in Elm with Joël Quenneville&lt;/a&gt; "Joël Quenneville joins us to help us distill down Category Theory patterns and explore what value it brings us as Elm developers."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/category-theory" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #52 - Category Theory in Elm with Joël Quenneville" alt="Elm Radio episode #52 - Category Theory in Elm with Joël Quenneville" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;15th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/new-elm-review-package-releases/8258" rel="noopener noreferrer"&gt;New elm-review package releases&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;15th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/new-elm-pair-release-adds-support-for-visual-studio-code/8255" rel="noopener noreferrer"&gt;New Elm-pair release adds support for Visual Studio Code&lt;/a&gt; by &lt;strong&gt;Jasper Woudenberg&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;16th&lt;/em&gt; - Tutorial &lt;a href="https://twitter.com/csaltos/status/1503752841596485639" rel="noopener noreferrer"&gt;Elm - The Complete Guide (a web development video tutorial)&lt;/a&gt; by &lt;strong&gt;Carlos Saltos&lt;/strong&gt; (I've just created a new class for increasing more Elm adoption, please help to share it with your friends that want to learn new better ways to create nice web sites using Elm)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;17th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=o7M0JxgDfhE" rel="noopener noreferrer"&gt;Hobby scale: making web apps with minimal fuss&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Stewart&lt;/strong&gt; (Creating web apps requires setting up a lot of infrastructure. Configuring a database, managing hosting, writing deploy scripts, and handling communication between the client and server are only some of the many things that need to be done. Unfortunately for many projects, this level of control isn't needed and is instead a burden. It doesn't need to be this way though! In this presentation I'll give an overview of how you can use Elm programming language and the Lamdera framework to create web apps with little effort as well as show some of the apps I've created using it.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=o7M0JxgDfhE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2Fo7M0JxgDfhE%2Fmqdefault.jpg" title="Hobby scale: making web apps with minimal fuss" alt="Hobby scale: making web apps with minimal fuss" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;18th&lt;/em&gt; - Tutorial &lt;a href="https://twitter.com/comidoc/status/1504720663017316366" rel="noopener noreferrer"&gt;Elm - The Complete Guide (includes ports, design and more)&lt;/a&gt; by &lt;strong&gt;Comidoc&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;19th&lt;/em&gt; - Post &lt;a href="https://dev.to/csaltos/elm-at-talenteca-289a"&gt;Elm at Talenteca&lt;/a&gt; by &lt;strong&gt;Carlos Saltos&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/csaltos/elm-at-talenteca-289a"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-at-talenteca.webp" title="Elm at Talenteca" alt="Elm at Talenteca" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;21st&lt;/em&gt; - Post &lt;a href="https://dev.to/zenobio/trying-your-luck-with-elm-26bc"&gt;Trying your luck with Elm&lt;/a&gt; by &lt;strong&gt;Zenobio&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/zenobio/trying-your-luck-with-elm-26bc"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fluck-elm.webp" title="Trying your luck with Elm" alt="Trying your luck with Elm" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;22nd&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/elm-designer-0-4-is-out/8208/1" rel="noopener noreferrer"&gt;Elm Designer 0.4 is out&lt;/a&gt; by &lt;strong&gt;Andrea Peltrin&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;23rd&lt;/em&gt; - Post &lt;a href="https://medium.com/wat-the-elm-ist/my-little-functor-f12b7b3e8b42" rel="noopener noreferrer"&gt;My Little Functor&lt;/a&gt; by &lt;strong&gt;Michel Belleville&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://medium.com/wat-the-elm-ist/my-little-functor-f12b7b3e8b42" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fmy-little-functor.webp" title="My Little Functor" alt="My Little Functor" width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;26th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=0-dfwsn5MQI" rel="noopener noreferrer"&gt;Familiarity or Guarantees? Functional Programming for the front-end&lt;/a&gt; - A presentation by &lt;strong&gt;Luca Mugnaini&lt;/strong&gt; at Functional Conf 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=0-dfwsn5MQI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F0-dfwsn5MQI%2Fmqdefault.jpg" title="Familiarity or Guarantees? Functional Programming for the front-end" alt="Familiarity or Guarantees? Functional Programming for the front-end" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;28th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/dead-code" rel="noopener noreferrer"&gt;Elm Radio episode #53 - Dead Code&lt;/a&gt; "We discuss how to remove dead code in Elm, or avoid it altogether in your workflow, and why it matters."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/dead-code" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #53 - Dead Code" alt="Elm Radio episode #53 - Dead Code" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;29th&lt;/em&gt; - Post &lt;a href="https://dev.to/csaltos/install-elm-for-openbsd-x8664-4fpe"&gt;Install Elm for OpenBSD x86_64&lt;/a&gt; by &lt;strong&gt;Carlos Saltos&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;30th&lt;/em&gt; - Post &lt;a href="https://dev.to/csaltos/elm-for-linux-arm64-32bc"&gt;Install Elm for Linux arm64&lt;/a&gt; by &lt;strong&gt;Carlos Saltos&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;March &lt;em&gt;31st&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=A7EKkuWm2Hs" rel="noopener noreferrer"&gt;Code Azimutt feature with Elm: collapse columns&lt;/a&gt; - A presentation by &lt;strong&gt;Loïc Knuchel&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=A7EKkuWm2Hs" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FA7EKkuWm2Hs%2Fmqdefault.jpg" title="Code Azimutt feature with Elm: collapse columns" alt="Code Azimutt feature with Elm: collapse columns" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;March &lt;em&gt;31st&lt;/em&gt; - Project &lt;a href="https://twitter.com/passiomatic/status/1509424022517432325" rel="noopener noreferrer"&gt;Platformer physics system&lt;/a&gt; by &lt;strong&gt;Andrea Peltrin&lt;/strong&gt; (I’ve done a proof-of-concept platformer physics system using pixel-perfect values in #Elm. This was hella fun!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/passiomatic/status/1509424022517432325" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fphysics.png" title="Platformer physics system" alt="Platformer physics system" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  April 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;2nd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=i_KNTzcKu0g" rel="noopener noreferrer"&gt;Friday Hacks #221: Why bet the company on Elm for both front and backend?&lt;/a&gt; - A presentation by &lt;strong&gt;Choon Keat&lt;/strong&gt; (Although Elm usually runs on the browser, this talk explains why it’s actually a great choice for building the backend too – and why it can be a perfect choice for a startup. We will walk through how it even works on the backend, and how wonderful life can be in such an environment!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=i_KNTzcKu0g" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2Fi_KNTzcKu0g%2Fmqdefault.jpg" title="Friday Hacks #221: Why bet the company on Elm for both front and backend?" alt="Friday Hacks #221: Why bet the company on Elm for both front and backend?" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;2nd&lt;/em&gt; - Post &lt;a href="https://huyphung.one/posts/2022-04-02-interacting-with-time-in-elm/" rel="noopener noreferrer"&gt;Reading Note: Interacting with time in elm&lt;/a&gt; by &lt;strong&gt;Huy Phung&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;5th&lt;/em&gt; - Post &lt;a href="https://lengrand.fr/using-elm-knowledge-to-dive-into-kotlin-js/" rel="noopener noreferrer"&gt;Easy dependency integration in Kotlin/JS using the "Elm ports" technique&lt;/a&gt; by &lt;strong&gt;Julien&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://lengrand.fr/using-elm-knowledge-to-dive-into-kotlin-js/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fkotlin-js.png" title="Easy dependency integration in Kotlin/JS using the " alt="Easy dependency integration in Kotlin/JS using the " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;7th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=XfsTTzlLAY8" rel="noopener noreferrer"&gt;Code Azimutt feature with Elm: table &amp;amp; column notes&lt;/a&gt; - A presentation by &lt;strong&gt;Loïc Knuchel&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XfsTTzlLAY8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FXfsTTzlLAY8%2Fmqdefault.jpg" title="Code Azimutt feature with Elm: table &amp;amp; column notes" alt="Code Azimutt feature with Elm: table &amp;amp; column notes" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;9th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=r_MobWdHcNo" rel="noopener noreferrer"&gt;Extending Railway Oriented Programming in Elm to Make Complex User Flows Simple - Grahame #FnConf 22&lt;/a&gt; - A presentation by &lt;strong&gt;Grahame Dixon&lt;/strong&gt; at Functional Conf 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=r_MobWdHcNo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2Fr_MobWdHcNo%2Fmqdefault.jpg" title="Extending Railway Oriented Programming in Elm to Make Complex User Flows Simple - Grahame #FnConf 22" alt="Extending Railway Oriented Programming in Elm to Make Complex User Flows Simple - Grahame #FnConf 22" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;9th&lt;/em&gt; - Post &lt;a href="https://huyphung.one/posts/2022-04-09-randomness-in-elm/" rel="noopener noreferrer"&gt;Reading Note: Randomness in Elm&lt;/a&gt; by &lt;strong&gt;Huy Phung&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;10th&lt;/em&gt; - Project &lt;a href="https://github.com/ChristophP/parcel-transformer-elm-svg-modules" rel="noopener noreferrer"&gt;Have parcel turn svg into elm modules for you&lt;/a&gt; by &lt;strong&gt;Christoph&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;11th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/dev-productivity" rel="noopener noreferrer"&gt;Elm Radio episode #54 - Developer Productivity&lt;/a&gt; "We share our productivity and workflow tips, and how it changes the way we write Elm code."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/dev-productivity" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #54 - Developer Productivity" alt="Elm Radio episode #54 - Developer Productivity" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;14th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=1S5CF_L-RLg" rel="noopener noreferrer"&gt;Introduction to Elm-Lang&lt;/a&gt; - A presentation by &lt;strong&gt;Shalk Venter and Gary&lt;/strong&gt; (A presentation organized by Front-end Development South Africa)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1S5CF_L-RLg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F1S5CF_L-RLg%2Fmqdefault.jpg" title="Introduction to Elm-Lang" alt="Introduction to Elm-Lang" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;14th&lt;/em&gt; - Project &lt;a href="https://github.com/gacallea/elm-query" rel="noopener noreferrer"&gt;Elm Query&lt;/a&gt; by &lt;strong&gt;Andrea Callea&lt;/strong&gt; (A handy little package for searching Elm packages from within Sublime Text.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;14th&lt;/em&gt; - Post &lt;a href="https://huyphung.one/posts/2022-04-14-my-setup-for-elm-application/" rel="noopener noreferrer"&gt;My setup for an Elm application from development to production&lt;/a&gt; by &lt;strong&gt;Huy Phung&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;15th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=oEdZbjBaRGw" rel="noopener noreferrer"&gt;Property based testing: primer and examples&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oEdZbjBaRGw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FoEdZbjBaRGw%2Fmqdefault.jpg" title="Property based testing: primer and examples" alt="Property based testing: primer and examples" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;15th&lt;/em&gt; - Podcast &lt;a href="https://podcasts.apple.com/ee/podcast/whats-new-with-elm-ft-lindsay-wardell-jsj-527/id1237401284?i=1000557418716" rel="noopener noreferrer"&gt;What's New with Elm? ft. Lindsay Wardell - JSJ 527 - JavaScript Jabber&lt;/a&gt; by &lt;strong&gt;Lindsay Wardell&lt;/strong&gt; (Lindsay Wardell from NoRedInk joins the JavaScript Jabber panel this week to discuss her background with Vue and Elm.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;16th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/updates-on-elm-test-rs-elm-test-exercism/8327" rel="noopener noreferrer"&gt;Updates on elm-test-rs, elm-test, exercism&lt;/a&gt; by &lt;strong&gt;Matthieu Pizenberg&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;19th&lt;/em&gt; - Post &lt;a href="https://dev.to/jmpavlick/regular-expressions-are-quite-confusing-and-difficult-to-use-50l7"&gt;LETWW, Part 2: "Regular expressions are quite confusing and difficult to use."&lt;/a&gt; by &lt;strong&gt;John Pavlick&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;20th&lt;/em&gt; - Podcast &lt;a href="https://open.spotify.com/episode/6pgmLmLbfqtPKeVVo0IEE4" rel="noopener noreferrer"&gt;Software Unscripted: Static Analysis with Jeroen Engels&lt;/a&gt; by &lt;strong&gt;Richard Feldman&lt;/strong&gt; (Jeroen Engels, creator of elm-review and co-host of the Elm Radio podcast, talks about static analysis tools with Richard Feldman.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://open.spotify.com/episode/6pgmLmLbfqtPKeVVo0IEE4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Funscripted-jeroen.png" title="Software Unscripted: Static Analysis with Jeroen Engels" alt="Software Unscripted: Static Analysis with Jeroen Engels" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://medium.com/crewnew-com/elm-bug-free-web-app-development-5f14c099a9e7" rel="noopener noreferrer"&gt;Elm Bug-Free Web App Development&lt;/a&gt; by &lt;strong&gt;Kaspar L. Palgi&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://medium.com/@alvaro3chess/why-should-you-try-elm-20f33607976f" rel="noopener noreferrer"&gt;Why should you try Elm?&lt;/a&gt; by &lt;strong&gt;Álvaro Sánchez&lt;/strong&gt; (Álvaro Sánchez shares their thoughts on why Elm is worth learning.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;23rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=jiJby5gIcH4" rel="noopener noreferrer"&gt;Web Programming In Elm - Getting Started&lt;/a&gt; - A presentation by &lt;strong&gt;Aaron Zimmerman&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=jiJby5gIcH4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FjiJby5gIcH4%2Fmqdefault.jpg" title="Web Programming In Elm - Getting Started" alt="Web Programming In Elm - Getting Started" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;April &lt;em&gt;25th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/use-the-platform" rel="noopener noreferrer"&gt;Elm Radio episode #55 - Use the Platform&lt;/a&gt; "We discuss what it means to use the web platform, and how that helps improve the user and developer experience in Elm apps."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/use-the-platform" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #55 - Use the Platform" alt="Elm Radio episode #55 - Use the Platform" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;26th&lt;/em&gt; - Post &lt;a href="https://jfmengels.net/starter-configurations/" rel="noopener noreferrer"&gt;Starter configurations for elm-review&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt; (Jeroen talks about adding starter template configurations to elm-review.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;April &lt;em&gt;29th&lt;/em&gt; - Post &lt;a href="https://betterprogramming.pub/why-are-phantom-types-useful-cfeceb8a9e81" rel="noopener noreferrer"&gt;Why Are Phantom Types Useful?&lt;/a&gt; by &lt;strong&gt;Stefan Wullems&lt;/strong&gt; (In this post, Stefan Wullems goes over both what phantom types are, as well as why they might be useful.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  May 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;1th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=aIPjp1QG4a4" rel="noopener noreferrer"&gt;Offline Elm CSV to JSON GUI application in one video (elm-ui)&lt;/a&gt; - A presentation by &lt;strong&gt;Atle Wee Førre&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=aIPjp1QG4a4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FaIPjp1QG4a4%2Fmqdefault.jpg" title="Offline Elm CSV to JSON GUI application in one video (elm-ui)" alt="Offline Elm CSV to JSON GUI application in one video (elm-ui)" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;1th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/custom-views-in-confidenceman02-elm-select/8359" rel="noopener noreferrer"&gt;Custom views in Confidenceman02/elm-select&lt;/a&gt; by &lt;strong&gt;Jaime Terreu&lt;/strong&gt; (A new release of Confidenceman02/elm-select that adds richer display of options.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;4th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=XakEn9ylVEI" rel="noopener noreferrer"&gt;Applications as Libraries: Building elm-book and elm-admin&lt;/a&gt; - A presentation by &lt;strong&gt;Georges Boris&lt;/strong&gt; at Elm Online Meetup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XakEn9ylVEI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FXakEn9ylVEI%2Fmqdefault.jpg" title="Applications as Libraries: Building elm-book and elm-admin" alt="Applications as Libraries: Building elm-book and elm-admin" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;4th&lt;/em&gt; - Survey &lt;a href="https://state-of-elm.lamdera.app/" rel="noopener noreferrer"&gt;State of Elm 2022&lt;/a&gt; by &lt;strong&gt;Martin Stewart&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;8th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/elm-url-codec-define-both-url-parser-and-builder-at-once/8380" rel="noopener noreferrer"&gt;Elm-url-codec: Define both URL parser and builder at once&lt;/a&gt; by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;9th&lt;/em&gt; - Post &lt;a href="https://justaddflow.substack.com/p/using-elm-pipelines-with-andthen" rel="noopener noreferrer"&gt;Using Elm pipelines with andThen to decode a multi-object type&lt;/a&gt; by &lt;strong&gt;Harold Campbell&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;9th&lt;/em&gt; - Post &lt;a href="https://www.lindsaykwardell.com/blog/native-dialog-in-elm/" rel="noopener noreferrer"&gt;Utilizing Native Dialog in Elm&lt;/a&gt; by *&lt;em&gt;Lindsay Wardell *&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.lindsaykwardell.com/blog/native-dialog-in-elm/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Futilizing-dialog-in-elm.webp" title="Utilizing Native Dialog in Elm" alt="Utilizing Native Dialog in Elm" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;9th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-book" rel="noopener noreferrer"&gt;Elm Radio episode #56 - elm-book with Georges Boris&lt;/a&gt; "Georges Boris joins us to discuss elm-book and how it helps iterate on a design language of Elm widgets."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-book" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #56 - elm-book with Georges Boris" alt="Elm Radio episode #56 - elm-book with Georges Boris" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;11th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=uCA5VL8SeDY" rel="noopener noreferrer"&gt;A janitor for Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Rupert Smith&lt;/strong&gt; at Elm Online Meetup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=uCA5VL8SeDY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FuCA5VL8SeDY%2Fmqdefault.jpg" title="A janitor for Elm" alt="A janitor for Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;11th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=AswmCDETyAo" rel="noopener noreferrer"&gt;Game programming and creative coding with Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Erkal Selman&lt;/strong&gt; at Elm Online Meetup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AswmCDETyAo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FAswmCDETyAo%2Fmqdefault.jpg" title="Game programming and creative coding with Elm" alt="Game programming and creative coding with Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;11th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=Oa14Yw1qtOs" rel="noopener noreferrer"&gt;Elm Programming Quick Start - For Beginners (Functional Programming)&lt;/a&gt; - A presentation by &lt;strong&gt;Kindson The Tech Pro&lt;/strong&gt; (This tutorial is a quick start of  the Elm Programming Language for beginners and other who would like to delve into the world of Functional programming)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Oa14Yw1qtOs" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FOa14Yw1qtOs%2Fmqdefault.jpg" title="Elm Programming Quick Start - For Beginners (Functional Programming)" alt="Elm Programming Quick Start - For Beginners (Functional Programming)" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;11th&lt;/em&gt; - Post &lt;a href="https://kkalamarski.me/introduction-to-elm-programming-language-for-react-developers" rel="noopener noreferrer"&gt;Introduction to Elm programming language for React developers&lt;/a&gt; by &lt;strong&gt;Krzysztof Kałamarski&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://kkalamarski.me/introduction-to-elm-programming-language-for-react-developers" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F1IZ9JeZYK.webp" title="Introduction to Elm programming language for React developers" alt="Introduction to Elm programming language for React developers" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;14th&lt;/em&gt; - Project &lt;a href="https://twitter.com/danbruder/status/1525466013956972546" rel="noopener noreferrer"&gt;Elm + Heroicons = Love&lt;/a&gt; by &lt;strong&gt;Dan Bruder&lt;/strong&gt; (elm/svg icons for your Elm project)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/danbruder/status/1525466013956972546" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fheroicons.png" title="Elm + Heroicons = Love" alt="Elm + Heroicons = Love" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;15th&lt;/em&gt; - Podcast &lt;a href="https://open.spotify.com/episode/3ogdBIo8E1Ezk0eEiQEZVw" rel="noopener noreferrer"&gt;Software Unscripted: Software Design with Dillon Kearns&lt;/a&gt; by &lt;strong&gt;Richard Feldman&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://open.spotify.com/episode/3ogdBIo8E1Ezk0eEiQEZVw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Funscripted-dillon.png" title="Software Unscripted: Software Design with Dillon Kearns" alt="Software Unscripted: Software Design with Dillon Kearns" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;15th&lt;/em&gt; - Announcement &lt;a href="https://guix.gnu.org/manual/devel/en/html_node/Build-Systems.html#index-elm_002dbuild_002dsystem" rel="noopener noreferrer"&gt;Guix (GNU Build System) has added support for Elm packages.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;17th&lt;/em&gt; - Post &lt;a href="https://twitter.com/DuncanMalashock/status/1526569183940681737" rel="noopener noreferrer"&gt;Elm's rate of adoption is still quite low. Why is this?&lt;/a&gt; by &lt;strong&gt;Duncan Malashock&lt;/strong&gt; (@elmlang changed front-end development with its intentional design and radical simplicity. A few years later, @evancz encouraged the Elm community: "Let's be mainstream!", with a plan to do so. After 10 years, Elm's rate of adoption is still quite low. Why is this?)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;18th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=Vexdf-Rd-AE" rel="noopener noreferrer"&gt;Celebrating 10 years of Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Evan Czaplicki&lt;/strong&gt; at Elm Online Meetup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Vexdf-Rd-AE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FVexdf-Rd-AE%2Fmqdefault.jpg" title="Celebrating 10 years of Elm" alt="Celebrating 10 years of Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;18th&lt;/em&gt; - Post &lt;a href="https://justaddflow.substack.com/p/writing-better-elm-code-with-simple" rel="noopener noreferrer"&gt;Writing better Elm code with simple List transformations&lt;/a&gt; by &lt;strong&gt;Harold Campbell&lt;/strong&gt; (A practical walkthrough of using List.map in Elm)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;19th&lt;/em&gt; - Announcement &lt;a href="https://twitter.com/evancz/status/1527297077251739648" rel="noopener noreferrer"&gt;Celebrating 10 years of Elm&lt;/a&gt; by &lt;strong&gt;Evan Czaplicki&lt;/strong&gt; (Been working on @elmlang for over a decade now, so I put together some fun stories to celebrate. Met so many lovely people through this project, and it was a heartwarming surprise to see so many of you in the chat 🥰)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;21st&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/song-designer-made-with-elm-3-open-for-hacks/8406" rel="noopener noreferrer"&gt;Song Designer made with Elm &amp;lt;3 Open for Hacks&lt;/a&gt; by &lt;strong&gt;Cortland Mahoney&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;22nd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=BCmNX2Tx5xY" rel="noopener noreferrer"&gt;The store pattern in Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=BCmNX2Tx5xY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FBCmNX2Tx5xY%2Fmqdefault.jpg" title="The store pattern in Elm" alt="The store pattern in Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;22nd&lt;/em&gt; - Announcement &lt;a href="https://github.com/awesomo4000/elm-toastui-markdown" rel="noopener noreferrer"&gt;elm-toastui-markdown&lt;/a&gt; by &lt;strong&gt;awesomo4000&lt;/strong&gt; (Elm library to use toast-ui wysiwyg markdown editor via web component.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;23rd&lt;/em&gt; - Post &lt;a href="https://jfmengels.net/virtual-dom-security-patch/" rel="noopener noreferrer"&gt;Fixing vulnerabilities in Elm's virtual DOM&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;May &lt;em&gt;23rd&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/state-of-elm-2022" rel="noopener noreferrer"&gt;Elm Radio episode #57 - State of Elm 2022&lt;/a&gt; "Martin Stewart joins us to share the results from the State of Elm 2022 and look at some of the trends."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/state-of-elm-2022" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #57 - State of Elm 2022" alt="Elm Radio episode #57 - State of Elm 2022" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;May &lt;em&gt;30th&lt;/em&gt; - Project &lt;a href="https://twitter.com/robheghan/status/1531223575432142849" rel="noopener noreferrer"&gt;Gren 0.1.0&lt;/a&gt; by &lt;strong&gt;Robin H. Hansen&lt;/strong&gt; (Today I'm announcing the first release of Gren. An Elm-like language that intends to support both frontend and backend development.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  June 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;1th&lt;/em&gt; - Announcement &lt;a href="https://github.com/simpleiot/simpleiot/releases/tag/v0.2.0" rel="noopener noreferrer"&gt;Release of Simple Iot v0.2.0&lt;/a&gt; by &lt;strong&gt;Cliff Brake&lt;/strong&gt; (Simple Iot is a platform that enables you to add remote sensor data, telemetry, configuration, and device management to your project or product.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/simpleiot/simpleiot/releases/tag/v0.2.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fsimple-iot-logo.png" title="Release of Simple Iot v0.2.0" alt="Release of Simple Iot v0.2.0" width="416" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;6th&lt;/em&gt; - Announcement &lt;a href="https://discourse.elm-lang.org/t/a-monkey-interpreter/8434" rel="noopener noreferrer"&gt;A Monkey Interpreter&lt;/a&gt; by &lt;strong&gt;Dwayne Crooks&lt;/strong&gt; (An Elm interpreter for Monkey, a programming language designed by Thorsten Ball.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;6th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/store-pattern" rel="noopener noreferrer"&gt;Elm Radio episode #58 - Elm Store Pattern&lt;/a&gt; "Martin Janiczek joins us to discuss a pattern for declaratively managing loading state for API data across page changes."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/store-pattern" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #58 - Elm Store Pattern" alt="Elm Radio episode #58 - Elm Store Pattern" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;11th&lt;/em&gt; - Project &lt;a href="https://twitter.com/janiczek/status/1535656771188137984" rel="noopener noreferrer"&gt;Building a CHIP-8 emulator in Elm&lt;/a&gt; by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;12th&lt;/em&gt; - Project &lt;a href="https://github.com/temochka/enclojure" rel="noopener noreferrer"&gt;Enclojure&lt;/a&gt; by &lt;strong&gt;Artem Chistyakov&lt;/strong&gt; (Enclojure is a Clojure-like scripting language for Elm apps.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;15th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=WAS-qRdsvik" rel="noopener noreferrer"&gt;Hobby scale: making web apps with minimal fuss&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Stewart&lt;/strong&gt; at GOTO Aarhus 2022&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=WAS-qRdsvik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FWAS-qRdsvik%2Fmqdefault.jpg" title="Hobby scale: making web apps with minimal fuss" alt="Hobby scale: making web apps with minimal fuss" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;15th&lt;/em&gt; - Podcast &lt;a href="https://open.spotify.com/episode/64kMufOBufDspsLgJfskbD" rel="noopener noreferrer"&gt;Functional and Object-Oriented Programming with Lindsay Wardell&lt;/a&gt; by &lt;strong&gt;Richard Feldman&lt;/strong&gt; (Richard and Lindsay talk about their experiences with FP and OOP, and some less obvious differences they've noticed between the two paradigms.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://open.spotify.com/episode/64kMufOBufDspsLgJfskbD" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Funscripted-lindsay.png" title="Functional and Object-Oriented Programming with Lindsay Wardell" alt="Functional and Object-Oriented Programming with Lindsay Wardell" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;20th&lt;/em&gt; - Project &lt;a href="https://twitter.com/thecallea/status/1538614858270363648" rel="noopener noreferrer"&gt;Speak &amp;amp; Spell reproduction in Elm&lt;/a&gt; by &lt;strong&gt;Andrea Callea&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/thecallea/status/1538614858270363648" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fspeak-spell.jpeg" title="Speak &amp;amp; Spell reproduction in Elm" alt="Speak &amp;amp; Spell reproduction in Elm" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;20th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/wrap-early-unwrap-late" rel="noopener noreferrer"&gt;Elm Radio episode #59 - Wrap Early, Unwrap Late&lt;/a&gt; "We dive into preventing bugs and making your code more maintainable by wrapping early and unwrapping late."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/wrap-early-unwrap-late" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #59 - Wrap Early, Unwrap Late" alt="Elm Radio episode #59 - Wrap Early, Unwrap Late" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;22nd&lt;/em&gt; - Game &lt;a href="https://lowderdev.github.io" rel="noopener noreferrer"&gt;Graph Bang&lt;/a&gt; by &lt;strong&gt;Logan Lowder&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://lowderdev.github.io" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fgraph-bang.png" title="Graph Bang" alt="Graph Bang" width="800" height="809"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://www.crowdstrike.com/blog/tech-center/understanding-ui-components-in-elm/" rel="noopener noreferrer"&gt;Understanding UI Components in Elm&lt;/a&gt; by &lt;strong&gt;Kasper Andersen&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.crowdstrike.com/blog/tech-center/understanding-ui-components-in-elm/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fweb-components.png" title="Understanding UI Components in Elm" alt="Understanding UI Components in Elm" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;24th&lt;/em&gt; - Post &lt;a href="https://9birthdays.com/trying-elm.html" rel="noopener noreferrer"&gt;My first Functional Programming app&lt;/a&gt; by &lt;strong&gt;Carl Hunter-Roach&lt;/strong&gt; (Notes from the perspective of an experienced programmer, new to functional programming.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://9birthdays.com/trying-elm.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F9birthdays.png" title="My first Functional Programming app" alt="My first Functional Programming app" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;25th&lt;/em&gt; - Announcement &lt;a href="https://twitter.com/alexkorban/status/1540478410312495104" rel="noopener noreferrer"&gt;A milestone for Elm Catalog&lt;/a&gt; by &lt;strong&gt;Alex Korban&lt;/strong&gt; (Elm Catalog crossed the threshold of 1300 packages (not counting pre-release, internal etc)! Elm Catalog now lists 1307 Elm 0.19.x packages &amp;amp; 110 Elm tools across all categories.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;June &lt;em&gt;26th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=XGvj8aF3FAI" rel="noopener noreferrer"&gt;Effect Systems for Mortals&lt;/a&gt; - A presentation by &lt;strong&gt;Eduardo Morango&lt;/strong&gt; at Elm Meetup Brazil&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XGvj8aF3FAI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FXGvj8aF3FAI%2Fmqdefault.jpg" title="Effect Systems for Mortals" alt="Effect Systems for Mortals" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;26th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=8zM0pF-Qjcg" rel="noopener noreferrer"&gt;Declarative Server State&lt;/a&gt; - A presentation by &lt;strong&gt;Dillon Kearns&lt;/strong&gt; at Elm Meetup Brazil (Elm Meetup Brazil welcomed Dillon Kearns as he demoed some of the upcoming features on elm-pages v3.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=8zM0pF-Qjcg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F8zM0pF-Qjcg%2Fmqdefault.jpg" title="Declarative Server State" alt="Declarative Server State" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;June &lt;em&gt;30th&lt;/em&gt; - Project &lt;a href="https://www.danneu.com/elm-chip8/" rel="noopener noreferrer"&gt;A Chip-8 emulator&lt;/a&gt; by &lt;strong&gt;Danneu&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.danneu.com/elm-chip8/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fchip8.png" title="A Chip-8 emulator" alt="A Chip-8 emulator" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  July 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;July &lt;em&gt;1th&lt;/em&gt; - Project &lt;a href="https://www.reddit.com/r/elm/comments/vp2fs1/published_an_npm_package_to_prevent_browser/" rel="noopener noreferrer"&gt;Elm Root Defender&lt;/a&gt; by &lt;strong&gt;beefzilla&lt;/strong&gt; (An NPM package to prevent browser extensions from crashing Elm apps)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;July &lt;em&gt;2nd&lt;/em&gt; - Post &lt;a href="https://elmcraft.org/compare/javascript/eslint/" rel="noopener noreferrer"&gt;ESLint equivalents in Elm&lt;/a&gt; by &lt;strong&gt;Mario Rogic and Jeroen Engels&lt;/strong&gt; (Comparing ESLint functionality and the equivalents in the Elm ecosystem)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;July &lt;em&gt;4th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=1_Eg8KYq2iQ" rel="noopener noreferrer"&gt;The Essence of Functional Programming&lt;/a&gt; - A presentation by &lt;strong&gt;Richard Feldman&lt;/strong&gt; at Functional Conf 2022&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1_Eg8KYq2iQ" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F1_Eg8KYq2iQ%2Fmqdefault.jpg" title="The Essence of Functional Programming" alt="The Essence of Functional Programming" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;4th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/trustworthy-tools" rel="noopener noreferrer"&gt;Elm Radio episode #60 - Building Trustworthy Tools&lt;/a&gt; "We discuss how to earn users' trust by giving meaningful feedback and giving predictable results."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/trustworthy-tools" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #60 - Building Trustworthy Tools" alt="Elm Radio episode #60 - Building Trustworthy Tools" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;18th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/exploring-form-api" rel="noopener noreferrer"&gt;Elm Radio episode #61 - Exploring a New Form API Design&lt;/a&gt; "We dive into some ideas for a new Form design, pulling in a lot of our favorite Elm techniques to make it safe and intuitive."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/exploring-form-api" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #61 - Exploring a New Form API Design" alt="Elm Radio episode #61 - Exploring a New Form API Design" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;20th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=crUrv2-Uq8s" rel="noopener noreferrer"&gt;Build Elm Apps (with Lindsay Wardell) | Some Antics&lt;/a&gt; - A presentation by &lt;strong&gt;Ben Myers&lt;/strong&gt; (Previously on Some Antics, we dove into the syntax for Elm, a functional programming language that compiles down to JavaScript, with friend of the show Lindsay Wardell — but we weren't able to get to application development in time. Join us as Lindsay returns to the stream for a sequel on building Elm apps!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=crUrv2-Uq8s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FcrUrv2-Uq8s%2Fmqdefault.jpg" title="Build Elm Apps (with Lindsay Wardell) | Some Antics" alt="Build Elm Apps (with Lindsay Wardell) | Some Antics" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;July &lt;em&gt;26th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/travelm-agency-3-0-0/8531" rel="noopener noreferrer"&gt;Travelm-Agency 3.0.0&lt;/a&gt; by &lt;strong&gt;Andreas Molitor&lt;/strong&gt; (A new major version of Travelm-Agency 52, an internationalization code generator for Elm.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;July &lt;em&gt;26th&lt;/em&gt; - Game &lt;a href="https://type-signature.com/" rel="noopener noreferrer"&gt;Type Signature&lt;/a&gt; by &lt;strong&gt;Andy&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://type-signature.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fsignature.png" title="Type Signature" alt="Type Signature" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;27th&lt;/em&gt; - Project &lt;a href="https://www.reddit.com/r/Pathfinder2e/comments/w97ryi/archives_of_nethys_pf2e_dark_archive_pathfinder/" rel="noopener noreferrer"&gt;Nethys Search, a search engine for Archives of Nethys&lt;/a&gt; by &lt;strong&gt;Andreas Lundkvist&lt;/strong&gt; (A search app for the tabletop RPG Pathfinder 2nd Edition called Nethys Search. Repo available at &lt;a href="https://github.com/galdiuz/nethys-search" rel="noopener noreferrer"&gt;https://github.com/galdiuz/nethys-search&lt;/a&gt;. App available at: &lt;a href="https://2e.aonprd.com/Search.aspx" rel="noopener noreferrer"&gt;https://2e.aonprd.com/Search.aspx&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/Pathfinder2e/comments/w97ryi/archives_of_nethys_pf2e_dark_archive_pathfinder/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2FNethys.png" title="Nethys Search, a search engine for Archives of Nethys" alt="Nethys Search, a search engine for Archives of Nethys" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;28th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=_rzoyBq4hJ0" rel="noopener noreferrer"&gt;Static analysis tools love pure FP&lt;/a&gt; - A presentation by &lt;strong&gt;Jeroen Engels&lt;/strong&gt; at Lambda Days 2022 (Functional programming languages have many benefits that are often explained from the developer's point of view, such as how easy it is to maintain a codebase. But we rarely look at it from the point of view of tools. Static analysis tools try to infer meaning and intent in order to find bugs and code smells, but they can be very hard to write depending on the features of the analyzed language. We will look at how explicitness, the lack of side-effects and dynamic constructs in pure FP languages empower tools to trivially achieve surprising results that would be nearly impossible with other paradigms.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_rzoyBq4hJ0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F_rzoyBq4hJ0%2Fmqdefault.jpg" title="Static analysis tools love pure FP" alt="Static analysis tools love pure FP" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;28th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=ERUu8mEPdUM" rel="noopener noreferrer"&gt;Towards Smart E-Learning Mentor Dispatch&lt;/a&gt; - A presentation by &lt;strong&gt;Christopher Schankula&lt;/strong&gt; at Lambda Days 2022 (The McMaster Start Coding program has taught over 26,000 K-12 students programming using Elm over the last five years. Collectively, they have compiled nearly 4 million programs in our online learning platform. The COVID-19 pandemic has necessitated the switch to a fully virtual setup, which continues as schools have strict visitor limits. Virtual learning also necessitates upgrades to the online code compilation and mentoring software we use. In particular, we need to determine when a student is stuck so as to be able to make better use of mentor resources and proactively help students who are struggling. This presentation details data mining efforts to predict metrics such as the length of time that a student is likely to struggle if they are receiving an error in their program, in order to dispatch mentors and help the students who need the most attention.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ERUu8mEPdUM" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FERUu8mEPdUM%2Fmqdefault.jpg" title="Towards Smart E-Learning Mentor Dispatch" alt="Towards Smart E-Learning Mentor Dispatch" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;28th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=AE_QzSIsmMI" rel="noopener noreferrer"&gt;Functional Parsing for Novel Markup Languages&lt;/a&gt; - A presentation by &lt;strong&gt;James Carlson&lt;/strong&gt; at Lambda Days 2022 (With functional languages like Elm that target the browser, one can parse and render both classical and novel markup languages  in real time, providing authors a pleasant, zero-config tool for writing and distributing mathematical text.   The talk will outline how one designs and builds a fault-tolerant parser that provides high-quality, real-time error messages in-place in the rendered text.  As case studies we consider two markup languages: MiniLaTeX, a subset of LaTeX, and L1, an experimental markup with a syntax inspired by Lisp.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AE_QzSIsmMI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FAE_QzSIsmMI%2Fmqdefault.jpg" title="Functional Parsing for Novel Markup Languages" alt="Functional Parsing for Novel Markup Languages" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;28th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=EDFCRPG9wio" rel="noopener noreferrer"&gt;An Enigma Machine in Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Ju Liu&lt;/strong&gt; at Lambda Days 2022 (The Enigma machine was an encryption device that was used by German forces during WW2 to send secret messages. In this talk, we will explain exactly how the encryption process works and go through an implementation of it in Elm. We will demonstrate how to encrypt and decrypt a message. Then we will go over the weaknesses that made it exploitable by Alan Turing and the other fine folks in Bletchley Park. By the end of the talk, you'll be able to point out all the inaccuracies in "The Imitation Game".)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=EDFCRPG9wio" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FEDFCRPG9wio%2Fmqdefault.jpg" title="An Enigma Machine in Elm" alt="An Enigma Machine in Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July &lt;em&gt;29th&lt;/em&gt; - Post &lt;a href="https://dev.to/viir/introducing-elm-editor-a-web-based-ide-for-elm-programs-3089"&gt;Introducing Elm Editor - a web-based IDE for Elm programs&lt;/a&gt; by &lt;strong&gt;Michael Rätzel&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  August 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;1th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-test-v2" rel="noopener noreferrer"&gt;Elm Radio episode #62 - elm-test v2 with Martin Janiczek&lt;/a&gt; "Martin Janiczek joins us to talk about fuzz testing, why it matters, and how the upcoming elm-test v2 changes the way you write fuzzers in Elm."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-test-v2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #62 - elm-test v2 with Martin Janiczek" alt="Elm Radio episode #62 - elm-test v2 with Martin Janiczek" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;3rd&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/airsequel-first-public-beta-release/8550" rel="noopener noreferrer"&gt;Airsequel&lt;/a&gt; by &lt;strong&gt;Adrian Sieber&lt;/strong&gt; (First public beta release)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;3rd&lt;/em&gt; - Post &lt;a href="https://dev.to/dialaeke/day-1-of-elm-2jjl"&gt;Day 1 of Elm&lt;/a&gt; by &lt;strong&gt;Eke Enyinnaya Diala&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;7th&lt;/em&gt; - Post &lt;a href="https://medium.com/@mshaheer2003/gsoc-2022-kodi-mid-term-evaluation-bb0167390d21" rel="noopener noreferrer"&gt;GSoC 2022 @ Kodi: Mid-Term Evaluation&lt;/a&gt; by &lt;strong&gt;Mohd. Shaheer&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;10th&lt;/em&gt; - Project &lt;a href="https://tradesimplr.gigalixirapp.com/chart.html" rel="noopener noreferrer"&gt;Chart&lt;/a&gt; by &lt;strong&gt;Trade Simplr&lt;/strong&gt; (Interactive Trading platform to trade and analyze in the financial markets, built with Elm.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://tradesimplr.gigalixirapp.com/chart.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fchart.png" title="Chart" alt="Chart" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;10th&lt;/em&gt; - Announcement &lt;a href="https://parceljs.org/languages/elm/" rel="noopener noreferrer"&gt;Elm in Parcel&lt;/a&gt; (Better support for Elm has been release in Parcel, including multiple entry points.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;12th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=BddioF5uYmM" rel="noopener noreferrer"&gt;Introduction to Elm Part 1&lt;/a&gt; - A presentation by &lt;strong&gt;Programming from A to Z&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=BddioF5uYmM" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FBddioF5uYmM%2Fmqdefault.jpg" title="Introduction to Elm Part 1" alt="Introduction to Elm Part 1" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;12th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=VAau85bjWws" rel="noopener noreferrer"&gt;Introduction to Elm - Building a Basic Web Application&lt;/a&gt; - A presentation by &lt;strong&gt;Programming from A to Z&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VAau85bjWws" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FVAau85bjWws%2Fmqdefault.jpg" title="Introduction to Elm - Building a Basic Web Application" alt="Introduction to Elm - Building a Basic Web Application" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;14th&lt;/em&gt; - Post &lt;a href="https://www.unanswered.blog/xcuseme" rel="noopener noreferrer"&gt;Notes on Building "XcuseMe: Exercise tracking for real people"&lt;/a&gt; by &lt;strong&gt;Willy Unterkoefler&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;15th&lt;/em&gt; - Game &lt;a href="https://focs.ji.sjtu.edu.cn/silverfocs/demo/2022/p2team01/" rel="noopener noreferrer"&gt;Reweave&lt;/a&gt; by &lt;strong&gt;King Linsyking&lt;/strong&gt; (A Chinese style platformer powered by Elm. Implemented with a self-made 2D game engine.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://focs.ji.sjtu.edu.cn/silverfocs/demo/2022/p2team01/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Freweave.png" title="Reweave" alt="Reweave" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;15th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/false-positives" rel="noopener noreferrer"&gt;Elm Radio episode #63 - The Root Cause of False Positives&lt;/a&gt; "We explore false positives and negatives in static analysis tools, and how Elm helps us avoid them."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/false-positives" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #63 - The Root Cause of False Positives" alt="Elm Radio episode #63 - The Root Cause of False Positives" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;16th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/announcing-elm-codegen/8576" rel="noopener noreferrer"&gt;Announcing Elm Codegen!&lt;/a&gt; by &lt;strong&gt;Matthew Griffith&lt;/strong&gt; (Matt Griffith is super excited to announce elm-codegen, an Elm package and CLI tool for generating Elm code!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;17th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/releasing-elmjs-inspect/8579" rel="noopener noreferrer"&gt;Releasing &lt;code&gt;elmjs-inspect&lt;/code&gt;&lt;/a&gt; by &lt;strong&gt;Philipp Krüger&lt;/strong&gt; (Why is your elm.js file so big? Is Elm’s dead code elimination on a particular function not working as you expected? What libraries cost your users bandwidth? Analyse your elm.js file size with this tool.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;18th&lt;/em&gt; - Post &lt;a href="https://foldp.com/blog/elm-url.html" rel="noopener noreferrer"&gt;Understanding the design of elm/url&lt;/a&gt; by &lt;strong&gt;John Kelly&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;20th&lt;/em&gt; - Post &lt;a href="https://dev.to/olus2000/designing-an-elm-component-1meb"&gt;Designing an Elm component&lt;/a&gt; by &lt;strong&gt;Alex Esoposting&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;August &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://medium.com/programming-essentials/showing-a-playing-card-from-a-single-suite-with-elm-9cff587fc85a" rel="noopener noreferrer"&gt;Showing a Playing Card From a Single Suite With Elm&lt;/a&gt; by &lt;strong&gt;Cristian Salcescu&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://medium.com/programming-essentials/showing-a-playing-card-from-a-single-suite-with-elm-9cff587fc85a" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fcards.webp" title="Showing a Playing Card From a Single Suite With Elm" alt="Showing a Playing Card From a Single Suite With Elm" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;23rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=hRPuS_ZdW_o" rel="noopener noreferrer"&gt;Introduction to Elm&lt;/a&gt; - A presentation by &lt;strong&gt;DP Tech Info&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=hRPuS_ZdW_o" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FhRPuS_ZdW_o%2Fmqdefault.jpg" title="Introduction to Elm" alt="Introduction to Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;24th&lt;/em&gt; - Game &lt;a href="https://experiments.klemenc.io/sudoku" rel="noopener noreferrer"&gt;Sudoku &amp;amp; experiments&lt;/a&gt; by &lt;strong&gt;David Klemenc&lt;/strong&gt; (The games are a result of inspiration from Sebastian Lague videos.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://experiments.klemenc.io/sudoku" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fsudoku.png" title="Sudoku &amp;amp; experiments" alt="Sudoku &amp;amp; experiments" width="800" height="1103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;29th&lt;/em&gt; - Announcement &lt;a href="https://twitter.com/rhg_dev/status/1564083453792030724" rel="noopener noreferrer"&gt;Alpha release of ElmLand&lt;/a&gt; by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Ryan Haskell-Glatz announced the release of the latest alpha release of @ElmLand_ with a brand new @vite_js powered website, a guide designed for JS folks new to @elmlang, a dark mode AND a cool glowing thingie)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/rhg_dev/status/1564083453792030724" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fryan.jpeg" title="Alpha release of ElmLand" alt="Alpha release of ElmLand" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;29th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/projects-we-wish-we-had-time-for" rel="noopener noreferrer"&gt;Elm Radio episode #64 - Projects We Wish We Had Time For&lt;/a&gt; "We discuss the power of the Elm when paired with developer tools, and we go through our notes to look at Elm tools we wish we had the time to build."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/projects-we-wish-we-had-time-for" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #64 - Projects We Wish We Had Time For" alt="Elm Radio episode #64 - Projects We Wish We Had Time For" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;August &lt;em&gt;31st&lt;/em&gt; - Post &lt;a href="https://jfmengels.net/removing-an-annoyance-in-simplify/" rel="noopener noreferrer"&gt;Removing an annoyance in elm-review-simplify&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  September 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;7th&lt;/em&gt; - Announcement &lt;a href="https://itnews.iu.edu/articles/2022/IU-wins-300K-NSF-award-to-build-an-open-source-ecosystem-around-heavily-used-cloud-tool.php" rel="noopener noreferrer"&gt;IU wins $300K NSF award to build an open-source ecosystem around heavily used cloud tool&lt;/a&gt; by &lt;strong&gt;Chris Martin&lt;/strong&gt; (Exosphere is a 30k lines-of-code Elm application that delivers user-friendly, interactive access to OpenStack-based cloud systems)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://itnews.iu.edu/articles/2022/IU-wins-300K-NSF-award-to-build-an-open-source-ecosystem-around-heavily-used-cloud-tool.php" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fexosphere.png" title="IU wins $300K NSF award to build an open-source ecosystem around heavily used cloud tool" alt="IU wins $300K NSF award to build an open-source ecosystem around heavily used cloud tool" width="800" height="879"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;9th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=n15nOCZnTac" rel="noopener noreferrer"&gt;Getting started with elm-watch&lt;/a&gt; - A presentation by &lt;strong&gt;Simon Lydell&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=n15nOCZnTac" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2Fn15nOCZnTac%2Fmqdefault.jpg" title="Getting started with elm-watch" alt="Getting started with elm-watch" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;9th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/introducing-elm-watch-elm-make-in-watch-mode-fast-and-reliable/8653" rel="noopener noreferrer"&gt;Introducing elm-watch: elm make in watch mode. Fast and reliable&lt;/a&gt; by &lt;strong&gt;Simon Lydell&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;12th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-watch" rel="noopener noreferrer"&gt;Elm Radio episode #65 - elm-watch with Simon Lydell&lt;/a&gt; "Simon Lydell joins us to discuss his new Elm dev server which has a minimalist philosophy and maximal refinement."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-watch" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #65 - elm-watch with Simon Lydell" alt="Elm Radio episode #65 - elm-watch with Simon Lydell" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;13th&lt;/em&gt; - Game &lt;a href="https://twitter.com/wolfadex/status/1569370265561272320" rel="noopener noreferrer"&gt;Space Sim!&lt;/a&gt; by &lt;strong&gt;Wolfgang Schuster&lt;/strong&gt; (Getting closer to a point with &lt;a href="https://github.com/wolfadex/space-sim" rel="noopener noreferrer"&gt;https://github.com/wolfadex/space-sim&lt;/a&gt; where it's actually playable, though still basically alpha. Right now it's basically just a simulation you watch.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/wolfadex/status/1569370265561272320" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fspace-sim.png" title="Space Sim!" alt="Space Sim!" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;15th&lt;/em&gt; - Podcast &lt;a href="https://open.spotify.com/episode/6YlwUMV4WjoPKUNL7aH8tM" rel="noopener noreferrer"&gt;Software Unscripted: Lamdera with Mario Rogic&lt;/a&gt; by &lt;strong&gt;Richard Feldman&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://open.spotify.com/episode/6YlwUMV4WjoPKUNL7aH8tM" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Funscripted-mario.png" title="Software Unscripted: Lamdera with Mario Rogic" alt="Software Unscripted: Lamdera with Mario Rogic" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;17th&lt;/em&gt; - Post &lt;a href="https://pictureit.art/blog/why-I-chose-elixir-elm" rel="noopener noreferrer"&gt;Why I chose Elixir and Elm for Picture it&lt;/a&gt; by &lt;strong&gt;Rogerio Chaves&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;21st&lt;/em&gt; - Post &lt;a href="https://dev.to/jesterxl/designing-impossible-situations-3dp0"&gt;Designing Impossible Situations&lt;/a&gt; by &lt;strong&gt;Jesse Warden&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;22nd&lt;/em&gt; - Project &lt;a href="https://twitter.com/epsilon2718/status/1572819760655597568" rel="noopener noreferrer"&gt;scripta.io&lt;/a&gt; by &lt;strong&gt;James Carlson&lt;/strong&gt; (Simplified desktop version of &lt;a href="https://scripta.io" rel="noopener noreferrer"&gt;https://scripta.io&lt;/a&gt; using &lt;a href="https://tauri.app" rel="noopener noreferrer"&gt;https://tauri.app&lt;/a&gt;.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/epsilon2718/status/1572819760655597568" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fscripta.jpeg" title="scripta.io" alt="scripta.io" width="680" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://kioan000.medium.com/mega-enchanting-decoders-part-1-ddf068f12348" rel="noopener noreferrer"&gt;MEGA: Enchanting decoders (part 1)&lt;/a&gt; by &lt;strong&gt;Ivan Gori&lt;/strong&gt; (In this MEGA’s article, we’ll see some useful patterns to discover magic powers hidden inside Elm decoders.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;September &lt;em&gt;23rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=PYdgy5-zhiU" rel="noopener noreferrer"&gt;CodeGen with Types, for Humans, by Humans&lt;/a&gt; - A presentation by &lt;strong&gt;Matthew Griffith&lt;/strong&gt; at Strange Loop 2022&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=PYdgy5-zhiU" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FPYdgy5-zhiU%2Fmqdefault.jpg" title="CodeGen with Types, for Humans, by Humans" alt="CodeGen with Types, for Humans, by Humans" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;23rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=gT9Xu-ctNqI" rel="noopener noreferrer"&gt;Diagrammar: Simply Make Interactive Diagrams&lt;/a&gt; - A presentation by &lt;strong&gt;Pontus Granström&lt;/strong&gt; at Strange Loop 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=gT9Xu-ctNqI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FgT9Xu-ctNqI%2Fmqdefault.jpg" title="Diagrammar: Simply Make Interactive Diagrams" alt="Diagrammar: Simply Make Interactive Diagrams" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;23rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=o5DoPQ7SI0g" rel="noopener noreferrer"&gt;JUXT Cast S4E4 - Strange Loop Edition: A chat with Jared M. Smith&lt;/a&gt; - A presentation by &lt;strong&gt;Renzo Borgatti and Jared M. Smith&lt;/strong&gt; at Strange Loop 2022 (At Strange Loop 2022, Renzo Borgatti met Jared M. Smith to talk about ELM, the so-called 'JavaScript' fatigue and much more.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=o5DoPQ7SI0g" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2Fo5DoPQ7SI0g%2Fmqdefault.jpg" title="JUXT Cast S4E4 - Strange Loop Edition: A chat with Jared M. Smith" alt="JUXT Cast S4E4 - Strange Loop Edition: A chat with Jared M. Smith" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;26th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-codegen" rel="noopener noreferrer"&gt;Elm Radio episode #66 - elm-codegen with Matthew Griffith&lt;/a&gt; "Matthew Griffith joins us to discuss elm-codegen, a tool for generating Elm safely and conveniently."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-codegen" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #66 - elm-codegen with Matthew Griffith" alt="Elm Radio episode #66 - elm-codegen with Matthew Griffith" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;September &lt;em&gt;29th&lt;/em&gt; - Post &lt;a href="https://www.infoworld.com/article/3674859/where-javascript-is-headed-in-2022.html" rel="noopener noreferrer"&gt;Where JavaScript is headed in 2022&lt;/a&gt; by &lt;strong&gt;Matthew Tyson&lt;/strong&gt; (Which JavaScript frameworks, features, and tools do developers favor, and which are on the way out? Let’s look at the latest State of JavaScript survey results.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  October 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;3rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=_dt5_37lO5w" rel="noopener noreferrer"&gt;[elm] Building a Simple Calculator&lt;/a&gt; - A presentation by &lt;strong&gt;theteachr&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_dt5_37lO5w" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F_dt5_37lO5w%2Fmqdefault.jpg" title="[elm] Building a Simple Calculator" alt="[elm] Building a Simple Calculator" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;4th&lt;/em&gt; - Project &lt;a href="https://elm.land/news/hello-world.html" rel="noopener noreferrer"&gt;👋 Hello, world!&lt;/a&gt; by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (What is Elm Land? Learn more about the project's motivation, goals, and how we can get there together!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;6th&lt;/em&gt; - Post &lt;a href="https://nais.io/blog/posts/elm/" rel="noopener noreferrer"&gt;Introducing Elm as a frontend contender&lt;/a&gt; by &lt;strong&gt;Kim Tore Jensen&lt;/strong&gt; (Replacing React with Elm as our frontend programming language brings risks, rewards, and lots of developer happiness.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;7th&lt;/em&gt; - Post &lt;a href="https://jxxcarlson.medium.com/elm-tauri-befa59eab403" rel="noopener noreferrer"&gt;Elm + Tauri&lt;/a&gt; by &lt;strong&gt;James Carlson&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;10th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-at-a-billion-dollar-company" rel="noopener noreferrer"&gt;Elm Radio episode #67 - Elm at a Billion Dollar Company with Aaron White&lt;/a&gt; "We discuss how betting on Elm has paid off at Vendr and get a CTO's perspective on using Elm at scale."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-at-a-billion-dollar-company" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #67 - Elm at a Billion Dollar Company with Aaron White" alt="Elm Radio episode #67 - Elm at a Billion Dollar Company with Aaron White" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;11th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=ZPVGK2OSTog" rel="noopener noreferrer"&gt;Functional Programming in Vite with Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Lindsay Wardell&lt;/strong&gt; at ViteConf 2022 (Elm is a delightful language for building reliable web applications. In this talk, we'll explore what Elm is, how it compares to Javascript, and how we can incorporate it into a Vite-based application.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ZPVGK2OSTog" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FZPVGK2OSTog%2Fmqdefault.jpg" title="Functional Programming in Vite with Elm" alt="Functional Programming in Vite with Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;12th&lt;/em&gt; - Presentation &lt;a href="https://docs.google.com/presentation/d/1nntLMrGaLsCOV83DOPvW7c0aemFoApIszuhRzoThYrs/" rel="noopener noreferrer"&gt;Yet another way to manage shared state in Elm SPAs&lt;/a&gt; by &lt;strong&gt;Jeremy H. Brown&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/1nntLMrGaLsCOV83DOPvW7c0aemFoApIszuhRzoThYrs/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fmanage.png" title="Yet another way to manage shared state in Elm SPAs" alt="Yet another way to manage shared state in Elm SPAs" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;12th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/elm-explorations-test-2-0-0-released/8705" rel="noopener noreferrer"&gt;Elm-explorations/test 2.0.0 released!&lt;/a&gt; by &lt;strong&gt;Martin Janiczek&lt;/strong&gt; (Janiczek is happy to announce the 2.0.0 version of elm-explorations/test has been released! In it you’ll find a nicer-to-use Fuzz module API, the &lt;code&gt;andThen&lt;/code&gt; function, and lots more.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;16th&lt;/em&gt; - Game &lt;a href="https://discourse.elm-lang.org/t/2048-a-complete-clone-of-the-classic-game/8717" rel="noopener noreferrer"&gt;2048 - A complete clone of the classic game&lt;/a&gt; by &lt;strong&gt;Dwayne Crooks&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;October &lt;em&gt;24th&lt;/em&gt; - Post &lt;a href="https://jaredmsmith.com/dev/elm-pool-collaboration" rel="noopener noreferrer"&gt;Elm 3D Pool Game Collaboration&lt;/a&gt; by &lt;strong&gt;Jared M. Smith&lt;/strong&gt; (I wrote about my experience collaborating with @unsoundscapes on building a 3D pool game in Elm.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jaredmsmith.com/dev/elm-pool-collaboration" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F3d-pool.png" title="Elm 3D Pool Game Collaboration" alt="Elm 3D Pool Game Collaboration" width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;24th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/add" rel="noopener noreferrer"&gt;Elm Radio episode #68 - Elm and ADD&lt;/a&gt; "We discuss how Elm is a powerful tool for people with ADD, and how lessons learned from ADD can benefit people who don't have ADD."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/add" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #68 - Elm and ADD" alt="Elm Radio episode #68 - Elm and ADD" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;26th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=zoi0bsUCqnQ" rel="noopener noreferrer"&gt;Fullstack happiness using the regal stack&lt;/a&gt; - A presentation by &lt;strong&gt;Jesse Warden&lt;/strong&gt; at Open Slava '22&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=zoi0bsUCqnQ" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2Fzoi0bsUCqnQ%2Fmqdefault.jpg" title="Fullstack happiness using the regal stack" alt="Fullstack happiness using the regal stack" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;26th&lt;/em&gt; - Project &lt;a href="https://twitter.com/luca_mug/status/1585022666259726338" rel="noopener noreferrer"&gt;Stringy - The string transformer&lt;/a&gt; by &lt;strong&gt;Luca Mugnaini&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/luca_mug/status/1585022666259726338" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fstringy.jpeg" title="Stringy - The string transformer" alt="Stringy - The string transformer" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;October &lt;em&gt;29th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=Gde5D1ImZPI" rel="noopener noreferrer"&gt;What’s new in elm-watch 1.1.0&lt;/a&gt; - A presentation by &lt;strong&gt;Simon Lydell&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Gde5D1ImZPI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FGde5D1ImZPI%2Fmqdefault.jpg" title="What’s new in elm-watch 1.1.0" alt="What’s new in elm-watch 1.1.0" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  November 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;1th&lt;/em&gt; - Post &lt;a href="https://blog.noredink.com/post/699829728548372480/svgs-as-elm-code" rel="noopener noreferrer"&gt;SVGs as Elm Code&lt;/a&gt; by &lt;strong&gt;Tessa Kelly&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;7th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/types-vs-tests" rel="noopener noreferrer"&gt;Elm Radio episode #69 - Types vs. Tests&lt;/a&gt; "We discuss the role of types versus tests, and whether they complement each other or make the other obsolete."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/types-vs-tests" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #69 - Types vs. Tests" alt="Elm Radio episode #69 - Types vs. Tests" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;8th&lt;/em&gt; - Post &lt;a href="https://jfmengels.net/much-faster-fixes/" rel="noopener noreferrer"&gt;Much, much faster fixes&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;12th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=Z3UGuaJWbaA" rel="noopener noreferrer"&gt;Designing for Programmer Delight&lt;/a&gt; - A presentation by &lt;strong&gt;Richard Feldman&lt;/strong&gt; at Software You Can Love 2022&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Z3UGuaJWbaA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FZ3UGuaJWbaA%2Fmqdefault.jpg" title="Designing for Programmer Delight" alt="Designing for Programmer Delight" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;13th&lt;/em&gt; - Project &lt;a href="https://twitter.com/Xossbow/status/1591456287954722816" rel="noopener noreferrer"&gt;Mammudeck&lt;/a&gt; by &lt;strong&gt;Bill St. Clair&lt;/strong&gt; (I've been having a blast writing Elm again, after a two-year hiatus. I wrote billstclair/elm-dynamodb and am using it to make a DynamoDB.AppState module, so I can have global persistent state for #mammudeck)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;14th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/announcing-vendrinc-elm-gql/8759" rel="noopener noreferrer"&gt;Announcing VendrInc/Elm-GQL!&lt;/a&gt; by &lt;strong&gt;Matthew Griffith&lt;/strong&gt; (Matt Griffith is announcing vendrinc/elm-gql! A tool for generating Elm modules from GraphQL queries and mutations.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;15th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/help-test-the-new-npm-elm-package/8761" rel="noopener noreferrer"&gt;Help test the new npm elm package!&lt;/a&gt; by &lt;strong&gt;Simon Lydell&lt;/strong&gt; (Me, &lt;a class="mentioned-user" href="https://dev.to/supermario"&gt;@supermario&lt;/a&gt; and @evancz (with the help of some more folks) are working on a new version of the elm npm package.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;15th&lt;/em&gt; - Post &lt;a href="https://thoughtbot.com/blog/data-modeling-resources-in-elm" rel="noopener noreferrer"&gt;Data Modeling Resources in Elm&lt;/a&gt; by &lt;strong&gt;Joël Quenneville&lt;/strong&gt; (Some of the best Elm data modeling resources around the web.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;15th&lt;/em&gt; - Game &lt;a href="https://yourmagicisworking.itch.io/liikennematto/devlog/452108/liikennematto-released-into-early-access" rel="noopener noreferrer"&gt;Liikennematto released into early access!&lt;/a&gt; by &lt;strong&gt;Matias Klemola&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://yourmagicisworking.itch.io/liikennematto/devlog/452108/liikennematto-released-into-early-access" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fliikennematto.png" title="Liikennematto released into early access!" alt="Liikennematto released into early access!" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;16th&lt;/em&gt; - Game &lt;a href="https://github.com/dividat/game-drops" rel="noopener noreferrer"&gt;Drops&lt;/a&gt; by &lt;strong&gt;Gábor Kerekes&lt;/strong&gt; (Drops is an implementation of Puyo Puyo by Dividat.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/dividat/game-drops" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fdrops.png" title="Drops" alt="Drops" width="800" height="889"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;16th&lt;/em&gt; - Post &lt;a href="https://dev.to/marciofrayze/virtual-dom-what-problem-does-it-solve-4b20"&gt;Virtual DOM: What problem does it solve?&lt;/a&gt; by &lt;strong&gt;Marcio Frayze&lt;/strong&gt; (A post about virual DOM and the declarative approach of Elm to handle it.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/marciofrayze/virtual-dom-what-problem-does-it-solve-4b20"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2F2022-11-16-virtual-dom.webp" title="Virtual DOM: What problem does it solve?" alt="Virtual DOM: What problem does it solve?" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;17th&lt;/em&gt; - Presentation &lt;a href="https://elm-pres.jakobferdinand.at/" rel="noopener noreferrer"&gt;Elm, If it compiles it works!&lt;/a&gt; by &lt;strong&gt;Jakob Ferdinand Wegenschimmel&lt;/strong&gt; (A presentation written in elm-land that anyone can use. &lt;a href="https://github.com/JakobFerdinand/elm-pres" rel="noopener noreferrer"&gt;Code&lt;/a&gt;, &lt;a href="https://elm-pres.jakobferdinand.at/" rel="noopener noreferrer"&gt;Live presentation&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-pres.jakobferdinand.at/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fpresentation-jakob.png" title="Elm, If it compiles it works!" alt="Elm, If it compiles it works!" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;17th&lt;/em&gt; - Post &lt;a href="https://azurewaters.medium.com/slightly-more-advanced-guide-to-making-http-calls-in-elm-4cb685f7743a" rel="noopener noreferrer"&gt;Slightly more advanced guide to making HTTP calls in Elm&lt;/a&gt; by &lt;strong&gt;azurewaters&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;19th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=uOi4WPrZTP4" rel="noopener noreferrer"&gt;Elm language for learning functional programming&lt;/a&gt; - A presentation by &lt;strong&gt;Kajetan Świątek&lt;/strong&gt; at Devoxx Poland 2021 (Functional programming is still a mystery for many developers. There is an overwhelming amount of math and theory surrounding it, to the point of scaring people away. But it turns out, that with the right tools, it is possible to learn FP and to get productive fast!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=uOi4WPrZTP4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FuOi4WPrZTP4%2Fmqdefault.jpg" title="Elm language for learning functional programming" alt="Elm language for learning functional programming" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;21st&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/elm-gql" rel="noopener noreferrer"&gt;Elm Radio episode #70 - elm-gql with Matthew Griffith&lt;/a&gt; "Matthew Griffith joins us to share his new type-safe GraphQL tool, and to compare the query builder and query generator approaches."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/elm-gql" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #70 - elm-gql with Matthew Griffith" alt="Elm Radio episode #70 - elm-gql with Matthew Griffith" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://dev.to/bcardiff/contributing-to-devenv-50ag"&gt;Contributing to devenv&lt;/a&gt; by &lt;strong&gt;Brian J. Cardiff&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;28th&lt;/em&gt; - Post &lt;a href="https://dev.to/jesterxl/getting-tailwind-to-work-with-elm-book-5e90"&gt;Getting Tailwind to Work with Elm Book&lt;/a&gt; by &lt;strong&gt;Jesse Warden&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;November &lt;em&gt;30th&lt;/em&gt; - Announcement &lt;a href="https://elm-widgets.netlify.app/overview" rel="noopener noreferrer"&gt;Elm-Widgets&lt;/a&gt; by &lt;strong&gt;Georges Boris&lt;/strong&gt; (Elm-Widget, a collection of stateless widgets designed to make your experience building elm applications easier and even more delightful, was annunced at the Elm Remote Meetup)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-widgets.netlify.app/overview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-widgets.png" title="Elm-Widgets" alt="Elm-Widgets" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;November &lt;em&gt;30th&lt;/em&gt; - Presentation &lt;a href="https://docs.google.com/presentation/d/1lTgRyGbswb2ozynYckLUZja_FY5RGlBnfJGduOUsYGc/" rel="noopener noreferrer"&gt;Thought experiment: Hiding implementation types in Elm&lt;/a&gt; by &lt;strong&gt;Jeremy H. Brown&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/1lTgRyGbswb2ozynYckLUZja_FY5RGlBnfJGduOUsYGc/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fhiding.png" title="Thought experiment: Hiding implementation types in Elm" alt="Thought experiment: Hiding implementation types in Elm" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  December 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;1th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=3dvxDNgfSTg" rel="noopener noreferrer"&gt;Day 1: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 1! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3dvxDNgfSTg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F3dvxDNgfSTg%2Fmqdefault.jpg" title="Day 1: Learn Elm with Advent of Code" alt="Day 1: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;1th&lt;/em&gt; - Project &lt;a href="https://discourse.elm-lang.org/t/announcing-fractale/8792" rel="noopener noreferrer"&gt;Fractale&lt;/a&gt; by &lt;strong&gt;Adrien Dulac&lt;/strong&gt; (Fractale is part of the “productivity” or “asynchronous communication” tools family. As a developer, I am satisfied with the organization and collaboration tools built around Git, such as Github/Gitlab/Gitea. But for human beings who are not developers or strangers to these tools, they remain too complex and ill adapted...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://discourse.elm-lang.org/t/announcing-fractale/8792" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Ffractale.png" title="Fractale" alt="Fractale" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;2nd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=EwmmEDtFGYo" rel="noopener noreferrer"&gt;Day 2: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 2! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=EwmmEDtFGYo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FEwmmEDtFGYo%2Fmqdefault.jpg" title="Day 2: Learn Elm with Advent of Code" alt="Day 2: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;2nd&lt;/em&gt; - Post &lt;a href="https://blog.noredink.com/post/703458632758689792/custom-focus-rings" rel="noopener noreferrer"&gt;Custom Focus Rings&lt;/a&gt; by &lt;strong&gt;Tessa Kelly&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;2nd&lt;/em&gt; - Post &lt;a href="https://dev.to/rhg/learn-functional-programming-with-advent-of-code-33en"&gt;Learn functional programming with Advent of Code! ☃️&lt;/a&gt; by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;4th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=zrbTriIbHbg" rel="noopener noreferrer"&gt;Day 4: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 4! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=zrbTriIbHbg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FzrbTriIbHbg%2Fmqdefault.jpg" title="Day 4: Learn Elm with Advent of Code" alt="Day 4: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;4th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=BNaWTs9f-XY" rel="noopener noreferrer"&gt;Day 3: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 3! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=BNaWTs9f-XY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FBNaWTs9f-XY%2Fmqdefault.jpg" title="Day 3: Learn Elm with Advent of Code" alt="Day 3: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;5th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=5CI--KtqyHo" rel="noopener noreferrer"&gt;Day 5: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 5! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=5CI--KtqyHo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F5CI--KtqyHo%2Fmqdefault.jpg" title="Day 5: Learn Elm with Advent of Code" alt="Day 5: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;5th&lt;/em&gt; - Tutorial &lt;a href="https://www.reddit.com/r/adventofcode/comments/zcng3e/2022_day_4_elm_letting_the_computer_find_a/" rel="noopener noreferrer"&gt;[2022 Day 4] [Elm] Letting the computer find a correct predicate (not AI)&lt;/a&gt; by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;5th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/deliberate-practice" rel="noopener noreferrer"&gt;Elm Radio episode #71 - Deliberate Practice&lt;/a&gt; "We discuss deliberate practice and how it can help you hone your craft, and make you even better at using Opaque Types."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/deliberate-practice" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #71 - Deliberate Practice" alt="Elm Radio episode #71 - Deliberate Practice" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;6th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=4eA5BXKTL5Q" rel="noopener noreferrer"&gt;Day 6: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 6! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=4eA5BXKTL5Q" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F4eA5BXKTL5Q%2Fmqdefault.jpg" title="Day 6: Learn Elm with Advent of Code" alt="Day 6: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;6th&lt;/em&gt; - Post &lt;a href="https://jfmengels.net/elm-review-insights/" rel="noopener noreferrer"&gt;Gaining insight into your codebase with elm-review&lt;/a&gt; by &lt;strong&gt;Jeroen Engels&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;7th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=WE5bmt0zBxg" rel="noopener noreferrer"&gt;How to do Property based Testing Shrinkers Right&lt;/a&gt; - A presentation by &lt;strong&gt;Martin Janiczek&lt;/strong&gt; at Haskell eXchange (Property-based testing (PBT) is a valuable tool in the functional programming world: it generates test inputs for you (finding tricky edge cases you wouldn't be able to find manually) and lets you specify and verify laws and invariants about your code with ease. Virtually all PBT tools nowadays shrink the failing inputs to a minimal (and thus much more helpful) counterexample before presenting it to you. Implementing shrinkers can be tricky, though. I'll walk through the common shrinking algorithms (seen in QuickCheck, Hedgehog, ScalaCheck, etc.), their inherent problems, and most importantly: how to implement shrinking in a way that doesn't suffer from them!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=WE5bmt0zBxg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FWE5bmt0zBxg%2Fmqdefault.jpg" title="How to do Property based Testing Shrinkers Right" alt="How to do Property based Testing Shrinkers Right" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;8th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=-4lyp9pVKE0" rel="noopener noreferrer"&gt;Look Ma no graphics card! Software-based 3D rendering in Elm&lt;/a&gt; - A presentation by &lt;strong&gt;Julian Antonielli&lt;/strong&gt; at Elm Online Meetup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=-4lyp9pVKE0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F-4lyp9pVKE0%2Fmqdefault.jpg" title="Look Ma no graphics card! Software-based 3D rendering in Elm" alt="Look Ma no graphics card! Software-based 3D rendering in Elm" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;8th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=RlUqfi-3oZQ" rel="noopener noreferrer"&gt;Day 8: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 8! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=RlUqfi-3oZQ" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FRlUqfi-3oZQ%2Fmqdefault.jpg" title="Day 8: Learn Elm with Advent of Code" alt="Day 8: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;8th&lt;/em&gt; - Project &lt;a href="https://twitter.com/angusjfindlay/status/1600558205838532611" rel="noopener noreferrer"&gt;astro-integration-elm&lt;/a&gt; by &lt;strong&gt;Angus Findlay&lt;/strong&gt; (I've created an Elm integration for Astrodotbuild, which lets you render Elm islands server-side!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;9th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=28GfRzWuzzY" rel="noopener noreferrer"&gt;Day 9: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 9! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=28GfRzWuzzY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F28GfRzWuzzY%2Fmqdefault.jpg" title="Day 9: Learn Elm with Advent of Code" alt="Day 9: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;9th&lt;/em&gt; - Post &lt;a href="https://blog.noredink.com/post/701651083488018432/presenting-styleguide-colors" rel="noopener noreferrer"&gt;Presenting Styleguide Colors&lt;/a&gt; by &lt;strong&gt;Tessa Kelly&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;11th&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=wXddQR5i9is" rel="noopener noreferrer"&gt;Day 10: Learn Elm with Advent of Code&lt;/a&gt; - A presentation by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt; (Advent of Code 2022, Day 10! This series is designed for anyone new to functional programming. We use a language called Elm to complete these puzzles together. All the solutions and links are available below!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=wXddQR5i9is" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FwXddQR5i9is%2Fmqdefault.jpg" title="Day 10: Learn Elm with Advent of Code" alt="Day 10: Learn Elm with Advent of Code" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;12th&lt;/em&gt; - Project &lt;a href="https://gren-lang.org/news/221212_hello_nodejs/" rel="noopener noreferrer"&gt;Gren 0.2: Hello, NodeJS&lt;/a&gt; by &lt;strong&gt;Robin H. Hansen&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;12th&lt;/em&gt; - Post &lt;a href="https://derw.substack.com/p/make-your-own-tea-the-elm-architecture" rel="noopener noreferrer"&gt;Make your own TEA (The Elm Architecture)&lt;/a&gt; by &lt;strong&gt;Noah&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;15th&lt;/em&gt; - Post &lt;a href="https://dev.to/dwayne/beware-of-integer-division-in-elm-0191-3ig4"&gt;Beware of integer division in Elm 0.19.1&lt;/a&gt; by &lt;strong&gt;Dwayne Crooks&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;17th&lt;/em&gt; - Project &lt;a href="https://github.com/billstclair/advent-of-code-2022" rel="noopener noreferrer"&gt;Elm solutions for the 2022 Advent of Code&lt;/a&gt; by &lt;strong&gt;Bill St. Clair&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;18th&lt;/em&gt; - Post &lt;a href="https://discourse.elm-lang.org/t/elm-common-tests-library-test-results-across-the-ecosystem/8828" rel="noopener noreferrer"&gt;Elm-common-tests library + test results across the ecosystem&lt;/a&gt; by &lt;strong&gt;Martin Janiczek&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;19th&lt;/em&gt; - &lt;a href="https://elm-radio.com/episode/holiday-special-2022" rel="noopener noreferrer"&gt;Elm Radio episode #72 - 2022 Holiday Special&lt;/a&gt; "Matthew Griffith and Mario Rogic join us to ring in the New Year and look at trends in Elm this year and looking forward next year."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://elm-radio.com/episode/holiday-special-2022" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Felm-radio.png" title="Elm Radio episode #72 - 2022 Holiday Special" alt="Elm Radio episode #72 - 2022 Holiday Special" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;20th&lt;/em&gt; - Project &lt;a href="https://elm.land/news/building-better-apps.html" rel="noopener noreferrer"&gt;🌱 Building a better Elm Land&lt;/a&gt; by &lt;strong&gt;Ryan Haskell-Glatz&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;22nd&lt;/em&gt; - Post &lt;a href="https://sergiiriabokon.medium.com/notes-on-elm-programming-language-3873b1353764" rel="noopener noreferrer"&gt;Notes on Elm programming language&lt;/a&gt; by &lt;strong&gt;Serhii Riabokon&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;December &lt;em&gt;23rd&lt;/em&gt; - Video &lt;a href="https://www.youtube.com/watch?v=_Nrs2_l62_Q" rel="noopener noreferrer"&gt;Hot reloading the Simple IoT UI&lt;/a&gt; - A presentation by &lt;strong&gt;Simple IoT&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_Nrs2_l62_Q" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2F_Nrs2_l62_Q%2Fmqdefault.jpg" title="Hot reloading the Simple IoT UI" alt="Hot reloading the Simple IoT UI" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;December &lt;em&gt;30th&lt;/em&gt; - Project &lt;a href="https://twitter.com/logachev_dev/status/1608535396262060033" rel="noopener noreferrer"&gt;Competition Tracking&lt;/a&gt; by &lt;strong&gt;Vladimir Kirienko&lt;/strong&gt; (A web app for tracking gliding competitions using Haskell and Elm, with websockets!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/logachev_dev/status/1608535396262060033" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Felm-a-year-in-review%2Fimages2022%2Fgliding.jpeg" title="Competition Tracking" alt="Competition Tracking" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Some of the companies that hired Elm developers in 2022
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.acima.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Acima&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://raccareers.com/acima/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-246" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.activestate.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;ActiveState&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.activestate.com/company/careers/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-216-1203438" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.avetta.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Avetta&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.avetta.com/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-199-1017639" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.bernoullifinance.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Bernoulli Finance&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.bernoullifinance.com/work-with-us" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-214-1183681" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://buildr.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Buildr&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-231-1359418" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.carerev.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;CareRev&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.carerev.com/carerev-careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-198-1006112" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.caribou.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Caribou&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.caribou.com/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-208-1121427" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.corvusinsurance.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Corvus&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.corvusinsurance.com/culture-and-careers-at-corvus" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-200-1029618" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.crowdstrike.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;CrowdStrike&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.crowdstrike.com/careers/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-238-1436712" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.esparklearning.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;eSpark&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.esparklearning.com/company/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-223-1273732" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://field33.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Field 33&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://field33.com/jobs" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-205-1086950" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://withflint.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flint&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://withflint.com/join/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-243" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://generative.vision/" rel="noopener noreferrer"&gt;&lt;strong&gt;Generative&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-232-1370195" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.genesys.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Genesys&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.genesys.com/company/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-235-1403846" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.geora.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Geora&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.geora.io/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-197-993384" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.gwi.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;GWI&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.gwi.com/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-196-982352" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hellorse.fr/" rel="noopener noreferrer"&gt;&lt;strong&gt;hello RSE&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://contact.hellorse.fr/qui-sommes-nous/recrutement" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-222-1264086" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.logisticallyinc.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Logistically&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-203-1064828" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.metronomics.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Metronome Growth Systems&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.metronomics.com/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-196-982352" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.midwayusa.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;MidwayUSA&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.midwayusa.com/jobs/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-200-1029618" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://themindgym.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;MindGym&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://themindgym.com/careers/jobs" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-235-1403846" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://permutive.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Permutive&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://permutive.com/careers/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-197-993384" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.gopinata.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;PINATA&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.gopinata.info/jobs" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-233-1381552" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.powerreviews.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;PowerReviews&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.powerreviews.com/about/careers/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-220-1245309" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://savr.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;SAVR&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://career.savr.com/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-229-1334833" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.scrive.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Scrive&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://careers.scrive.com/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://structionsite.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Structionsite&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://structionsite.com/about-us/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-216-1203438" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://veeva.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Veeva&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://careers.veeva.com/" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-201-1041169" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.vendr.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Vendr&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.vendr.com/careers" rel="noopener noreferrer"&gt;Careers&lt;/a&gt;, &lt;a href="https://www.elmweekly.nl/p/elm-weekly-issue-218-1223344" rel="noopener noreferrer"&gt;Info&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more job related news, susbscribe to the &lt;a href="https://www.elmweekly.nl/" rel="noopener noreferrer"&gt;Elm Weekly newsletter&lt;/a&gt; or to the #jobs channel in the &lt;a href="https://elm-lang.org/community/slack" rel="noopener noreferrer"&gt;Elm Slack&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partial list of companies that use Elm
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.ableton.com/en/about/" rel="noopener noreferrer"&gt;Ableton&lt;/a&gt; ⬩  &lt;a href="https://www.acima.com/" rel="noopener noreferrer"&gt;Acima&lt;/a&gt; ⬩  &lt;a href="https://www.acko.com/" rel="noopener noreferrer"&gt;ACKO&lt;/a&gt; ⬩  &lt;a href="https://www.activestate.com/" rel="noopener noreferrer"&gt;ActiveState&lt;/a&gt; ⬩  &lt;a href="https://adrima.es" rel="noopener noreferrer"&gt;Adrima&lt;/a&gt; ⬩  &lt;a href="https://ajrintl.com/" rel="noopener noreferrer"&gt;AJR International&lt;/a&gt; ⬩  &lt;a href="https://almapay.com/" rel="noopener noreferrer"&gt;Alma&lt;/a&gt; ⬩  &lt;a href="https://astrosat.net/" rel="noopener noreferrer"&gt;Astrosat&lt;/a&gt; ⬩  &lt;a href="https://www.avasecurity.com/" rel="noopener noreferrer"&gt;Ava&lt;/a&gt; ⬩  &lt;a href="https://www.avetta.com/" rel="noopener noreferrer"&gt;Avetta&lt;/a&gt; ⬩  &lt;a href="https://www.azara.io/" rel="noopener noreferrer"&gt;Azara&lt;/a&gt; ⬩  &lt;a href="https://meine-barmenia.de/" rel="noopener noreferrer"&gt;Barmenia&lt;/a&gt; ⬩  &lt;a href="https://basiq.io/" rel="noopener noreferrer"&gt;Basiq&lt;/a&gt; ⬩  &lt;a href="http://www.beautifuldestinations.com/" rel="noopener noreferrer"&gt;Beautiful Destinations&lt;/a&gt; ⬩  &lt;a href="http://bec-systems.com" rel="noopener noreferrer"&gt;BEC Systems&lt;/a&gt; ⬩  &lt;a href="https://www.bekk.no/" rel="noopener noreferrer"&gt;Bekk&lt;/a&gt; ⬩  &lt;a href="https://bellroy.com/" rel="noopener noreferrer"&gt;Bellroy&lt;/a&gt; ⬩  &lt;a href="https://bendyworks.com" rel="noopener noreferrer"&gt;Bendyworks&lt;/a&gt; ⬩  &lt;a href="https://www.bernoullifinance.com/" rel="noopener noreferrer"&gt;Bernoulli Finance&lt;/a&gt; ⬩  &lt;a href="https://bluedogtraining.com.au/" rel="noopener noreferrer"&gt;Blue Fog Training&lt;/a&gt; ⬩  &lt;a href="https://web.bravotran.com/" rel="noopener noreferrer"&gt;BravoTran&lt;/a&gt; ⬩  &lt;a href="https://www.brilliant.org/" rel="noopener noreferrer"&gt;Brilliant&lt;/a&gt; ⬩  &lt;a href="https://budapestschool.org/en/" rel="noopener noreferrer"&gt;Budapest School&lt;/a&gt; ⬩  &lt;a href="https://buildr.com/" rel="noopener noreferrer"&gt;Buildr&lt;/a&gt; ⬩  &lt;a href="https://cachix.org/" rel="noopener noreferrer"&gt;Cachix&lt;/a&gt; ⬩  &lt;a href="https://calculojuridico.com.br/" rel="noopener noreferrer"&gt;CalculoJuridico&lt;/a&gt; ⬩  &lt;a href="https://www.carerev.com/" rel="noopener noreferrer"&gt;CareRev&lt;/a&gt; ⬩  &lt;a href="https://www.carfax.com/" rel="noopener noreferrer"&gt;CARFAX&lt;/a&gt; ⬩  &lt;a href="https://www.caribou.com/" rel="noopener noreferrer"&gt;Caribou&lt;/a&gt; ⬩  &lt;a href="https://www.carwow.co.uk/" rel="noopener noreferrer"&gt;carwow&lt;/a&gt; ⬩  &lt;a href="https://www.cbancnetwork.com" rel="noopener noreferrer"&gt;CBANC&lt;/a&gt; ⬩  &lt;a href="https://circuithub.com/" rel="noopener noreferrer"&gt;CircuitHub&lt;/a&gt; ⬩  &lt;a href="https://www.cngroup.dk/" rel="noopener noreferrer"&gt;CN Group CZ&lt;/a&gt; ⬩  &lt;a href="https://cointracking.info/" rel="noopener noreferrer"&gt;CoinTracking&lt;/a&gt; ⬩  &lt;a href="https://concourse-ci.org" rel="noopener noreferrer"&gt;Concourse CI&lt;/a&gt; ⬩  &lt;a href="https://consensys.net/" rel="noopener noreferrer"&gt;Consensys&lt;/a&gt; ⬩  &lt;a href="https://s.tech.cornell.edu/" rel="noopener noreferrer"&gt;Cornell Tech&lt;/a&gt; ⬩  &lt;a href="https://www.corvusinsurance.com/" rel="noopener noreferrer"&gt;Corvus&lt;/a&gt; ⬩  &lt;a href="https://www.crowdstrike.com/" rel="noopener noreferrer"&gt;Crowdstrike&lt;/a&gt; ⬩  &lt;a href="https://cultureamp.com" rel="noopener noreferrer"&gt;Culture Amp&lt;/a&gt; ⬩  &lt;a href="https://www.dayoneapp.com/" rel="noopener noreferrer"&gt;Day One&lt;/a&gt; ⬩  &lt;a href="https://deepgram.com" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt; ⬩  &lt;a href="https://diesdas.digital" rel="noopener noreferrer"&gt;diesdas.digital&lt;/a&gt; ⬩  &lt;a href="https://www.dividat.com" rel="noopener noreferrer"&gt;Dividat&lt;/a&gt; ⬩  &lt;a href="https://www.driebit.nl/nl/about" rel="noopener noreferrer"&gt;Driebit&lt;/a&gt; ⬩  &lt;a href="https://drip.com" rel="noopener noreferrer"&gt;Drip&lt;/a&gt; ⬩  &lt;a href="https://www.emirates.com/" rel="noopener noreferrer"&gt;Emirates&lt;/a&gt; ⬩  &lt;a href="https://www.esparklearning.com" rel="noopener noreferrer"&gt;eSpark&lt;/a&gt; ⬩  &lt;a href="https://www.exrny.com/" rel="noopener noreferrer"&gt;EXR&lt;/a&gt; ⬩  &lt;a href="http://www.featurespace.com/" rel="noopener noreferrer"&gt;Featurespace&lt;/a&gt; ⬩  &lt;a href="https://field33.com/" rel="noopener noreferrer"&gt;Field 33&lt;/a&gt; ⬩  &lt;a href="https://fission.codes" rel="noopener noreferrer"&gt;Fission&lt;/a&gt; ⬩  &lt;a href="https://withflint.com/" rel="noopener noreferrer"&gt;Flint&lt;/a&gt; ⬩  &lt;a href="https://folq.no/" rel="noopener noreferrer"&gt;Folq&lt;/a&gt; ⬩  &lt;a href="https://www.ford.com/" rel="noopener noreferrer"&gt;Ford&lt;/a&gt; ⬩  &lt;a href="https://www.frende.no/" rel="noopener noreferrer"&gt;Forsikring&lt;/a&gt; ⬩  &lt;a href="https://www.foxhound.systems/" rel="noopener noreferrer"&gt;Foxhound Systems&lt;/a&gt; ⬩  &lt;a href="http://futurice.com/" rel="noopener noreferrer"&gt;Futurice&lt;/a&gt; ⬩  &lt;a href="https://www.fgirot.se/" rel="noopener noreferrer"&gt;FörsäkringsGirot&lt;/a&gt; ⬩  &lt;a href="https://generative.vision/" rel="noopener noreferrer"&gt;Generative&lt;/a&gt; ⬩  &lt;a href="https://www.genesys.com/" rel="noopener noreferrer"&gt;Genesys&lt;/a&gt; ⬩  &lt;a href="https://www.geora.io/" rel="noopener noreferrer"&gt;Geora&lt;/a&gt; ⬩  &lt;a href="http://www.gizra.com/" rel="noopener noreferrer"&gt;Gizra&lt;/a&gt; ⬩  &lt;a href="https://www.gwi.com/" rel="noopener noreferrer"&gt;GWI&lt;/a&gt; ⬩  &lt;a href="https://www.hambs.com.au/" rel="noopener noreferrer"&gt;HAMBS&lt;/a&gt; ⬩  &lt;a href="https://hatchcare.com/" rel="noopener noreferrer"&gt;Hatch&lt;/a&gt; ⬩  &lt;a href="https://www.wearehearken.com" rel="noopener noreferrer"&gt;Hearken&lt;/a&gt; ⬩  &lt;a href="https://hellorse.fr/" rel="noopener noreferrer"&gt;hello RSE&lt;/a&gt; ⬩  &lt;a href="https://engineering.hubtran.com" rel="noopener noreferrer"&gt;HubTran&lt;/a&gt; ⬩  &lt;a href="https://www.ibm.com/" rel="noopener noreferrer"&gt;IBM&lt;/a&gt; ⬩  &lt;a href="https://idein.jp/" rel="noopener noreferrer"&gt;Idein&lt;/a&gt; ⬩  &lt;a href="https://www.goilluminate.com" rel="noopener noreferrer"&gt;Illuminate&lt;/a&gt; ⬩  &lt;a href="https://www.improbable.io/" rel="noopener noreferrer"&gt;Improbable&lt;/a&gt; ⬩  &lt;a href="https://hendrikbelitz.de/" rel="noopener noreferrer"&gt;Innovation through understanding&lt;/a&gt; ⬩  &lt;a href="https://insurello.se" rel="noopener noreferrer"&gt;Insurello&lt;/a&gt; ⬩  &lt;a href="https://iwantmyname.com/" rel="noopener noreferrer"&gt;iwantmyname&lt;/a&gt; ⬩  &lt;a href="https://jambit.com" rel="noopener noreferrer"&gt;jambit&lt;/a&gt; ⬩  &lt;a href="https://www.jobvite.com/" rel="noopener noreferrer"&gt;Jobvite&lt;/a&gt; ⬩  &lt;a href="http://www.kovnet.nl" rel="noopener noreferrer"&gt;KOVnet&lt;/a&gt; ⬩  &lt;a href="http://kulkul.tech/" rel="noopener noreferrer"&gt;Kulkul&lt;/a&gt; ⬩  &lt;a href="https://logisticallyinc.com" rel="noopener noreferrer"&gt;Logistically&lt;/a&gt; ⬩  &lt;a href="https://de.luko.eu/" rel="noopener noreferrer"&gt;Luko&lt;/a&gt; ⬩  &lt;a href="https://www.metronomics.com/" rel="noopener noreferrer"&gt;Metronome Growth Systems&lt;/a&gt; ⬩  &lt;a href="https://www.microsoft.com" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt; ⬩  &lt;a href="https://www.midwayusa.com/" rel="noopener noreferrer"&gt;MidwayUSA&lt;/a&gt; ⬩  &lt;a href="https://getmimo.com" rel="noopener noreferrer"&gt;Mimo&lt;/a&gt; ⬩  &lt;a href="https://themindgym.com/" rel="noopener noreferrer"&gt;Mind Gym&lt;/a&gt; ⬩  &lt;a href="https://themindgym.com/" rel="noopener noreferrer"&gt;MindGym&lt;/a&gt; ⬩  &lt;a href="https://www.nextdlp.com/" rel="noopener noreferrer"&gt;Next DLP&lt;/a&gt; ⬩  &lt;a href="https://nlx.ai" rel="noopener noreferrer"&gt;NLX&lt;/a&gt; ⬩  &lt;a href="https://www.nomalab.com" rel="noopener noreferrer"&gt;Nomalab&lt;/a&gt; ⬩  &lt;a href="https://nomiadherence.com/" rel="noopener noreferrer"&gt;Nomi&lt;/a&gt; ⬩  &lt;a href="https://www.noredink.com/" rel="noopener noreferrer"&gt;NoRedInk&lt;/a&gt; ⬩  &lt;a href="https://novabench.com/" rel="noopener noreferrer"&gt;Novabench&lt;/a&gt; ⬩  &lt;a href="https://www.nzherald.co.nz/" rel="noopener noreferrer"&gt;NZ Herald&lt;/a&gt; ⬩  &lt;a href="https://permutive.com/" rel="noopener noreferrer"&gt;Permutive&lt;/a&gt; ⬩  &lt;a href="https://phrase.com/lp/translation-management-system/" rel="noopener noreferrer"&gt;Phrase&lt;/a&gt; ⬩  &lt;a href="https://www.gopinata.com/" rel="noopener noreferrer"&gt;PINATA&lt;/a&gt; ⬩  &lt;a href="http://www.pinmeto.com" rel="noopener noreferrer"&gt;PinMeTo&lt;/a&gt; ⬩  &lt;a href="https://www.pivotaltracker.com/" rel="noopener noreferrer"&gt;Pivotal Tracker&lt;/a&gt; ⬩  &lt;a href="https://www.powerreviews.com/" rel="noopener noreferrer"&gt;PowerReviews&lt;/a&gt; ⬩  &lt;a href="https://practle.io/" rel="noopener noreferrer"&gt;Practle&lt;/a&gt; ⬩  &lt;a href="https://www.prima.it/" rel="noopener noreferrer"&gt;Prima&lt;/a&gt; ⬩  &lt;a href="https://global.rakuten.com/corp/" rel="noopener noreferrer"&gt;Rakuten&lt;/a&gt; ⬩  &lt;a href="https://roompact.com/" rel="noopener noreferrer"&gt;Roompact&lt;/a&gt; ⬩  &lt;a href="https://savr.com/" rel="noopener noreferrer"&gt;SAVR&lt;/a&gt; ⬩  &lt;a href="https://scoville.jp/" rel="noopener noreferrer"&gt;Scoville&lt;/a&gt; ⬩  &lt;a href="https://scrive.com" rel="noopener noreferrer"&gt;Scrive&lt;/a&gt; ⬩  &lt;a href="https://www.scrivito.com/" rel="noopener noreferrer"&gt;Scrivito&lt;/a&gt; ⬩  &lt;a href="https://www.serenytics.com/" rel="noopener noreferrer"&gt;Serenytics&lt;/a&gt; ⬩  &lt;a href="https://www.smallbrooks.com" rel="noopener noreferrer"&gt;Smallbrooks&lt;/a&gt; ⬩  &lt;a href="https://snapview.net" rel="noopener noreferrer"&gt;Snapview&lt;/a&gt; ⬩  &lt;a href="https://www.sopost.com/" rel="noopener noreferrer"&gt;SoPost&lt;/a&gt; ⬩  &lt;a href="https://www.splinkns.com/" rel="noopener noreferrer"&gt;Splink&lt;/a&gt; ⬩  &lt;a href="https://spottt.fr/" rel="noopener noreferrer"&gt;Spottt&lt;/a&gt; ⬩  &lt;a href="https://www.stax.io/" rel="noopener noreferrer"&gt;Stax&lt;/a&gt; ⬩  &lt;a href="https://www.stowga.com" rel="noopener noreferrer"&gt;Stowga&lt;/a&gt; ⬩  &lt;a href="https://structionsite.com/" rel="noopener noreferrer"&gt;StructionSite&lt;/a&gt; ⬩  &lt;a href="https://for-school.studyplus.co.jp/" rel="noopener noreferrer"&gt;Studyplus For School&lt;/a&gt; ⬩  &lt;a href="https://www.symbaloo.com" rel="noopener noreferrer"&gt;Symbaloo&lt;/a&gt; ⬩  &lt;a href="https://www.talend.com/" rel="noopener noreferrer"&gt;Talend&lt;/a&gt; ⬩  &lt;a href="https://www.tallink.com/" rel="noopener noreferrer"&gt;Tallink &amp;amp; Silja Line&lt;/a&gt; ⬩  &lt;a href="http://testdouble.com" rel="noopener noreferrer"&gt;Test Double&lt;/a&gt; ⬩  &lt;a href="https://thoughtbot.com/services/elm" rel="noopener noreferrer"&gt;thoughtbot&lt;/a&gt; ⬩  &lt;a href="https://www.travelperk.com/" rel="noopener noreferrer"&gt;Travel Perk&lt;/a&gt; ⬩  &lt;a href="https://truqu.com/" rel="noopener noreferrer"&gt;TruQu&lt;/a&gt; ⬩  &lt;a href="https://twave.io/" rel="noopener noreferrer"&gt;TWave&lt;/a&gt; ⬩  &lt;a href="https://www.tylertech.com/" rel="noopener noreferrer"&gt;Tyler&lt;/a&gt; ⬩  &lt;a href="https://www.uncover.co/" rel="noopener noreferrer"&gt;Uncover&lt;/a&gt; ⬩  &lt;a href="https://www.unisonweb.org/" rel="noopener noreferrer"&gt;Unison&lt;/a&gt; ⬩  &lt;a href="https://veeva.com/" rel="noopener noreferrer"&gt;Veeva&lt;/a&gt; ⬩  &lt;a href="https://www.vendr.com/" rel="noopener noreferrer"&gt;Vendr&lt;/a&gt; ⬩  &lt;a href="https://verityplatform.com/" rel="noopener noreferrer"&gt;Verity&lt;/a&gt; ⬩  &lt;a href="https://www.vnator.tech/" rel="noopener noreferrer"&gt;Vnator&lt;/a&gt; ⬩  &lt;a href="https://www.vy.no/" rel="noopener noreferrer"&gt;Vy&lt;/a&gt; ⬩  &lt;a href="https://www.ww-ag.com/de/ww-interaction-solutions" rel="noopener noreferrer"&gt;W&amp;amp;W Interaction Solutions&lt;/a&gt; ⬩  &lt;a href="https://www.watermarkinsights.com/" rel="noopener noreferrer"&gt;Watermark&lt;/a&gt; ⬩  &lt;a href="https://webbhuset.se" rel="noopener noreferrer"&gt;Webbhuset&lt;/a&gt; ⬩  &lt;a href="https://www.wejoinin.com" rel="noopener noreferrer"&gt;Wejoinin&lt;/a&gt; ⬩  &lt;a href="https://zalora.com/" rel="noopener noreferrer"&gt;Zalora&lt;/a&gt; ⬩  &lt;a href="https://zeit.io" rel="noopener noreferrer"&gt;ZEIT.IO&lt;/a&gt; ⬩  &lt;a href="https://www.zettle.com" rel="noopener noreferrer"&gt;Zettle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This list is extracted from several sources, such as &lt;a href="https://github.com/jah2488/elm-companies" rel="noopener noreferrer"&gt;elm-companies&lt;/a&gt;, &lt;a href="https://stackshare.io/elm" rel="noopener noreferrer"&gt;Stackshare.io&lt;/a&gt;, blog posts, videos, talks, atc.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;This is all. See you in 2024!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❤️&lt;/p&gt;

</description>
      <category>elm</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>The TypeScript Experience</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Sun, 10 Apr 2022 22:43:09 +0000</pubDate>
      <link>https://dev.to/lucamug/the-typescript-experience-3m3o</link>
      <guid>https://dev.to/lucamug/the-typescript-experience-3m3o</guid>
      <description>&lt;p&gt;A few days ago I read a &lt;a href="https://twitter.com/jsjoeio/status/1511759156512006148" rel="noopener noreferrer"&gt;thread&lt;/a&gt; on Twitter where the author asked "Why wouldn’t you use TypeScript?" to people that wouldn't use TypeScript.&lt;/p&gt;

&lt;p&gt;Reading through the answers, the perceptions of TypeScript among people that wouldn't use it are that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is intimidating&lt;/li&gt;
&lt;li&gt;It is an overhead&lt;/li&gt;
&lt;li&gt;It makes it tedious to write code&lt;/li&gt;
&lt;li&gt;It makes it harder to read code&lt;/li&gt;
&lt;li&gt;It slows down development&lt;/li&gt;
&lt;li&gt;It doesn't protect from runtime errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These seem not direct critiques of static typing in general, but rather a consequence of the specific &lt;a href="https://blog.logrocket.com/is-typescript-worth-it/" rel="noopener noreferrer"&gt;unsound static type system&lt;/a&gt; implemented in TypeScript, that similarly to Flow, is based on &lt;a href="https://twitter.com/javierwchavarri/status/1082597156727476226" rel="noopener noreferrer"&gt;structural subtyping&lt;/a&gt;. This means that TypeScript’s type system &lt;a href="https://www.typescriptlang.org/docs/handbook/type-compatibility.html#a-note-on-soundness" rel="noopener noreferrer"&gt;allows certain operations&lt;/a&gt; that can’t be known at compile-time to be safe, type inference might be not correct, and it requires some level of manually-written type annotations.&lt;/p&gt;

&lt;p&gt;In contrast, other languages like Rust, Haskell, OCaml, Elm, and F# have a sound type systems, like the HMTS (&lt;a href="https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system" rel="noopener noreferrer"&gt;Hindley–Milner Type System&lt;/a&gt;), that do not require type annotations, and the types are always inferred correctly. These type-systems make sure that the code will not generate type errors at runtime. Moreover, together with other design choices, like making errors explicit in the type system ("Maybe", "Either", etc.), languages that use sound type-system are able to detect other families of runtime errors at compile time.&lt;/p&gt;

&lt;p&gt;This is a topic already discussed at length but I wonder if there are some new perspectives.&lt;/p&gt;

&lt;h1&gt;
  
  
  My questions
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Are these answers reflecting a significant reality or are they just the complaints of a small minority?&lt;/li&gt;
&lt;li&gt;If the unsatisfaction is relatively common, is it correlated to the &lt;a href="https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals" rel="noopener noreferrer"&gt;TypeScript's unsoundness&lt;/a&gt;, as explained above or the &lt;a href="https://effectivetypescript.com/2021/05/06/unsoundness/" rel="noopener noreferrer"&gt;unsoundness is not an issue after all&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Can TypeScript &lt;a href="https://github.com/Microsoft/TypeScript/issues/9825" rel="noopener noreferrer"&gt;be improved&lt;/a&gt; in this respect? Or, in broader terms, can a &lt;a href="https://hegel.js.org/" rel="noopener noreferrer"&gt;superset of JavaScript support a sound type system&lt;/a&gt; without becoming &lt;a href="https://github.com/Microsoft/TypeScript/issues/9825#issuecomment-234115900" rel="noopener noreferrer"&gt;overly complicated&lt;/a&gt;? &lt;/li&gt;
&lt;li&gt;Or maybe a sound type system can &lt;a href="https://github.com/sinelaw/infernu" rel="noopener noreferrer"&gt;only be achieved&lt;/a&gt; either by &lt;a href="https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.121.8387&amp;amp;rep=rep1&amp;amp;type=pdf" rel="noopener noreferrer"&gt;limiting JavaScript&lt;/a&gt; or with a different language that compiles to JavaScript?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know what you think in the comment section below ❤️&lt;/p&gt;




&lt;h3&gt;
  
  
  Appendix - Curated overview of the Twitter thread
&lt;/h3&gt;

&lt;h3&gt;
  
  
  • Question
&lt;/h3&gt;

&lt;p&gt;Looking to hear from folks who wouldn’t use TypeScript. Why wouldn’t you?&lt;/p&gt;

&lt;h3&gt;
  
  
  • Answers
&lt;/h3&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;In my day job, I have to use Typescript. In my projects, I refuse.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tedious writing types which 99% of the time are completely unnecessary, but required by the TypeScript compiler&lt;/li&gt;
&lt;li&gt;Does not catch bugs&lt;/li&gt;
&lt;li&gt;Reading code becomes much harder&lt;/li&gt;
&lt;li&gt;Still needs runtime checks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;Because the type system is unsound and it seems to be way more complex and magical than what I would want from my type system.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;I spoke to a few. Found 2 types: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just starting and intimidated by the wave of red&lt;/li&gt;
&lt;li&gt;Experienced enough to avoid the common JavaScript pitfalls and did not get the aha moment from TypeScript&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;Because TypeScript slows down the development of greenfield projects. It's a tool that benefits for a certain scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;Part of it was that the flexibility of JavaScript is one of its core strengths so by removing the flexibility you're removing something good.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;TypeScript is very useful and I find it invaluable in my day job, but it can be overkill for very small and one-off things. For other projects, there are other strongly typed compile-to-JS languages with more attractive type systems that are sometimes suitable.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;I'm not sure if the overhead of TypeScript is enough to justify type issues in JavaScript. Maybe in huge projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;I have tried it but had lots of problems with it. Also because some of my functions return values of different types depending on the situation. In the end, I don't get enough benefit from it. Type safety is nice to have, but I think I prefer the flexibility of JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;It's hard to use a bad type system when you've used good ones in the past.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;I'm using it on my current project because stability is increasingly important, I wanted an excuse to learn a new thing and not get left behind, and I've been wrong before about new tools so I figured I'd give it a shot. But overall it's cost me more time than it's saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bloat (readability perhaps being the most important aspect of code) &lt;/li&gt;
&lt;li&gt;Need to safeguard stuff for the runtime regardless of whatever "guarantees" I’ve gotten ahead of that time&lt;/li&gt;
&lt;li&gt;Further from the metal&lt;/li&gt;
&lt;li&gt;More tooling to know and maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;It slowdowns development time if you aren't used to it already. I've spent days working on things trying to type them while writing the code that could have been done in a single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;From a huge supporter of TypeScript: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compile times can increase if not incremental builds or static type checking&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/softwarefloyd/status/1512630546853208070" rel="noopener noreferrer"&gt;"Clever" devs abusing it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No &lt;em&gt;real&lt;/em&gt; guarantees, just assurances&lt;/li&gt;
&lt;li&gt;A lot more code to manage&lt;/li&gt;
&lt;li&gt;Some libraries have less than desirable type definitions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;Heavy, a bit slower, and overkill for most projects. We spend a lot of time researching good libraries to avoid writing too much code by ourselves - then why use TypeScript and write all that (mostly unnecessary) code. And most importantly - doesn't catch all bugs (not even close)!&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Too much time spent pleasing the type system. &lt;/li&gt;
&lt;li&gt;Too many different configurations. &lt;/li&gt;
&lt;li&gt;I don't need to have a step before running JavaScript code on Node.js, why would I add one? &lt;/li&gt;
&lt;li&gt;No runtime-type checking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;I’ve spent more time fighting missing/broken type definitions in 3rd party libs than I care to admit.&lt;br&gt;
For this reason, I won’t ever choose TS again.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;Cost to Benefit ratio is too high for some projects: &lt;/p&gt;

&lt;p&gt;Benefit:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's good to know the type of function argument (Especially for libraries)
&lt;/li&gt;
&lt;li&gt;Intellisense&lt;/li&gt;
&lt;li&gt;Knowing error before runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's another skill to learn. TypeScript is huge&lt;/li&gt;
&lt;li&gt;It has flavors. I have seen Array or string[]&lt;/li&gt;
&lt;li&gt;TSConfig is another pain&lt;/li&gt;
&lt;li&gt;Types can be too complex, why can't it just be a mix of primitives&lt;/li&gt;
&lt;li&gt;The errors are overwhelming. I use eslint, it only warns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;We wrote enough Java in our careers.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The syntax can get verbose and unreadable&lt;/li&gt;
&lt;li&gt;Everything (build, test, IDE) is slower&lt;/li&gt;
&lt;li&gt;Not enough libraries come with types&lt;/li&gt;
&lt;li&gt;Sometimes spend an hour just to appease the type system &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s coming from someone (me) who is using TS on all their projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬
&lt;/h2&gt;

&lt;p&gt;TypeScript has to sacrifice too much to stay JS compatible. JS does not give a good dev UX by modern standards and TS does not give you a step change improvement. Try Elm!&lt;/p&gt;




&lt;p&gt;For more answers, check the original &lt;a href="https://twitter.com/jsjoeio/status/1511759156512006148" rel="noopener noreferrer"&gt;Twitter thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Header illustration derived from &lt;a href="https://www.freepik.com/free-vector/mixed-emoji-set_4159931.htm" rel="noopener noreferrer"&gt;Like emoji vector created by rawpixel.com - www.freepik.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;🔴 Does any of these answers resonate with you and your experience❓&lt;/p&gt;

&lt;p&gt;🔴 Do you think there is something that can be done to change the TypeScript experience, especially when compared with languages that use a sound type system❓&lt;/p&gt;

&lt;p&gt;Let me know in the comments section below&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Differences between TypeScript and Elm</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Mon, 07 Feb 2022 07:45:59 +0000</pubDate>
      <link>https://dev.to/lucamug/typescript-and-elm-3g38</link>
      <guid>https://dev.to/lucamug/typescript-and-elm-3g38</guid>
      <description>&lt;p&gt;Several times I have been asked about the differences between TypeScript and Elm. This is an attempt at listing down these differences, mainly from the perspective of the two different type systems.&lt;/p&gt;

&lt;p&gt;Let's start with a quick introduction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; is, in case you have been living under a rock for the last 5 years, a superset of JavaScript that adds optional static typing to it. "Superset" means that all legal JavaScript programs are also legal TypeScript programs, so TypeScript doesn’t fix anything in JavaScript but adds type checking at compile time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; is a purely functional language that compiles to JavaScript. Elm is not only a language but it is also a framework in the sense that includes a way for building web applications ("&lt;a href="https://guide.elm-lang.org/architecture/" rel="noopener noreferrer"&gt;The Elm Architecture&lt;/a&gt;") so it is more like the sum of TypeScript, React, and Redux combined.&lt;/p&gt;

&lt;p&gt;Here we go...&lt;/p&gt;

&lt;h1&gt;
  
  
  Soundness
&lt;/h1&gt;

&lt;p&gt;One of the definitions of "soundness" is the ability of a type checker to catch every single error that might happen at runtime.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;'s type system is not sound, by design. "&lt;a href="https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals" rel="noopener noreferrer"&gt;A sound or 'provably correct' type system is not a goal of TypeScript.&lt;/a&gt;"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s type system is sound and it infers all types. It uses the &lt;a href="https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system" rel="noopener noreferrer"&gt;Hindley-Milner type system&lt;/a&gt; that is complete and able to infer the most general type of a given program without programmer-supplied type annotations or other hints.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is &lt;a href="https://github.com/Microsoft/TypeScript/issues/9825" rel="noopener noreferrer"&gt;some discussion&lt;/a&gt; about the feasibility of making TypeScript, or any superset of JavaScript for that matter, a sound type system. See &lt;a href="https://hegel.js.org/" rel="noopener noreferrer"&gt;Hegel&lt;/a&gt; for an example attempt in such direction.&lt;/p&gt;

&lt;p&gt;Other attempts have been done, but required to define a subset (the opposite of a superset) of JavaScript to be able to reach a sound type system. In the paper "&lt;a href="https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.121.8387&amp;amp;rep=rep1&amp;amp;type=pdf" rel="noopener noreferrer"&gt;Type Inference for JavaScript&lt;/a&gt;", the author provides a static type system that can cope with dynamic features such as member addition, while providing the usual safety guarantees. To achieve that, the author creates a language that is "a realistic subset of JavaScript, but manageable with respect to formalization and static typing. [...] It is better to have a sound system, even with its restrictions, than a half attempt that gives no real guarantees."&lt;/p&gt;

&lt;h1&gt;
  
  
  Type inference
&lt;/h1&gt;

&lt;p&gt;Type inference is the mechanism used by the compiler to guess the type of a function without the need of the developer to describe it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In &lt;strong&gt;TypeScript&lt;/strong&gt; some design patterns make it difficult for types to be inferred automatically (for example, patterns that use dynamic programming). Dependencies or functions like &lt;code&gt;JSON.parse()&lt;/code&gt; can return &lt;code&gt;any&lt;/code&gt;, having the effect of turning off the type checker and the inference engine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s type inference is always correct and covers the entirety of the code, including all dependencies (external Elm packages). Elm doesn't have the concept of &lt;code&gt;any&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Enforced type checking (escape hatches)
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; uses implicit and explicit &lt;code&gt;any&lt;/code&gt; as an escape hatch from the type checking. Is possible to reduce these escape hatches by configuring TypeScript with &lt;code&gt;no-explicit-any&lt;/code&gt;. This can still be overwritten with &lt;code&gt;eslint-disable-next-line @typescript-eslint/ban-ts-comment, @ts-ignore: Unreachable code error&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; does not have escape hatches, the code compiles only if all types are correct.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  JSON safety
&lt;/h1&gt;

&lt;p&gt;Applications often deal with data coming from sources out of their control, usually over a network. Several things can make this data different from what we expect and this can harm our applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;'s &lt;code&gt;JSON.parse()&lt;/code&gt; returns &lt;code&gt;any&lt;/code&gt;. This means that part of the code has now escaped the control of the type checker. There are other libraries, such as &lt;code&gt;io-ts&lt;/code&gt;, &lt;code&gt;zod&lt;/code&gt;, &lt;code&gt;ajv&lt;/code&gt;, &lt;code&gt;runtypes&lt;/code&gt; that can support the checking of JSON data. &lt;code&gt;JSON.stringify()&lt;/code&gt; also can generate exceptions, when used with BigInts, for example.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; uses decoders and encoders when dealing with JSON data, forcing the developer to take care of all possible edge cases (for example, an invalid JSON structure, a missing key, or a value with a wrong type).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Protection from runtime exceptions
&lt;/h1&gt;

&lt;p&gt;Runtime exceptions are errors happening in the browser when the JavaScript code tries to do an illegal operation, such as calling a method that doesn't exist or referencing a property of an undefined value. Most of these errors can be avoided with the support of a strict type system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; mitigates the problem but runtime exceptions can still happen. “Mutation by reference” is one of the cases that can generate runtime exceptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s sound type system together with other design choices guarantees no runtime exceptions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;null&lt;/code&gt; references, also called "The Billion Dollar Mistake" by its creator, are the cause of all sorts of problems. Together with &lt;code&gt;undefined&lt;/code&gt;, they are the culprit of a large chunk of bugs and crashes in applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; mitigates the issue with the &lt;code&gt;strictNullChecks&lt;/code&gt; flag. When it is set to &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; have their distinct types and you’ll get a type error if you try to use them where a concrete value is expected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; does not have either &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;. Elm leverages the type system in case of missing values, with the types &lt;code&gt;Maybe&lt;/code&gt; (called &lt;code&gt;Option&lt;/code&gt; in other languages) and &lt;code&gt;Result&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Error handling
&lt;/h1&gt;

&lt;p&gt;Many things can go wrong during the execution of an application. The handling of these errors has a direct impact on the quality of the UX. Is the application just going to crash or is it giving informative feedback to the user? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;'s error handling is based on the concept of throwing errors and using &lt;code&gt;try/catch&lt;/code&gt; statements to intercept them. Developers have the responsibility to understand where things can go wrong and cover all possible cases. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; handles errors leveraging the type system with the types &lt;code&gt;Maybe&lt;/code&gt; and &lt;code&gt;Result&lt;/code&gt;. There is no concept of throwing exceptions in Elm, so the &lt;code&gt;try/catch&lt;/code&gt; statement doesn't exist. All places where things can go wrong are explicit, highlighted by the compiler.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pattern matching
&lt;/h1&gt;

&lt;p&gt;Pattern matching is an expressive way of checking if a value matches certain patterns. Proper pattern matching also provides compile-time exhaustiveness guarantees, meaning that we won’t accidentally forget to check for a possible case.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; does not support pattern matching. It can support "exhaustiveness" with switch statements under certain conditions (flag &lt;code&gt;switch-exhaustiveness-check&lt;/code&gt; activation use of &lt;code&gt;assertNever&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s support pattern matching (with the &lt;code&gt;case...of&lt;/code&gt; syntax). Elm's pattern matching always applies exhaustiveness.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Error messages
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;'s errors are good, especially for basic errors. They also suggest correct possible fixes. They can become less clear when the types get more complicated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s errors tend to pinpoint the exact location of the problem, especially if the code contains type annotations, and usually provide a well-balanced context and good advice about fixing the issue. Elm's errors have been taken into &lt;a href="https://elm-lang.org/news/compiler-errors-for-humans" rel="noopener noreferrer"&gt;special consideration&lt;/a&gt;. They are considered the gold standard in their category and have been an inspiration for error messages in other languages, like Rust and Scala.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Opaque types
&lt;/h1&gt;

&lt;p&gt;Sometimes is convenient to hide the internal implementation details of a custom type so that the library is decoupled from the code that uses it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;'s support for this feature is still unclear to me. Maybe private/public class attributes or methods can support it? Or maybe "branded types"? More info &lt;a href="https://incrementalelm.com/opaque-types-let-you-think-locally/" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://evertpot.com/opaque-ts-types/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s support private modules so creating an opaque type is done exposing the type but not the type constructor as explained &lt;a href="https://ckoster22.medium.com/advanced-types-in-elm-opaque-types-ec5ec3b84ed2" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Type annotations
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;, wherever possible, tries to automatically infer the types in your code. If the inference fails or is wrong, it is necessary to add type annotations manually. Type annotations are mixed with the code, at the beginning of the function definition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; never needs type annotations, the compiler can infer all the types all the time. Type annotations are separated from the code, they stay on a separated line, above the function definition. Even if optional, it is considered good practice to add type signature as this improves the readability of the code and also makes the compiler errors more precise.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Complexity and Learnability
&lt;/h1&gt;

&lt;p&gt;Complexity directly impacts the time to learn new technologies and also the productivity of developers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; is a superset of JavaScript so if you are familiar with JavaScript, it is simple to start using it. But mastering it is something different. TypeScript has an overly complicated typing system. This isn’t strictly a disadvantage of TypeScript, though, but rather a downside that stems from it being fully interoperable with JavaScript, which itself leaves even more room for complications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; is a different language from JavaScript so starting with it, if you are coming from JavaScript, present an initial steeper learning curve. The type system is relatively simple so it is simple to master it. The Elm type system is rooted in two main concepts: custom types and type aliases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's expand a bit on this, as I think is an important concept. The Elm type system is based on a small set of primitives, mainly &lt;strong&gt;Custom Types&lt;/strong&gt; and &lt;strong&gt;Type Aliases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, there is one way to enumerate the possible values of a type in Elm, using Custom Types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;ButtonStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;HIDDEN&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;ENABLED&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;DISABLED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While in TypeScript it can be done in three (and possibly more) ways:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// With string enums&lt;/span&gt;
&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;ButtonStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;HIDDEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIDDEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ENABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENABLED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;DISABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DISABLED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// With union types of string literals&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ButtonStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIDDEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENABLED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DISABLED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Using the "const" assertions &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ButtonStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;HIDDEN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIDDEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ENABLED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENABLED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;DISABLED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DISABLED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each of these approaches has its pros and cons.&lt;/p&gt;

&lt;p&gt;The difference here is that Elm is more on the side of, similarly to the Python Zen, that "there should be one - and preferably only one - obvious way to do it".&lt;/p&gt;

&lt;p&gt;On the other side, TypeScript gives multiple options that may confuse beginners ("Which type should I use?") but  can bring more flexibility to experienced developers.&lt;/p&gt;

&lt;h1&gt;
  
  
  Adoption
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; is widely adopted. It took off thanks to Angular support in 2015 when Google decided Angular 2 would be built using TypeScript. Since then, most of the other mainstream frameworks based on the JavaScript language started supporting it. Being a superset of JavaScript makes it relatively simple to add it to an already existing JavaScript project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; has a smaller adoption. Compared to JavaScript, it is a different language with a different syntax and a different paradigm (Functional instead of Object-Oriented). So it requires a larger effort to convert existing projects and a mindset shift in developers to adopt it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Configurability
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; has around 80 options that can be turned on or off. This can be helpful when upgrading a JavaScript project where strictness can be increased gradually. It may also create differences in code when compiled with different settings. In this case, code may refuse to compile and is it necessary to either change the TypeScript configuration or to adjust the code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; doesn't have any option related to the strictness of the compiler. It supports two settings related to the type of outputted code: With or without the debugger, and optimized or not optimized, for a production-grade build.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Third-party libraries - Protection from changes
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When using &lt;strong&gt;TypeScript&lt;/strong&gt;, updating libraries from NPM does not guarantee the absence of breaking changes (the progression of versions is not checked by NPM), or the introduction of errors in the type annotations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; support two layers of protection. First, it enforces semantic versioning to published Elm packages. This means that the version of a package is decided by the Elm Package Manager and not by the author of the package. This guarantees that updating the libraries cannot break our code. Second, all libraries are type-checked the same as our code, so if the code compiles, it means that all types are correct and a library cannot start having side effects, like harvesting bitcoins as it happened in the &lt;a href="https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident.html" rel="noopener noreferrer"&gt;event-stream incident&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Third-party libraries - Type checking coverage
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; does not require all the dependencies to be written using TypeScript. Also, the quality of type annotations in the dependencies may vary. As &lt;a class="mentioned-user" href="https://dev.to/derrickbeining"&gt;@derrickbeining&lt;/a&gt; &lt;a href="https://twitter.com/derrickbeining/status/1491826746697650183" rel="noopener noreferrer"&gt;put it&lt;/a&gt;: "nearly every open source library with type declarations (if they even have any) were written by someone who seems to have only a cursory understanding of what the type system can do."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s dependencies are all written 100% in Elm, so there are no holes in the type system. Types are correct across boundaries, keeping all guarantees intact, regardless of which library we import in your codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Immutability
&lt;/h1&gt;

&lt;p&gt;Immutability is when a variable (or object) cannot change its state or value, once it has been created.&lt;/p&gt;

&lt;p&gt;Immutability has several benefits, like the absence of side effects, thread-safe, resilient against null reference errors, ease of caching, support for referential transparency, etc.&lt;/p&gt;

&lt;p&gt;Immutability may also have issues, like impacting negatively on the performances of the system. These issues can be alleviated or &lt;a href="https://www.youtube.com/watch?v=vzfy4EKwG_Y" rel="noopener noreferrer"&gt;completely removed&lt;/a&gt; with proper strategies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; doesn't support real immutable data structures. In JavaScript, mutability is the default, although it allows variable declarations with "const" to declare that the reference is immutable. But the referent is still mutable. TypeScript additionally has a &lt;code&gt;readonly&lt;/code&gt; modifier for properties but it is still not a guarantee of real immutability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s data is fully immutable, by design. Including also in all the dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Purity
&lt;/h1&gt;

&lt;p&gt;Purity means that the type system can detect and enforce if a function is pure, meaning that the same input provides the same output and it doesn't have any side effects. Pure functions are easier to read and reason about because they only depend on what is in the function or other pure dependencies. Are easier to move around, simpler to test, and has other desirable characteristics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; can enforce some attributes of pure functions but cannot detect or enforce purity. There is a proposal about adding a "pure" keyword that is under discussion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; code is all pure, by design. Including all the dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The type system "in the way"
&lt;/h1&gt;

&lt;p&gt;Sometimes developers feel that the type checking is an obstacle rather than a support.&lt;/p&gt;

&lt;p&gt;I think several factors can be the causes of this feeling.&lt;/p&gt;

&lt;p&gt;It may come, for example, from a negative experience with other languages that required a vast amount of type annotations (Java?, C++?).&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;TypeScript&lt;/strong&gt; sometimes there are situations where the application is working but at the same, time the type checker is reporting that the types are incorrect or some type annotation is missing.&lt;/p&gt;

&lt;p&gt;Especially coming from JavaScript, this situation can be frustrating as JavaScript always tries its best to not complain also when types are not correct.&lt;/p&gt;

&lt;p&gt;Also sometimes the errors reported by TypeScript may not be clear enough to lead toward a resolution in a short time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; can also give the feeling of being in the way, especially to a novice that needs to deal with a new paradigm, a new syntax, and a new type system. While I was learning Elm, I was arrogantly blaming some bug in the Elm compiler when I was getting some type error, because I was confident that my types were correct. After being proved wrong over and over I now take a more humble approach when I get these types of errors.&lt;/p&gt;

&lt;p&gt;Compared to TypeScript, Elm will never require to add type annotations, as these are fully optional and the errors of the Elm compiler are always indicative of a real type mismatch. There are no false positives and the &lt;a href="https://elm-lang.org/news/compilers-as-assistants" rel="noopener noreferrer"&gt;error messages are usually clear enough to lead to a quick fix&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Compiler performance
&lt;/h1&gt;

&lt;p&gt;The time needed for the compiler to finish its work is important for a good developer experience. A short time from saving a file to seeing a web application changing on the screen allows for fast and comfortable development.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I could not find a precise benchmark for the performance of TypeScript. From anecdotal experiences, like the one of the &lt;a href="https://startfunction.com/deno-will-stop-using-typescript/" rel="noopener noreferrer"&gt;Deno development team that stopped using TypeScript&lt;/a&gt; because it was taking "several minutes" to compile and some &lt;a href="https://dev.to/alekseiberezkin/typescript-is-slow-what-can-we-do-about-it-30hm"&gt;other posts&lt;/a&gt; it seems that TypeScript has some room for improvement in this field. Let me know if you have any hard data to add to this section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elm compiler performance was &lt;a href="https://github.com/evancz/elm-project-survey/issues" rel="noopener noreferrer"&gt;measured after the release of version 0.19&lt;/a&gt; that contained &lt;a href="https://github.com/elm/compiler/blob/master/docs/upgrade-instructions/0.19.0.md#compiler-performance" rel="noopener noreferrer"&gt;several performance improvements&lt;/a&gt;. The expected approximate times for 50,000 lines of Elm code are 3 seconds for a build from scratch and 0.4 seconds for an incremental build. The actual compile time for the incremental build is around 100 milliseconds. The other 300 milliseconds are used to write the output to a file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  JavaScript Interoperability
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; code can call JavaScript functions directly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; has &lt;a href="https://guide.elm-lang.org/interop/" rel="noopener noreferrer"&gt;three mechanisms&lt;/a&gt; to interact with JavaScript: &lt;a href="https://github.com/elm-community/js-integration-examples/" rel="noopener noreferrer"&gt;Flags, Ports, and Custom Elements&lt;/a&gt;. The lack of a Foreign Function Interface (FFI) is a tradeoff that Elm makes in &lt;a href="https://guide.elm-lang.org/interop/limits.html" rel="noopener noreferrer"&gt;exchange for several benefits&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Feature completeness
&lt;/h1&gt;

&lt;p&gt;As a matter of what type of features are on both sides, there is a lot of overlapping. Sometimes things are easier to be expressed on one side, sometimes are easier to express on the other side. For example&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating types from data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; can create types from data, using the &lt;code&gt;typeof&lt;/code&gt; operator (note that JavaScript also has &lt;code&gt;typeof&lt;/code&gt; but it has a different meaning). For example &lt;code&gt;let n: typeof s&lt;/code&gt; means that &lt;code&gt;n&lt;/code&gt; and &lt;code&gt;s&lt;/code&gt; will be of the same type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; doesn't have the analog of &lt;code&gt;typeof&lt;/code&gt;. Elm requires you to declare the type first, and after associate it to both &lt;code&gt;n&lt;/code&gt; and &lt;code&gt;s&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Custom type differentiation
&lt;/h3&gt;

&lt;p&gt;When we create our types, is good to be confident that certain values belong to these newly created types&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; requires boilerplate that add checks at runtime (User-Defined Type Guards), For example
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isFish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Fish&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;Fish&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Fish&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;swim&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isFish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;swim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Elm&lt;/strong&gt;'s custom types are differentiated by the compiler at all times.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;
    &lt;span class="kt"&gt;Fish&lt;/span&gt; &lt;span class="n"&gt;fish&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;swim&lt;/span&gt;
    &lt;span class="kt"&gt;Bird&lt;/span&gt; &lt;span class="n"&gt;bird&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bird&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Enums iterability and conversion to string
&lt;/h1&gt;

&lt;p&gt;Sometimes is useful to iterate across all members of an enumerated type, or convert members to string.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; has three types that can be used as Enums: "enums", "const enums", and "literal types". Some of these can convert automatically to string. In the other cases, the conversion needs to be done manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt;'s Custom Types (used to create Enums) cannot automatically be iterated or converted to a string. These two operations need to be either done manually, through a code-generating tool, or with the static code analyzer &lt;code&gt;elm-review&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Some alternatives
&lt;/h1&gt;

&lt;p&gt;Let's see what are other alternatives separated by the two categories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An alternative to &lt;strong&gt;TypeScript&lt;/strong&gt; can be &lt;a href="https://flow.org/" rel="noopener noreferrer"&gt;Flow&lt;/a&gt;, a library maintained by Facebook. Flow, similarly to TypeScript, is &lt;a href="https://github.com/facebook/flow/blob/c93897cd9d6ac6db703c8b9f0536f440a03d54f4/website/en/docs/lang/types-and-expressions.md#soundness-and-completeness-" rel="noopener noreferrer"&gt;not a sound type system&lt;/a&gt;. "Flow tries to be as sound and complete as possible. But because JavaScript was not designed around a type system, Flow sometimes has to make a tradeoff". Another alternative is &lt;a href="https://hegel.js.org/" rel="noopener noreferrer"&gt;Hegel&lt;/a&gt;, a type system that "&lt;a href="https://hegel.js.org/docs#disadvantages-1" rel="noopener noreferrer"&gt;attempts&lt;/a&gt;" to be sound. It is unclear to me if the attempt succeeded or not but it is worth checking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alternative to &lt;strong&gt;Elm&lt;/strong&gt; can be &lt;a href="https://www.purescript.org/" rel="noopener noreferrer"&gt;PureScript&lt;/a&gt;, &lt;a href="https://clojurescript.org/" rel="noopener noreferrer"&gt;ClojureScript&lt;/a&gt;, &lt;a href="https://reasonml.github.io/" rel="noopener noreferrer"&gt;ReasonML&lt;/a&gt;, &lt;a href="https://rescript-lang.org/" rel="noopener noreferrer"&gt;ReScript&lt;/a&gt;, and other &lt;a href="https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS" rel="noopener noreferrer"&gt;languages that compile to JavaScript&lt;/a&gt;. There are also newer and interesting languages that are still in an explorative state like &lt;a href="https://ren-lang.github.io/" rel="noopener noreferrer"&gt;Ren&lt;/a&gt; or &lt;a href="https://derw-lang.github.io/" rel="noopener noreferrer"&gt;Derw&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusions
&lt;/h1&gt;

&lt;p&gt;These are two remarkable pieces of technology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; is a powerful tool that helps to deal with the idiosyncrasies of JavaScript, designed to allow you to work seamlessly with a highly dynamic language like JavaScript. Trying to put types on top of a dynamic language is not a pleasant task and some of its characteristics, like not being a complete type system, can be a consequence of this constrain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; is a different language from JavaScript. This allows for a coherent and organic type system that is baked in the language and provides the foundations of the language itself, making it possible to support a complete type system&lt;/p&gt;

&lt;h3&gt;
  
  
  Both languages came to the rescue
&lt;/h3&gt;

&lt;p&gt;Both languages came to the rescue when JavaScript’s rather peculiar runtime semantics, applied to large and complex programs, make development a difficult task to manage at scale.&lt;/p&gt;

&lt;p&gt;TypeScript requires a complex type system to work seamlessly with a highly dynamic language like JavaScript. The effort of fully type-check JavaScript remaining a superset of it seems close to impossible because it requires also considering all JavaScript's quirks and checking all dependencies.&lt;/p&gt;

&lt;p&gt;As expressed in this &lt;a href="https://news.ycombinator.com/item?id=22057260" rel="noopener noreferrer"&gt;comment&lt;/a&gt;: "TypeScript feels worth it until you use something like Elm, then you realize just how lacking TypeScript's type system truly is. [...] That strict dedication to being a superset [of JavaScript] means the type system explodes into ten thousand built-in types that come, seemingly at times, from nowhere, simply to control for the wildness of Javascript. [...] I need to have an encyclopedic knowledge of all these highly-specialized types that are included in the language and are often being used in the background"&lt;/p&gt;

&lt;h3&gt;
  
  
  Different perspective
&lt;/h3&gt;

&lt;p&gt;I noted that the opinions about TypeScript change greatly if developers are coming from JavaScript or if developers are coming from a functional language, like Elm or Haskell. Coming from JavaScript, TypeScript may feel like a major improvement but coming from Elm, it may feel like a cumbersome way to deal with types. Both perspectives have some truth in them and I invite you to try to understand both sides.&lt;/p&gt;

&lt;p&gt;So kudos to the TypeScript engineers that are trying to catch as many issues as possible. If you are building a large application in JavaScript and you cannot afford to change language, I think that TypeScript is improving several aspects of the developer experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stress-free developer experience
&lt;/h3&gt;

&lt;p&gt;But if we can break free from JavaScript, learning Elm can be an enlightening experience, to see how a sound type system built from the ground up can make the difference.&lt;/p&gt;

&lt;p&gt;This is what can make our developer experience to became stress-free, taking away from us most of the burden as a developer. These types of questions that usually we need to carefully answer to build reliable code can disappear.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should I wrap this in a try-catch block because it may crash?&lt;/li&gt;
&lt;li&gt;Can I move this piece of code?&lt;/li&gt;
&lt;li&gt;Can I remove this function?&lt;/li&gt;
&lt;li&gt;Is this function pure?&lt;/li&gt;
&lt;li&gt;Should I check if these parameters are null or undefined?&lt;/li&gt;
&lt;li&gt;Should I check if this method exists before calling it?&lt;/li&gt;
&lt;li&gt;Can I trust this third-party library?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can give us peace of mind and a lot of extra time to think about what we care about.&lt;/p&gt;

&lt;p&gt;❤️&lt;/p&gt;

&lt;h1&gt;
  
  
  Other Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://itnext.io/from-javascript-to-typescript-to-elm-5c36fca70b4a" rel="noopener noreferrer"&gt;From Javascript to Typescript to Elm&lt;/a&gt; by Kevin Lanthier
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ohanhi.com/react-typescript-vs-elm.html" rel="noopener noreferrer"&gt;If you're using React, Redux, and TypeScript, you would be so happy with Elm!&lt;/a&gt; by Ossi Hanhinen&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://incrementalelm.com/typescript-blind-spots/" rel="noopener noreferrer"&gt;TypeScript’s Blind Spots&lt;/a&gt; by Dillon Kearns&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=3n17wHe5wEw" rel="noopener noreferrer"&gt;Functional Programming for Pragmatists&lt;/a&gt; by Richard Feldman&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=jl1tGiUiTtI" rel="noopener noreferrer"&gt;Convergent Evolution&lt;/a&gt; by Evan Czaplicki&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elm-radio.com/episode/ts-and-elm-type-systems/" rel="noopener noreferrer"&gt;Comparing TypeScript and Elm's Type Systems&lt;/a&gt; by Elm Radio&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.codecentric.de/en/2021/01/rescript-compare-typescript-elm/" rel="noopener noreferrer"&gt;ReScript – the language after TypeScript?&lt;/a&gt; by Marco Emrich&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://v4.chriskrycho.com/2017/why-elm-instead-of-typescript.html" rel="noopener noreferrer"&gt;Why Elm Instead of TypeScript?&lt;/a&gt; by Chris Krycho&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://incrementalelm.com/typescript-types-can-do-some-cool-things-that-elm-cant/" rel="noopener noreferrer"&gt;TypeScript Types Can Do Some Cool Things That Elm Can't&lt;/a&gt; by Dillon Kearns&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hasura.io/blog/why-we-chose-typescript-for-hasura-console/" rel="noopener noreferrer"&gt;Why we chose TypeScript for the Hasura Console&lt;/a&gt; by Aleksandra Sikora&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=OXzIZZDq2hE" rel="noopener noreferrer"&gt;Elm in TypeScript, pattern matching and beyond&lt;/a&gt; by Maciej Sikora&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.121.8387&amp;amp;rep=rep1&amp;amp;type=pdf" rel="noopener noreferrer"&gt;Type Inference for JavaScript&lt;/a&gt; by Christopher Lyon Anderson&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ramda/ramda/issues/2976" rel="noopener noreferrer"&gt;Proposal to add first-class TypeScript support to Ramda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://3fx.ch/typing-is-hard.html" rel="noopener noreferrer"&gt;Typing is Hard&lt;/a&gt; by Ben Fiedler&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://www.typescriptlang.org/docs/" rel="noopener noreferrer"&gt;TypeScript Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://guide.elm-lang.org/" rel="noopener noreferrer"&gt;Elm Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❤️ ❤️&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>elm</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Elm vs HyperScript - A Wordle implementation</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Sun, 30 Jan 2022 03:13:33 +0000</pubDate>
      <link>https://dev.to/lucamug/elm-vs-hyperscript-2m3m</link>
      <guid>https://dev.to/lucamug/elm-vs-hyperscript-2m3m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;HyperScript: &lt;a href="https://arhamjain.com/hyperwordle/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;, The source code is in the HTML Page Source.&lt;/p&gt;

&lt;p&gt;Elm: &lt;a href="https://elmwordle.guupa.com/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;, &lt;a href="https://github.com/lucamug/elmwordle/blob/master/src/Main.elm" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;, &lt;a href="https://ellie-app.com/gxSyb8nrgSCa1" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;A few days ago I came across a simple Wordle implementation in HyperScript, a new event-oriented front-end scripting language, inspired by &lt;a href="https://en.wikipedia.org/wiki/HyperTalk" rel="noopener noreferrer"&gt;HyperTalk&lt;/a&gt; and a companion of &lt;a href="https://htmx.org/" rel="noopener noreferrer"&gt;htmx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not sure exactly what a "companion of htmx" stands for here. It could be that both are sponsored by the &lt;a href="https://github.com/sponsors/bigskysoftware" rel="noopener noreferrer"&gt;same company&lt;/a&gt; or that they complement each other on the same page with the common goal of avoiding JavaScript.&lt;/p&gt;

&lt;p&gt;The HyperScript implementation of Wordle is written in &lt;a href="https://twitter.com/htmx_org/status/1486337732888588289" rel="noopener noreferrer"&gt;57 total lines of code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The code is in the source of the HTML page and it looks quite &lt;strong&gt;impressive that the entire implementation can be so compact&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I decided to rewrite it in Elm and see how it compares:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0r3fcfl6ay9x2lfmmlh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0r3fcfl6ay9x2lfmmlh.gif" alt="Image description" width="760" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The DOM is the state
&lt;/h1&gt;

&lt;p&gt;The HyperScript version is built around the DOM. &lt;strong&gt;The DOM is used as a global mutable variable that stores the state of the application&lt;/strong&gt;, similar to how web applications were written using JQuery.&lt;/p&gt;

&lt;p&gt;In detail, there are three classes &lt;code&gt;.bg-muted&lt;/code&gt;, &lt;code&gt;.bg-warning&lt;/code&gt;, and &lt;code&gt;.bg-success&lt;/code&gt; which are written and read throughout the life of the app, to change the state of blocks, both in the gameboard and on the keyboard.&lt;/p&gt;

&lt;p&gt;Then there is the class &lt;code&gt;.guess&lt;/code&gt; that is used to mark the latest row typed by the user.&lt;/p&gt;

&lt;p&gt;The HyperScript is partially written within the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; element and partially inlined inside HTML, using the &lt;code&gt;_&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/hyperscript"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;$word&lt;/span&gt; &lt;span class="nf"&gt;to &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;$word&lt;/span&gt;

    &lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;$word&lt;/span&gt;
        &lt;span class="nx"&gt;repeat&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;
            &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;letter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;muted&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;$word&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt;
                &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;
                &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nx"&gt;end&lt;/span&gt;
        &lt;span class="nx"&gt;end&lt;/span&gt;
        &lt;span class="nx"&gt;repeat&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt;
            &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;letter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;warning&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;warning&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;
            &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="nx"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="nx"&gt;remove&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt;
        &lt;span class="nx"&gt;otherwise&lt;/span&gt; &lt;span class="nx"&gt;remove&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guess&lt;/span&gt;
    &lt;span class="nx"&gt;end&lt;/span&gt;

    &lt;span class="nx"&gt;behavior&lt;/span&gt; &lt;span class="nf"&gt;kbdRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;[@&lt;/span&gt;&lt;span class="nd"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="nx"&gt;send&lt;/span&gt; &lt;span class="nf"&gt;keyup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;[@&lt;/span&gt;&lt;span class="nd"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="nx"&gt;repeat&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt; 
            &lt;span class="nx"&gt;append&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;button letter='&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' class='secondary ma1 pa2 w2'&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/button&amp;gt;`&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt;
    &lt;span class="nx"&gt;end&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"
    on keyup(keyCode)[keyCode &amp;gt;= 65 and keyCode &amp;lt;= 90] put String.fromCharCode(keyCode) into first &amp;lt;:empty/&amp;gt; in first .guess
    on keyup(keyCode)[keyCode == 8] put '' into last &amp;lt;.guess &amp;gt; :not(:empty)/&amp;gt;
    on keyup(keyCode)[keyCode == 13 and (&amp;lt;:not(:empty)/&amp;gt; in first .guess).length == 5] call submit()
    "&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tc"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hyperwordle&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"on load set h to my innerHTML then repeat 5 times put h at the end of me"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"guess contrast flex ttu tc b f3 w-100 justify-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w3 h3 ma1 pa3 bg-muted"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w3 h3 ma1 pa3 bg-muted"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w3 h3 ma1 pa3 bg-muted"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w3 h3 ma1 pa3 bg-muted"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w3 h3 ma1 pa3 bg-muted"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-center ttu tc"&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"install kbdRow(keys: 'QWERTYUIOP')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-center ttu tc"&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"install kbdRow(keys: 'ASDFGHJKL')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-center ttu tc"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"secondary ma1 pa2 w-auto"&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"on click send keyup(keyCode: 13) to &amp;lt;body/&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Enter&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex"&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"install kbdRow(keys: 'ZXCVBNM')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"secondary ma1 pa2 w-auto"&lt;/span&gt; &lt;span class="na"&gt;_=&lt;/span&gt;&lt;span class="s"&gt;"on click send keyup(keyCode: 8) to &amp;lt;body/&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;⌫&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Elm version uses instead &lt;a href="https://guide.elm-lang.org/architecture/" rel="noopener noreferrer"&gt;The Elm Architecture&lt;/a&gt; where the state of the app is stored in an immutable data structure called &lt;code&gt;Model&lt;/code&gt;. What shows up on the page is then just a representation of this &lt;code&gt;Model&lt;/code&gt; converted to HTML by the &lt;code&gt;view&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;In this implementation, I adopted the idea that &lt;strong&gt;if some data can be calculated from others, it should not be stored in the &lt;code&gt;Model&lt;/code&gt;&lt;/strong&gt;. This is usually a good approach as it assure that the model doesn't contain any stale calculation. For example, all the information about which letter has been guessed or not, and also the notion that the game is over or player won the game, is calculated just-in-time, when is needed.&lt;/p&gt;

&lt;p&gt;This is the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="kt"&gt;Model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;currentGuess&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt; &lt;span class="kt"&gt;Char&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pastGuesses&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt; &lt;span class="kt"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wordToGuess&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt; &lt;span class="kt"&gt;Char&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It only stores what the user typed and what is the secret word to guess, plus a possible error from loading asynchronously the list of words to guess.&lt;/p&gt;

&lt;p&gt;This is the entire &lt;a href="https://github.com/lucamug/elmwordle/blob/master/src/Main.elm" rel="noopener noreferrer"&gt;code&lt;/a&gt; of the Elm version. This is an &lt;a href="https://ellie-app.com/gxSyb8nrgSCa1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt; version of it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Compactness
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;The HyperScript compactness is a combination of several things, but mainly the idea of DOM-oriented syntax&lt;/strong&gt;. The language is deeply integrated with the DOM. Adding/removing classes is a breeze. For example &lt;code&gt;on click toggle .red on me&lt;/code&gt;. How can it get more direct and shorter than this?&lt;/p&gt;

&lt;p&gt;Let's analyze another line of HyperScript code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;init fetch words.json as json then set $word to (random in it).toUpperCase() then log $word
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a remarkable small piece of code that does many things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On initialization of the app, send a GET HTTP request to fetch "words.json"&lt;/li&gt;
&lt;li&gt;Interpret it as JSON data&lt;/li&gt;
&lt;li&gt;Extract a random element from the JSON list (The secret word to guess) and assign it to &lt;code&gt;$word&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Log this value into the console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is something that in Elm require more structured work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;init&lt;/code&gt; function we start sending out the command &lt;code&gt;Random.generate NewRandom (Random.float 0 1)&lt;/code&gt; instructing the Elm runtime that we would like to have a random number. This is pure functional code, so no impure functions are allowed, this is one of these things that require some &lt;a href="https://elm.dmy.fr/packages/elm/random/latest/#mindset-shift" rel="noopener noreferrer"&gt;mindset-shift&lt;/a&gt;. Consider Elm as your assistant that does things for you. You just need to ask.&lt;/li&gt;
&lt;li&gt;Once the random number is ready we will get a message. At that point we can ask the Elm runtime to send out a GET request to get &lt;code&gt;words.json&lt;/code&gt; and that we expect it to have a certain structure.&lt;/li&gt;
&lt;li&gt;Once &lt;code&gt;words.json&lt;/code&gt; data is ready, we will get another message informing us of the result of the operation, including all possible sort of failure (network down, not a JSON file, not a data structure we expected, etc.)&lt;/li&gt;
&lt;li&gt;At this point, we can use the random number and the list of words to peak what secret word and save in the &lt;code&gt;Model&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What happens in the HyperScript version if something goes wrong with the JSON file as described above?&lt;/p&gt;

&lt;p&gt;The app just keeps running and lets you type the first row of characters. After that, &lt;strong&gt;it stops working&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note that the HyperScript version &lt;strong&gt;generates errors in the console also during the normal execution&lt;/strong&gt;. For example, continuing to type after reaching the five characters in a row, generates errors. The same when continuing to type after a solution is found. Probably this has been done on purpose, to make the code shorter. To avoid these errors, some extra code would be necessary.&lt;/p&gt;

&lt;p&gt;Elm instead forces us to consider all the edge cases so that these types of errors became impossible. So, in case something goes wrong with the GET request, I display a message on the screen.&lt;/p&gt;

&lt;h1&gt;
  
  
  Typos
&lt;/h1&gt;

&lt;p&gt;In my projects, I try to repeat only once all the strings. This is because &lt;strong&gt;the content of strings is not checked by the compiler&lt;/strong&gt; and typos can be deadly.&lt;/p&gt;

&lt;p&gt;For example, there are three possible state for a block: &lt;code&gt;.bg-muted&lt;/code&gt;, &lt;code&gt;.bg-warning&lt;/code&gt;, and &lt;code&gt;.bg-success&lt;/code&gt;. These are classes added to the DOM and have these meanings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.bg-muted&lt;/code&gt; (light gray background) is used for when a key in the keyboard has been used, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.bg-warning&lt;/code&gt; (light yellow background) is for when a character is used but it is in the wrong position &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.bg-success&lt;/code&gt; (green background) when the character is a perfect match&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Elm I replaced them with a custom type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;CharState&lt;/span&gt;
    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Muted&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Warning&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Success&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This guarantees that no typos can go into the code. Then I have a conversion function, used to inject the classes in the DOM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;charStateToClass&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CharState&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
&lt;span class="n"&gt;charStateToClass&lt;/span&gt; &lt;span class="n"&gt;charState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;charState&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;
        &lt;span class="kt"&gt;Muted&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-muted"&lt;/span&gt;

        &lt;span class="kt"&gt;Warning&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-warning"&lt;/span&gt;

        &lt;span class="kt"&gt;Success&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-success"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These strings appear only here in the entire code, so the possibility of introducing errors is minimized.&lt;/p&gt;

&lt;p&gt;The HyperScript code instead has these strings used multiple times, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;add .bg-success to ch add .bg-success to key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Any typo in the string &lt;code&gt;bg-success&lt;/code&gt; will go undetected and just causes a malfunction in the app&lt;/strong&gt;, without any apparent error notification. So only ad-hoc tests can detect these issues.&lt;/p&gt;

&lt;h1&gt;
  
  
  Code and bundle sizes
&lt;/h1&gt;

&lt;p&gt;The Elm implementation, which tries to mimic the original HyperScript implementation (there is probably a more "functional" way to implement the Wordle game itself), is around 260 lines of code. &lt;strong&gt;Around five times the original HyperScript version&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I would argue that the Elm version is more readable and simpler to be expanded with additional features but here we enter into a biased territory caused by my knowledge of Elm.&lt;/p&gt;

&lt;p&gt;The HyperScript version, in addition to what is in the source of the page, requires an HyperScript runtime library that is 86KB minified and 24KB zipped.&lt;/p&gt;

&lt;p&gt;The Elm language compiles to JavaScript and it doesn't need any separated runtime library as it is already included in the compiled JavaScript. The output of this Wordle implementation written in Elm is 33KB minified and 14KB zipped.&lt;/p&gt;

&lt;p&gt;So this means that &lt;strong&gt;concerning the sizes of stuff to load, Elm is around half the size of HyperScript&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;There are many more differences, but this is all that I have for this article. It has been a fun exercise. Have a look at the respective codes to learn more about these two languages.&lt;/p&gt;

&lt;p&gt;There are also alternative implementation of Wordle in Elm &lt;a href="https://openprojectrepo.com/project/n1k0-wordlem-javascript-misc" rel="noopener noreferrer"&gt;here&lt;/a&gt;, &lt;a href="https://twitter.com/FlavioCorpa/status/1487537170709684235" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://twitter.com/janiczek/status/1487235356579803139" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;❤️&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;HyperScript: &lt;a href="https://arhamjain.com/hyperwordle/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;, The source code is in the HTML Page Source.&lt;/p&gt;

&lt;p&gt;Elm: &lt;a href="https://elmwordle.guupa.com/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;, &lt;a href="https://github.com/lucamug/elmwordle/blob/master/src/Main.elm" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;, &lt;a href="https://ellie-app.com/gxSyb8nrgSCa1" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Note: In the past, there has been some disagreement about the choice of "vs" as the title in this series of articles. I agree with the criticism: there is &lt;a href="https://twitter.com/Rich_Harris/status/1226592707990163465" rel="noopener noreferrer"&gt;"plenty of room for everyone"&lt;/a&gt;. So please consider "vs" in the sense of a "comparison" rather than a "deathmatch".&lt;/em&gt;&lt;/p&gt;

</description>
      <category>elm</category>
      <category>hyperscript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Elm 2021, a year in review</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Tue, 28 Dec 2021 01:36:40 +0000</pubDate>
      <link>https://dev.to/lucamug/elm-2021-a-year-in-review-4pho</link>
      <guid>https://dev.to/lucamug/elm-2021-a-year-in-review-4pho</guid>
      <description>&lt;p&gt;2021 has been an exciting year for Elm, with many interesting packages, blog posts, videos, podcasts, demos, tutorials, applications, and so on. &lt;/p&gt;

&lt;p&gt;This is a list of relevant material. I am sure there is stuff that I missed. &lt;a href="https://twitter.com/luca_mug" rel="noopener noreferrer"&gt;Send me a DM&lt;/a&gt; in case you think there is something that I should add or remove.&lt;/p&gt;

&lt;p&gt;If you want to keep up with Elm's related news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.elmweekly.nl/" rel="noopener noreferrer"&gt;Subscribe&lt;/a&gt; to the Elm Weekly newsletter or &lt;a href="https://twitter.com/elmweekly" rel="noopener noreferrer"&gt;follow&lt;/a&gt; it on Twitter&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elm-lang.org/community/slack" rel="noopener noreferrer"&gt;Join&lt;/a&gt; the Elm group on Slack&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://discourse.elm-lang.org/" rel="noopener noreferrer"&gt;Check&lt;/a&gt; discourse.elm-lang.org&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/elmlang" rel="noopener noreferrer"&gt;Follow&lt;/a&gt; @elmlang on Twitter&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://incrementalelm.com/chat/" rel="noopener noreferrer"&gt;Check&lt;/a&gt; "Incremental Elm Discord" for working on Elm open source projects&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elm-radio.com/" rel="noopener noreferrer"&gt;Listen&lt;/a&gt; to the Elm Radio podcast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here we go 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  January 2021
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;4ᵗʰ - The Elm Radio episode #021, &lt;a href="https://elm-radio.com/episode/elm-review-tips" rel="noopener noreferrer"&gt;elm-review Tips&lt;/a&gt;, revisits elm-review with some tips, useful workflows, and helpful packages. &lt;a href="https://elm-radio.com/episode/elm-review-tips" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #021" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4ᵗʰ - Éber Freitas Dias publishes the post &lt;a href="https://dev.to/eberfreitas/elm-in-the-server-or-anywhere-else-with-promises-5eoj"&gt;Elm in the server (or anywhere else) with promises&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6ᵗʰ - Amanda Beiner publishes the post &lt;a href="https://thoughtbot.com/blog/how-to-stop-using-your-graphql-api-as-a-rest-api" rel="noopener noreferrer"&gt;How to stop using your GraphQL API as a REST API&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;8ᵗʰ - Diogo Silva publishes the post &lt;a href="https://medium.com/nerd-for-tech/how-to-get-unique-values-in-an-elm-list-d91ec7dfd0e" rel="noopener noreferrer"&gt;How to get unique values in an Elm list&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - Brian Hicks publishes the post &lt;a href="https://bytes.zone/posts/should-elm-files-be-long-or-short/" rel="noopener noreferrer"&gt;Should Elm files be long or short?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Kristian Pedersen publishes the &lt;a href="https://dev.to/kristianpedersen/30daysofelm-day-30-closing-thoughts-2oka"&gt;last installment of the series "30 days of Elm"&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Simon Lydell releases &lt;a href="https://discourse.elm-lang.org/t/announcing-elm-tooling-cli/6775" rel="noopener noreferrer"&gt;elm-tooling CLI&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - The Elm Radio episode #022, &lt;a href="https://elm-radio.com/episode/elm-tooling" rel="noopener noreferrer"&gt;elm-tooling with Simon Lydell&lt;/a&gt;, talks about how elm-tooling helps to manage versions of tools like elm-format and Elm. &lt;a href="https://elm-radio.com/episode/elm-tooling" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #022" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Álisson Morais publishes the post &lt;a href="https://dev.to/alissonfpmorais/a-gentle-introduction-to-elm-j4m"&gt;A gentle introduction to Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - Kolja Lampe releases &lt;a href="https://discourse.elm-lang.org/t/elmls-2-0-0-is-out/6777" rel="noopener noreferrer"&gt;new versions of the server and the vscode extensions (2.0.0)&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - Ulric Wilfred starts the video series &lt;a href="https://www.youtube.com/watch?v=-BujEQP1xzE&amp;amp;list=PL4PKtHFA6sG9DQxKeGmV-Xjn_2eKDJM_J" rel="noopener noreferrer"&gt;Elm Goose-Driven Tutorial&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Atle Wee Førre post the first video of the series &lt;a href="https://www.youtube.com/watch?v=x6vK7PF43lg" rel="noopener noreferrer"&gt;Making a graphical editor in Elm (elm-ui)&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=x6vK7PF43lg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnestx3wgyu0fdbt956ub.png" title="Making a graphical editor in Elm" alt="Making a graphical editor in Elm" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - EJ Mitchell publishes &lt;a href="https://thoughtbot.com/blog/functional-programming-as-algebra" rel="noopener noreferrer"&gt;Functional Programming as Algebra&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/safe-dead-code-removal/" rel="noopener noreferrer"&gt;Safe dead code removal in a pure functional language&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;29ᵗʰ - Evan Czaplicki releases a &lt;a href="https://www.npmjs.com/package/elm" rel="noopener noreferrer"&gt;minor Elm release (0.19.1-5)&lt;/a&gt; that adds compatibility with Apple Silicon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;30ᵗʰ - Leonardo Taglialegne publishes &lt;a href="https://package.elm-lang.org/packages/miniBill/elm-ui-with-context/latest" rel="noopener noreferrer"&gt;elm-ui-with-context&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  February 2021
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - The Elm Radio episode #023, &lt;a href="https://elm-radio.com/episode/elm-format" rel="noopener noreferrer"&gt;elm-format&lt;/a&gt;, discusses the core features and philosophy of elm-format, as well as some hidden productivity tricks for getting more out of it. &lt;a href="https://elm-radio.com/episode/elm-format" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #023" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4ᵗʰ - Cezar Halmagean releases the video &lt;a href="https://www.youtube.com/watch?v=39QB66h3kGE" rel="noopener noreferrer"&gt;How to Build an Instagram Card with Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - Tereza Sokol launches &lt;a href="https://terezka.github.io/elm-diff/" rel="noopener noreferrer"&gt;elm-diff&lt;/a&gt;.  &lt;a href="https://terezka.github.io/elm-diff/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkl2t3emvbppum5n151k.png" title="elm-diff" alt="elm-diff" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Choon Keat talks about &lt;a href="https://www.youtube.com/watch?v=NSoslWAnmEY" rel="noopener noreferrer"&gt;Elm: Introduction to a new popular programming language - TechSavvy&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=NSoslWAnmEY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbatip47dbkbbpj20zn8o.png" title="Elm: Introduction to a new popular programming language" alt="Elm: Introduction to a new popular programming language" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;9ᵗʰ - Dillon Kearns publishes the post &lt;a href="https://incrementalelm.com/typescript-blind-spots/" rel="noopener noreferrer"&gt;TypeScript's Blind Spots&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;9ᵗʰ - Aaron VonderHaar releases a &lt;a href="https://github.com/avh4/elm-format/releases" rel="noopener noreferrer"&gt;new version of elm-format&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - The TMPDIR podcast publish the episode &lt;a href="https://tmpdir.org/008/" rel="noopener noreferrer"&gt;Using Elm for Frontend Development&lt;/a&gt;. &lt;a href="https://tmpdir.org/008/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy34yl2btb1t58zg41ztz.png" title="Using Elm for Frontend Development" alt="Using Elm for Frontend Development" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;14ᵗʰ - James Carlson publishes the post &lt;a href="https://dev.to/jxxcarlson/towards-a-pure-elm-text-editor-3aih"&gt;Towards a Pure Elm Text Editor&lt;/a&gt;. &lt;a href="https://dev.to/jxxcarlson/towards-a-pure-elm-text-editor-3aih"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7p7knk2a6w1cqe87i5f9.png" title="Towards a Pure Elm Text Editor" alt="Towards a Pure Elm Text Editor" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Coding Cave publishes &lt;a href="https://www.youtube.com/watch?v=kLLgzL6bsZg" rel="noopener noreferrer"&gt;the first video of a series about Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=kLLgzL6bsZg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19a9zsxgoj5mgaddpmde.png" title="Coding Cave" alt="Coding Cave" width="800" height="179"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - The Elm Radio episode #024, &lt;a href="https://elm-radio.com/episode/elm-program-test" rel="noopener noreferrer"&gt;elm-program-test&lt;/a&gt;, has Aaron VonderHaar sharing the fundamentals and best practices for his high-level Elm testing package, elm-program-test. &lt;a href="https://elm-radio.com/episode/elm-program-test" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #024" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Brian Hicks publishes the video &lt;a href="https://www.youtube.com/watch?v=_z6V1143TDE" rel="noopener noreferrer"&gt;elm-csv: a boring package&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Coury Ditch publishes the post &lt;a href="https://blog.realkinetic.com/the-trickiest-elm-bug-ive-ever-seen-988aff6cbbd7" rel="noopener noreferrer"&gt;The trickiest Elm bug I’ve ever seen&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;17ᵗʰ - David Farr publishes the post &lt;a href="https://dfarr.medium.com/event-sourcing-minesweeper-65f0d497e6a7" rel="noopener noreferrer"&gt;Event Sourcing Minesweeper&lt;/a&gt;. &lt;a href="https://dfarr.medium.com/event-sourcing-minesweeper-65f0d497e6a7" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd946ardc1wtrjfcwez7w.png" title="Event Sourcing Minesweeper" alt="Event Sourcing Minesweeper" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/great-failure-messages/" rel="noopener noreferrer"&gt;Great compiler messages? Great test failure messages!&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - The tread &lt;a href="https://discourse.elm-lang.org/t/what-are-your-favorite-things-about-elm/6947" rel="noopener noreferrer"&gt;What are your favorite things about Elm?&lt;/a&gt; starts in discourse.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/unused-patch-1-1-5/" rel="noopener noreferrer"&gt;You thought you had no dead code?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - Simon Lydell publishes the post &lt;a href="https://insurello.se/how-we-made-elm-and-google-translate-work-together/" rel="noopener noreferrer"&gt;How we made Elm and Google Translate work together&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - Dwayne Crooks announces the official fork of &lt;a href="https://discourse.elm-lang.org/t/announcing-built-with-elm-the-official-fork/6974" rel="noopener noreferrer"&gt;Built with Elm&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/announcing-built-with-elm-the-official-fork/6974" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fku1q6g55snkbr87w7lhf.png" title="Built with Elm" alt="Built with Elm" width="800" height="431"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;23ᵗʰ - Jakub Hampl publishes the post &lt;a href="https://gampleman.eu/post/643382226796625920/design-your-own-runtime" rel="noopener noreferrer"&gt;Design your own Runtime&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Tereza Sokol updates &lt;a href="https://twitter.com/tereza_sokol/status/1364229497596366853" rel="noopener noreferrer"&gt;the Elm website&lt;/a&gt;. &lt;a href="https://twitter.com/tereza_sokol/status/1364229497596366853" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmtbxwlmffy5ic2lxqnc.gif" title="update of the Elm lang website" alt="update of the Elm lang website" width="600" height="453"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;28ᵗʰ - Martin Stewart gives an update about &lt;a href="https://discourse.elm-lang.org/t/ascii-collab-progress-update/7019" rel="noopener noreferrer"&gt;Ascii Collab&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/ascii-collab-progress-update/7019" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc967ktwnutq1gnthd2xk.jpeg" title="Ascii Collab" alt="Ascii Collab" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  March 2021
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - The Elm Radio episode #025 showcases &lt;a href="https://elm-radio.com/episode/elm-ts-interop" rel="noopener noreferrer"&gt;elm-ts-interop&lt;/a&gt;, a tool that keeps types in sync between Elm ports and JavaScript (or TypeScript). &lt;a href="https://elm-radio.com/episode/elm-ts-interop" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #025" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Matthieu Pizenberg launches &lt;a href="https://discourse.elm-lang.org/t/announcing-elm-test-rs-1-0-0/7024" rel="noopener noreferrer"&gt;elm-test-rs 1.0.0&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Luca Mugnaini releases &lt;a href="https://twitter.com/luca_mug/status/1366200906606252037" rel="noopener noreferrer"&gt;Elm Cheat Sheet&lt;/a&gt;. &lt;a href="https://twitter.com/luca_mug/status/1366200906606252037" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvwlpjy81s0cguihipnm.png" title="Elm Cheat Sheet" alt="Elm Cheat Sheet" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Brian Hicks publishes the post &lt;a href="https://bytes.zone/posts/trying-and-failing-to-speed-up-string-beginswith/" rel="noopener noreferrer"&gt;Trying (and Failing) to Speed Up String.startsWith&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Yarith publishes the article &lt;a href="https://gist.github.com/Yarith/bcd7b715cff302fdf4512f538b769521" rel="noopener noreferrer"&gt;Animate removed DOM elements&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2ⁿᵈ - Evan Czaplicki participates in the panel &lt;a href="https://www.youtube.com/watch?v=f0ouXATi25I" rel="noopener noreferrer"&gt;#PLTalk: PL Funding Panel with the Creators of Elm, Elixir, and Julia&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=f0ouXATi25I" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqwbtl8p2e44tydg6rpz.png" title="#PLTalk: PL Funding Panel with the Creators of Elm, Elixir, and Julia" alt="#PLTalk: PL Funding Panel with the Creators of Elm, Elixir, and Julia" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Andrew MacMurray releases &lt;a href="https://discourse.elm-lang.org/t/elm-simple-animation-2-0-0/7059" rel="noopener noreferrer"&gt;version 2.0.0 of Elm Simple Animation&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/elm-simple-animation-2-0-0/7059" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh2cxuk8tx6nvsr1vfx5.png" title="version 2.0.0 of Elm Simple Animation" alt="version 2.0.0 of Elm Simple Animation" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Lucas Payr releases a new package: &lt;a href="https://discourse.elm-lang.org/t/elm-static-array-fixed-length-arrays-using-phantom-types/7058" rel="noopener noreferrer"&gt;Elm-Static-Array - Fixed length arrays using Phantom Types&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10ᵗʰ - Flavio Corpa releases &lt;a href="https://twitter.com/FlavioCorpa/status/1369376209956708361" rel="noopener noreferrer"&gt;Declarative UIs without CSS with elm-ui&lt;/a&gt;. &lt;a href="https://twitter.com/FlavioCorpa/status/1369376209956708361" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fpjav2tfl1zwub9tggo.png" title="Declarative UIs without CSS with elm-ui" alt="Declarative UIs without CSS with elm-ui" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - Dillon Kearns releases &lt;a href="https://discourse.elm-lang.org/t/announcing-html-to-elm-com-and-elm-review-html-to-elm/7083" rel="noopener noreferrer"&gt;html-to-elm.com and elm-review-html-to-elm&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/announcing-html-to-elm-com-and-elm-review-html-to-elm/7083" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06v5n4rr9u5b4gaazrq1.png" title="html-to-elm.com and elm-review-html-to-elm" alt="html-to-elm.com and elm-review-html-to-elm" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - The Elm Radio episode #026, &lt;a href="https://elm-radio.com/episode/open-source-funding" rel="noopener noreferrer"&gt;Funding Open Source with Evan Czaplicki&lt;/a&gt;, has Evan Czaplicki sharing what he's learned about Open Source funding and the tradeoffs of different models. &lt;a href="https://elm-radio.com/episode/open-source-funding" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #026" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Matias Klemola continues his series of posts about &lt;a href="https://matiasklemola.com/liikennematto-devlog-three" rel="noopener noreferrer"&gt;Liikennematto&lt;/a&gt;. &lt;a href="https://matiasklemola.com/liikennematto-devlog-three" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hqwpjudu1gldy8v0v35.gif" title="Liikennematto" alt="Liikennematto" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Emma Bastås releases &lt;a href="https://discourse.elm-lang.org/t/announcing-elm-embed-0-1-0/7105" rel="noopener noreferrer"&gt;elm-embed 0.1.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;17ᵗʰ - Daniel Kodaj releases a &lt;a href="https://discourse.elm-lang.org/t/pure-elm-rich-text-editor/7111" rel="noopener noreferrer"&gt;Pure Elm rich text editor&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/pure-elm-rich-text-editor/7111" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3y0w8vukx7umq3pzfegy.png" title="Pure Elm rich text editor" alt="Pure Elm rich text editor" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Dillon Kearns publishes the video tutorial &lt;a href="https://www.youtube.com/watch?v=FzCRbI4Ne6w" rel="noopener noreferrer"&gt;elm-ts-interop-pro Setup&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Lucas Payr releases &lt;a href="https://discourse.elm-lang.org/t/mezzo-a-card-game-created-in-elm/7121" rel="noopener noreferrer"&gt;Mezzo - A Card Game created in Elm&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/mezzo-a-card-game-created-in-elm/7121" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zio8hcybo26p71m3j8x.png" title="Mezzo - A Card Game created in Elm" alt="Mezzo - A Card Game created in Elm" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;21ˢᵗ - Matthieu Pizenberg &lt;a href="https://package.elm-lang.org/packages/mpizenberg/elm-file/latest/" rel="noopener noreferrer"&gt;releases elm-file 1.0.0&lt;/a&gt;, an alternative to elm/file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - Catherine Galkina publishes the post &lt;a href="https://dev.to/typeable/comparing-elm-with-reflex-2mme"&gt;Comparing Elm with Reflex&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Ju Liu publishes the post &lt;a href="https://juliu.is/there-and-back-again/" rel="noopener noreferrer"&gt;There and back again&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Jan Wirth and David Beesley announce &lt;a href="https://discourse.elm-lang.org/t/funk-the-visual-frontend-framework/7166" rel="noopener noreferrer"&gt;Funk, the visual frontend framework&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/funk-the-visual-frontend-framework/7166" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxj2qt5hkqwldsmae6gq2.png" title="Funk, the visual frontend framework" alt="Funk, the visual frontend framework" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;29ᵗʰ - The Elm Radio episode #027, &lt;a href="https://elm-radio.com/episode/elm-tailwind-modules" rel="noopener noreferrer"&gt;elm-tailwind-modules&lt;/a&gt;, discusses using elm-tailwind-modules to build type-safe Tailwind views. &lt;a href="https://elm-radio.com/episode/elm-tailwind-modules" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #027" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  April 2021
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;6ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/global-and-configuration-errors/" rel="noopener noreferrer"&gt;Global and configuration errors&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;8ᵗʰ - Maciej Sikora talks at TypeScript Berlin Meetup about &lt;a href="https://www.youtube.com/watch?v=OXzIZZDq2hE" rel="noopener noreferrer"&gt;Elm in TypeScript, pattern matching and beyond&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=OXzIZZDq2hE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw4yf38qqvpas0zcx5p8.png" title="Elm in TypeScript, pattern matching and beyond" alt="Elm in TypeScript, pattern matching and beyond" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - Erkal Selman releases &lt;a href="https://twitter.com/AzizErkalSelman/status/1380925092822183937" rel="noopener noreferrer"&gt;The Red-Faced Cube puzzle&lt;/a&gt;. &lt;a href="https://twitter.com/AzizErkalSelman/status/1380925092822183937" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4p9fzcoqwdkie7conlm0.png" title="The Red-Faced Cube puzzle" alt="The Red-Faced Cube puzzle" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - The Elm Radio episode #028, &lt;a href="https://elm-radio.com/episode/github-actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;, discusses best practices to setup GitHub Actions to make sure everyone has the same source of truth for checking your Elm code and deploying to production. &lt;a href="https://elm-radio.com/episode/github-actions" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #028" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - Ryan Haskell-Glatz &lt;a href="https://twitter.com/rhg_dev/status/1381312778963652610" rel="noopener noreferrer"&gt;releases the game Unblank&lt;/a&gt;. &lt;a href="https://twitter.com/rhg_dev/status/1381312778963652610" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4ktk4w39ul2aznde6ab.png" title="releases the game Unblank" alt="releases the game Unblank" width="600" height="250"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Humio publishes the post &lt;a href="https://www.humio.com/whats-new/blog/why-we-chose-elm-for-humio-s-web-ui/" rel="noopener noreferrer"&gt;Why we chose Elm for Humio’s web UI&lt;/a&gt;. &lt;a href="https://www.humio.com/whats-new/blog/why-we-chose-elm-for-humio-s-web-ui/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6ox2dii6sy39ha2d53l.png" title="Why we chose Elm for Humio’s web UI" alt="Why we chose Elm for Humio’s web UI" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Phil Wade publishes the post &lt;a href="https://philwade.org/post/the_evolution_of_a_type/" rel="noopener noreferrer"&gt;The Evolution of a Type&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Andrea Peltrin releases &lt;a href="https://twitter.com/passiomatic/status/1384190613592055809" rel="noopener noreferrer"&gt;Sunny Land&lt;/a&gt; (&lt;a href="https://lab.passiomatic.com/sunny-land/" rel="noopener noreferrer"&gt;demo&lt;/a&gt;). &lt;a href="https://twitter.com/passiomatic/status/1384190613592055809" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm231jvx8ks0tjsfpm0wg.png" title="Sunny Land" alt="Sunny Land" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;23ʳᵈ - Alex Korban publishes &lt;a href="https://discourse.elm-lang.org/t/json2elm-generate-elm-json-decoders-encoders-from-a-json-sample/7277" rel="noopener noreferrer"&gt;Json2elm: generate elm/json decoders &amp;amp; encoders from a JSON sample&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/json2elm-generate-elm-json-decoders-encoders-from-a-json-sample/7277" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvfdsbtew6izjvxjs7q7.png" title="Json2elm: generate elm/json decoders &amp;amp; encoders from a JSON sample" alt="Json2elm: generate elm/json decoders &amp;amp; encoders from a JSON sample" width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Jeroen Engels releases version 1.1.9 of elm-review and publishes the post &lt;a href="https://jfmengels.net/simplify/" rel="noopener noreferrer"&gt;Simplify&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - The Elm Radio episode #029, &lt;a href="https://elm-radio.com/episode/writing-an-elm-review-rule" rel="noopener noreferrer"&gt;Writing an elm-review Rule&lt;/a&gt;, talks about how to write an elm-review rule from scratch. &lt;a href="https://elm-radio.com/episode/writing-an-elm-review-rule" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #029" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Jesse Warden publishes the guide &lt;a href="https://dev.to/jesterxl/react-to-elm-migration-guide-30np"&gt;React to Elm Migration&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Jakub Hampl releases &lt;a href="https://github.com/gampleman/elm-visualization/releases/tag/2.2.0" rel="noopener noreferrer"&gt;version 2.2.0 of elm-visualization&lt;/a&gt;. &lt;a href="https://github.com/gampleman/elm-visualization/releases/tag/2.2.0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbl4ng4a54axiep21z1a9.png" title="releases versio 2.2.0 of elm-visualization" alt="releases versio 2.2.0 of elm-visualization" width="600" height="191"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Ryan Haskell-Glatz &lt;a href="https://twitter.com/rhg_dev/status/1386962479847194632" rel="noopener noreferrer"&gt;releases version 6.0.0 of elm-spa&lt;/a&gt;. &lt;a href="https://twitter.com/rhg_dev/status/1386962479847194632" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqk109qclb65hnnauyuu9.jpeg" title="releases the version 6.0.0 of elm-spa" alt="releases the version 6.0.0 of elm-spa" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Luca Mugnaini releases &lt;a href="https://twitter.com/luca_mug/status/1386963674850500611" rel="noopener noreferrer"&gt;elm-ecommerce&lt;/a&gt;. &lt;a href="https://twitter.com/luca_mug/status/1386963674850500611" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2edh4txsi89u1u2ufefi.png" title="elm-ecommerce" alt="elm-ecommerce" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Diogo Silva publishes the post &lt;a href="https://medium.com/nerd-for-tech/elm-elm-ui-and-the-building-of-a-dropdown-part-i-8aff2ed079b2" rel="noopener noreferrer"&gt;Elm, elm-ui and the building of a dropdown&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Ju Liu publishes the post &lt;a href="https://juliu.is/elm-at-noredink/" rel="noopener noreferrer"&gt;Elm at NoRedInk&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;29ᵗʰ - Kasper Møller Andersen publishes the post &lt;a href="https://www.humio.com/whats-new/blog/optimizing-an-elm-library/" rel="noopener noreferrer"&gt;Optimizing an Elm Library&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;29ᵗʰ - Atle Wee Førre releases the video &lt;a href="https://www.youtube.com/watch?v=OMVhrkMS_Pk" rel="noopener noreferrer"&gt;Building Rest APIs with elm? (experiment)&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  May 2021
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - lue-bird releases the first version of &lt;a href="https://package.elm-lang.org/packages/lue-bird/elm-typesafe-array/latest/" rel="noopener noreferrer"&gt;elm-typesafe-array (now at version 18.3.0)&lt;/a&gt; for typed array that enables safe access. See the &lt;a href="https://github.com/lue-bird/elm-typesafe-array/tree/18.3.0#comparison-to-orasunds-static-array" rel="noopener noreferrer"&gt;differences compared to Orasund's static-array&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2ⁿᵈ - Paul Fioravanti publishes &lt;a href="https://www.paulfioravanti.com/blog/elmsthetics/" rel="noopener noreferrer"&gt;ＥＬＭＳＴＨＥＴＩＣＳ&lt;/a&gt;. &lt;a href="https://www.paulfioravanti.com/blog/elmsthetics/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyuix5nyczc7a48rzd2f8.png" title="ＥＬＭＳＴＨＥＴＩＣＳ" alt="ＥＬＭＳＴＨＥＴＩＣＳ" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - Phil Hazelden publishes the post &lt;a href="http://reasonableapproximation.net/2019/05/05/hindley-milner.html" rel="noopener noreferrer"&gt;A reckless introduction to Hindley-Milner type inference&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10ᵗʰ - The Elm Radio episode #030, &lt;a href="https://elm-radio.com/episode/debugging-in-elm" rel="noopener noreferrer"&gt;Debugging in Elm&lt;/a&gt;, talks about favorite debugging techniques, and how to make the most of Elm's guarantees when debugging. &lt;a href="https://elm-radio.com/episode/debugging-in-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #030" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10ᵗʰ - Alex Korban publishes the post &lt;a href="https://korban.net/posts/elm/2021-05-10-generating-json-decoders-with-json-decoders/" rel="noopener noreferrer"&gt;Generating elm/json decoders with elm/json decoders&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - Andrey Kuzmin showcases a &lt;a href="https://twitter.com/unsoundscapes/status/1391849987479425024" rel="noopener noreferrer"&gt;3D model of Nefertiti&lt;/a&gt; (Note that the package has not been released, so just enjoy the demo). &lt;a href="https://twitter.com/unsoundscapes/status/1391849987479425024" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c2aqopee5qny5i6k065.gif" title="3D model of Nefertiti" alt="3D model of Nefertiti" width="400" height="469"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - Joël Quenneville publishes the post &lt;a href="https://thoughtbot.com/blog/running-out-of-maps" rel="noopener noreferrer"&gt;Running Out of Maps&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Alex Korban publishes the post &lt;a href="https://korban.net/posts/elm/2021-05-18-parse-urls-elm-url/" rel="noopener noreferrer"&gt;Parse URLs with elm/url&lt;/a&gt; and  &lt;a href="https://korban.net/posts/elm/2021-05-18-pipeline-applicative-decoders-json2elm/" rel="noopener noreferrer"&gt;Generating pipeline and applicative decoders with json2elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - Joël Quenneville publishes the post &lt;a href="https://thoughtbot.com/blog/pipeline-decoders-in-elm" rel="noopener noreferrer"&gt;Pipeline Decoders in Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - Martin Janiczek publishes the first video of the series &lt;a href="https://www.youtube.com/watch?v=Pym32n6AfSs" rel="noopener noreferrer"&gt;Writing a property-based testing library in Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - ABAB↑↓BA showcases a &lt;a href="https://discourse.elm-lang.org/t/a-simulator-for-tea-has-been-created/7382" rel="noopener noreferrer"&gt;TEA simulator&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/a-simulator-for-tea-has-been-created/7382" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkysn337d3ugy158kxfke.gif" title="TEA simulator" alt="TEA simulator" width="840" height="628"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - The Elm Radio episode #031, &lt;a href="https://elm-radio.com/episode/code-generation" rel="noopener noreferrer"&gt;Elm Code Generation&lt;/a&gt;, discusses different use cases for code generation in Elm applications. &lt;a href="https://elm-radio.com/episode/code-generation" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #031" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;28ᵗʰ - PaackEng releases the first version of the &lt;a href="https://github.com/PaackEng/paack-ui" rel="noopener noreferrer"&gt;Paack UI&lt;/a&gt;, &lt;a href="https://paackeng.github.io/paack-ui/#Styles/Colors/Colors" rel="noopener noreferrer"&gt;a design system based on elm-ui&lt;/a&gt;. &lt;a href="https://paackeng.github.io/paack-ui/#Styles/Colors/Colors" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7rgd2wauwjljcmq6ed8.png" title="Paack UI" alt="Paack UI" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  June 2021
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/tail-call-optimization/" rel="noopener noreferrer"&gt;Tail-call optimization in Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Dillon Kearns publishes the post &lt;a href="https://incrementalelm.com/moving-faster-with-tiny-steps/" rel="noopener noreferrer"&gt;Moving Faster with Tiny Steps in Elm&lt;/a&gt;. &lt;a href="https://incrementalelm.com/moving-faster-with-tiny-steps/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjonyajjo8688brbby29a.png" title="Moving Faster with Tiny Steps in Elm" alt="Moving Faster with Tiny Steps in Elm" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4ᵗʰ - Sellooh publishes the first &lt;a href="https://www.youtube.com/watch?v=VdAq5QzNy2w&amp;amp;list=PLfvCHAw-EHeL718ZXA0HSUMUJZrmS-875" rel="noopener noreferrer"&gt;video of an Elm course in Portuguese (PT-BR)&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=VdAq5QzNy2w&amp;amp;list=PLfvCHAw-EHeL718ZXA0HSUMUJZrmS-875" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23obmfw9pvmckppgfhpl.png" title="Elm course" alt="Elm course" width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - The Elm Radio episode #032, &lt;a href="https://elm-radio.com/episode/universal-pattern" rel="noopener noreferrer"&gt;Elm's Universal Pattern&lt;/a&gt;, has Joël Quenneville sharing his wisdom on transforming and mapping in Elm, and how it applies across many Elm data types. &lt;a href="https://elm-radio.com/episode/universal-pattern" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #032" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Andrey Kuzmin showcases the &lt;a href="https://twitter.com/unsoundscapes/status/1401571646712987654" rel="noopener noreferrer"&gt;ability of elm-obj-file to encode in OBJ format&lt;/a&gt;. &lt;a href="https://twitter.com/unsoundscapes/status/1401571646712987654" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjozqth5gj5i45ujwq9dq.png" title="elm-obj-file" alt="elm-obj-file" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - McMaster Start Coding school showcases an &lt;a href="https://twitter.com/MacCSOutreach/status/1403472402814746627" rel="noopener noreferrer"&gt;Elm application to teach children how to code music&lt;/a&gt;. &lt;a href="https://twitter.com/MacCSOutreach/status/1403472402814746627" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpufp6fxv1qr2v2utzv8.gif" title="McMaster Start Coding school" alt="McMaster Start Coding school" width="600" height="331"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;14ᵗʰ - Stefan Ostermayr publishes the post &lt;a href="https://dev.to/steve_oh/elm-at-treefin-2k20"&gt;Elm at Treefin&lt;/a&gt;. &lt;a href="https://dev.to/steve_oh/elm-at-treefin-2k20"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlfxw2h1dx3353nokkub.jpeg" title="Elm at Treefin" alt="Elm at Treefin" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Katia Trifonova publishes the post &lt;a href="https://blog.jetbrains.com/blog/2021/06/16/art-of-tiling-and-mind-coalescence/" rel="noopener noreferrer"&gt;Art of Tiling and Mind Coalescence&lt;/a&gt;. &lt;a href="https://blog.jetbrains.com/blog/2021/06/16/art-of-tiling-and-mind-coalescence/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz4cmmrmmj8goivuhaep.png" title="Art of Tiling and Mind Coalescence" alt="Art of Tiling and Mind Coalescence" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Ali Ahmed &lt;a href="https://knightyknight.netlify.app/" rel="noopener noreferrer"&gt;updates Knighty Knight, a Chess puzzle&lt;/a&gt; (&lt;a href="https://github.com/AliNisarAhmed/knighty-knight" rel="noopener noreferrer"&gt;source&lt;/a&gt;). &lt;a href="https://knightyknight.netlify.app/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fln6snoqf2hdwryj7px1p.png" title="Knighty Knight" alt="Knighty Knight" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;21ˢᵗ - The Elm Radio episode #033, &lt;a href="https://elm-radio.com/episode/accessibility" rel="noopener noreferrer"&gt;Accessibility in Elm&lt;/a&gt;,  has Tessa Kelly explaining accessibility best practices and how to apply them in Elm. &lt;a href="https://elm-radio.com/episode/accessibility" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #033" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22dn - Shuji Oba releases &lt;a href="https://github.com/uzimaru0000/ulmus" rel="noopener noreferrer"&gt;Ulmus, a Lisp implementation made with Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Elm Online Meetup - Video &lt;a href="https://www.youtube.com/watch?v=XlJuICG2kFU" rel="noopener noreferrer"&gt;Analytics and Architecture in Elm&lt;/a&gt; by Chad. &lt;a href="https://www.youtube.com/watch?v=XlJuICG2kFU" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2fihyj3bh7exu1q8n7i.png" title="Analytics and Architecture in Elm" alt="Analytics and Architecture in Elm" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Elm Online Meetup - Video &lt;a href="https://www.youtube.com/watch?v=3Nn5meBieh4" rel="noopener noreferrer"&gt;Building a Meetup clone on Lamdera&lt;/a&gt; by Martin Stewart. &lt;a href="https://www.youtube.com/watch?v=3Nn5meBieh4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5tfgxphohjjlugt41q2.png" title="Building a Meetup clone on Lamdera" alt="Building a Meetup clone on Lamdera" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Martin S. release a &lt;a href="https://discourse.elm-lang.org/t/i-made-a-meetup-com-clone/7480" rel="noopener noreferrer"&gt;clone of meetup.com&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/i-made-a-meetup-com-clone/7480" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkpwyla08snkgtpgg3mv.png" title="clone of meetup.com" alt="clone of meetup.com" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;29ᵗʰ - Ivan Gori publishes the post &lt;a href="https://medium.com/prima-engineering/mega-maybe-maybe-is-not-the-right-choice-b1d2e966b27e" rel="noopener noreferrer"&gt;MEGA: Maybe Maybe is not the right choice&lt;/a&gt;. &lt;a href="https://medium.com/prima-engineering/mega-maybe-maybe-is-not-the-right-choice-b1d2e966b27e" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8fb5l1ilulx8lb6igzgf.png" title="MEGA" alt="MEGA" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  July 2021
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2ⁿᵈ - André Dietrich showcases a &lt;a href="https://twitter.com/an_dietrich/status/1410895388551360514" rel="noopener noreferrer"&gt;generic API that can handle multiple document formats&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - The Elm Radio episode #34, &lt;a href="https://elm-radio.com/episode/api-design-lessons" rel="noopener noreferrer"&gt;API Design Lessons&lt;/a&gt;, talks about designing Elm APIs and how it applies when building applications and tools. &lt;a href="https://elm-radio.com/episode/api-design-lessons" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #034" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - Erkal Selman showcases 3D animations in Elm: &lt;a href="https://twitter.com/AzizErkalSelman/status/1411894342160195586" rel="noopener noreferrer"&gt;Time-traveling made easy by The Elm Architecture&lt;/a&gt;. &lt;a href="https://twitter.com/AzizErkalSelman/status/1411894342160195586" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzsjhmoujp9p1i6hnf2m.gif" title="3D animations" alt="3D animations" width="760" height="515"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - Andre Dietrich releases &lt;a href="https://github.com/andre-dietrich/elm-generic/tags" rel="noopener noreferrer"&gt;elm-generic&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/disable-comments/" rel="noopener noreferrer"&gt;How disable comments make static analysis tools worse&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/cognitive-complexity/" rel="noopener noreferrer"&gt;Measuring cognitive complexity with elm-review&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Albert Dahlin &lt;a href="https://discourse.elm-lang.org/t/write-cli-scripts-in-elm-io-monad/7543/2" rel="noopener noreferrer"&gt;writes about CLI scripts in Elm (IO Monad)&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;14ᵗʰ - Pravdomil Toman releases &lt;a href="https://elm.pravdomil.com/packages/" rel="noopener noreferrer"&gt;an alternative browser for package documentation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Hans Hoffman adds &lt;a href="https://github.com/hansjhoffman/nova-elm" rel="noopener noreferrer"&gt;Elm support for the Nova Editor&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Georges Boris releases of &lt;a href="https://twitter.com/georgesboris/status/1416737443399749638" rel="noopener noreferrer"&gt;elm-book&lt;/a&gt;, now at version &lt;a href="https://package.elm-lang.org/packages/dtwrks/elm-book/latest/" rel="noopener noreferrer"&gt;1.3.0&lt;/a&gt;. &lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rww0a3le0thjawwva1lb.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2jrm17gu4gge29bn0456.png" title="elm-book" alt="elm-book" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - Tereza Sokol &lt;a href="https://twitter.com/tereza_sokol/status/1417067810430328833" rel="noopener noreferrer"&gt;releases the library elm-charts&lt;/a&gt;. &lt;a href="https://twitter.com/tereza_sokol/status/1417067810430328833" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyefg79aei4rz7v5hgeco.png" title="elm-charts" alt="elm-charts" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - The Elm Radio episode #35, &lt;a href="https://elm-radio.com/episode/elm-spa-v6" rel="noopener noreferrer"&gt;elm-spa v6&lt;/a&gt;, has Ryan Haskell-Glatz discussing the latest version of elm-spa, including authenticated pages and the updated file-based router. &lt;a href="https://elm-radio.com/episode/elm-spa-v6" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #035" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Kofi Gumbs talks Code Mesh &lt;a href="https://www.youtube.com/watch?v=HV6oIXLvMn8" rel="noopener noreferrer"&gt;Teaching WebGL to Dance to Music&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Romario Fitzgerald publishes the post &lt;a href="https://sirfitz.medium.com/install-elm-0-18-0-in-2021-3f64ce298801" rel="noopener noreferrer"&gt;Install Elm 0.18.0 in 2021&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Video &lt;a href="https://www.youtube.com/watch?v=opw3_H3xFSo" rel="noopener noreferrer"&gt;S08E014 Modern Web Podcast - Elm with Richard Feldman&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=opw3_H3xFSo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3ntahdj3l0blltfv9c8.png" title="Elm with Richard Feldman" alt="Elm with Richard Feldman" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;25ᵗʰ - Elm appears on the &lt;a href="https://twitter.com/rtfeldman/status/1419460541253304321" rel="noopener noreferrer"&gt;Sunday crosswords puzzle of the NYT&lt;/a&gt;. &lt;a href="https://twitter.com/rtfeldman/status/1419460541253304321" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z7q3swa0porccf36g8h.jpeg" title="Sunday crosswords puzzle" alt="Sunday crosswords puzzle" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Éber Freitas Dias publishes the post &lt;a href="https://dev.to/eberfreitas/pelmodoro-a-pomodoro-app-built-with-elm-5d1l"&gt;Pelmodoro - a Pomodoro app built with Elm&lt;/a&gt;. &lt;a href="https://dev.to/eberfreitas/pelmodoro-a-pomodoro-app-built-with-elm-5d1l"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2sxkei1nj3tdwnvvqnh.png" title="Pelmodoro" alt="Pelmodoro" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Mario Rogic &lt;a href="https://discourse.elm-lang.org/t/lamdera-a-year-in-review-v1-0-0-paid-plans-carbon-mission-and-more/7584" rel="noopener noreferrer"&gt;talks about the release of v1.0.0 and gives a summary of what’s been happening&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/lamdera-a-year-in-review-v1-0-0-paid-plans-carbon-mission-and-more/7584" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwlx28c7atu5t4hitatk2.png" title="Lamdera" alt="Lamdera" width="800" height="308"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;29ᵗʰ - Kajetan Swiatek talks about &lt;a href="https://www.youtube.com/watch?v=zG_Hhk9Wcrw" rel="noopener noreferrer"&gt;Elm - a delightful language for learning functional programming&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=zG_Hhk9Wcrw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr1yq23pds9vlogydwar.png" title="Elm" alt="Elm" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  August 2021
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Dillon Kearns &lt;a href="https://elm-pages.com/blog/introducing-v2/" rel="noopener noreferrer"&gt;introduces elm-pages 2.0&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - &lt;a href="https://elmcraft.org/" rel="noopener noreferrer"&gt;elmcraft.org&lt;/a&gt; is planted. &lt;a href="https://elmcraft.org/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlnenqs3h2olduibyxon.png" title="elmcraft.org" alt="elmcraft.org" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2ⁿᵈ - Richard Feldman talks about &lt;a href="https://www.youtube.com/watch?v=cpQwtwVKAfU" rel="noopener noreferrer"&gt;The Edges of Cutting-Edge Languages&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=cpQwtwVKAfU" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvclee9wk1jk76jjw90w6.png" title="The Edges of Cutting-Edge Languages" alt="The Edges of Cutting-Edge Languages" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4ᵗʰ - Andy Thompson starts &lt;a href="https://github.com/pd-andy/awesome-elm-pltd" rel="noopener noreferrer"&gt;awesome-elm-pltd, a list of useful resources for programming language theory &amp;amp; development in Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Simon Lydell publishes &lt;a href="https://discourse.elm-lang.org/t/what-i-ve-learned-about-minifying-elm-code/7632" rel="noopener noreferrer"&gt;What I’ve learned about minifying Elm code&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/easier-automatic-fixes/" rel="noopener noreferrer"&gt;Easier automatic fixes in elm-review&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Robin H. Hansen &lt;a href="https://twitter.com/stabellanguage/status/1423681158475304969" rel="noopener noreferrer"&gt;releases version 0.2.1&lt;/a&gt; of &lt;a href="https://www.stabel-lang.org/" rel="noopener noreferrer"&gt;Stabel&lt;/a&gt;. &lt;a href="https://www.stabel-lang.org/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxengehemzjxmn1tq4pz.png" title="Stabel" alt="Stabel" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10ᵗʰ - Luca Mugnaini publishes the post &lt;a href="https://twitter.com/luca_mug/status/1424919472880508942" rel="noopener noreferrer"&gt;Elm at Rakuten&lt;/a&gt;. &lt;a href="https://twitter.com/luca_mug/status/1424919472880508942" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1dow64t7pe2ib2x23hl.png" title="Elm at Rakuten" alt="Elm at Rakuten" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - Maximilian Hoffmann publishes the post &lt;a href="https://medium.com/diesdas-direct/making-browser-games-more-secure-with-elm-93fcda929543" rel="noopener noreferrer"&gt;Making browser games more secure with Elm&lt;/a&gt;. &lt;a href="https://medium.com/diesdas-direct/making-browser-games-more-secure-with-elm-93fcda929543" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1k8fz0zpodyl9za2myc3.png" title="Making browser games more secure with Elm" alt="Making browser games more secure with Elm" width="800" height="473"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - The Elm Radio episode #036, &lt;a href="https://elm-radio.com/episode/elm-pages-v2" rel="noopener noreferrer"&gt;elm-pages 2.0&lt;/a&gt;, talks about elm-pages v2 that has been just released. &lt;a href="https://elm-radio.com/episode/elm-pages-v2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #36" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - The Elm Radio episode #037, &lt;a href="https://elm-radio.com/episode/performance" rel="noopener noreferrer"&gt;Performance in Elm&lt;/a&gt;, talks about performance tuning Elm applications. &lt;a href="https://elm-radio.com/episode/performance" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #037" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Dillon Kearns releases &lt;a href="https://incrementalelm.com/the-hydration-problem/" rel="noopener noreferrer"&gt;The Hydration Problem&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Michael Glass, Stöffel, and Jasper Woudenberg (NoRedInk) publish the post &lt;a href="https://blog.noredink.com/post/658510851000713216/haskell-for-the-elm-enthusiast" rel="noopener noreferrer"&gt;Haskell for the Elm Enthusiast&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;21ˢᵗ - Dillon Kearns announces &lt;a href="https://discourse.elm-lang.org/t/elm-markdown-7-0-0-with-nested-list-parsing/7690" rel="noopener noreferrer"&gt;Elm-markdown 7.0.0 with nested list parsing&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;23ʳᵈ - Tereza Sokol announces the &lt;a href="https://twitter.com/tereza_sokol/status/1429735776938496004" rel="noopener noreferrer"&gt;new look of the Elm online editor&lt;/a&gt;. &lt;a href="https://twitter.com/tereza_sokol/status/1429735776938496004" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffiiactsa3j9ucepp9o64.png" title="new look of the Elm online editor" alt="new look of the Elm online editor" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Paipo talks at the WebHack meetup #47 about &lt;a href="https://www.youtube.com/watch?v=486VuvQuFSs" rel="noopener noreferrer"&gt;Transplant an Elm in your garden&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=486VuvQuFSs" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyseb0ny9hfu4c5t4ycce.png" title="Transplant an Elm in your garden" alt="Transplant an Elm in your garden" width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Andrey Koppel talks at the Elm Online Meetup about &lt;a href="https://www.youtube.com/watch?v=93wbsfoX9iE" rel="noopener noreferrer"&gt;Implementing lambda calculus in Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=93wbsfoX9iE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkwynhl1u6ckvtulynfv.png" title="Implementing lambda calculus in Elm" alt="Implementing lambda calculus in Elm" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Jim Carlson talks at the Elm Online Meetup about &lt;a href="https://www.youtube.com/watch?v=gqeqtZeDp18" rel="noopener noreferrer"&gt;Fault-tolerant parsing and the L1 markup language&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=gqeqtZeDp18" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv6xdhzro93vds78n47f.png" title="Fault-tolerant parsing and the L1 markup language" alt="Fault-tolerant parsing and the L1 markup language" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;30ᵗʰ - The Elm Radio episode #038, &lt;a href="https://elm-radio.com/episode/lamdera" rel="noopener noreferrer"&gt;Lamdera&lt;/a&gt;, talks about Lamdera with the author Mario Rogic. Lamdera is a service that lets you build full-stack Elm apps with zero glue code. &lt;a href="https://elm-radio.com/episode/lamdera" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #038" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;31ˢᵗ - Brian Hicks publishes the post &lt;a href="https://bytes.zone/posts/tree-grepper/" rel="noopener noreferrer"&gt;tree-grepper&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  September 2021
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3ʳᵈ - Tom Wells releases the first video of the series &lt;a href="https://www.youtube.com/watch?v=KgKi5hVTvik" rel="noopener noreferrer"&gt;Pure FP Sessions - Intro to ELM&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=KgKi5hVTvik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6snw5n67wqs8icwwy2o.png" title="Pure FP Sessions - Intro to ELM" alt="Pure FP Sessions - Intro to ELM" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3ʳᵈ - James Carlson announces &lt;a href="https://twitter.com/epsilon2718/status/1433567069300301827" rel="noopener noreferrer"&gt;Booklib, an app to keep track of the books you are reading (Elm + Lamdera)&lt;/a&gt;. &lt;a href="https://twitter.com/epsilon2718/status/1433567069300301827" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2ip6nx2vcpw49v733rw.png" title="Booklib" alt="Booklib" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3ʳᵈ - Lucas Payr releases &lt;a href="https://discourse.elm-lang.org/t/leaf-a-scripting-language-for-elm/7727" rel="noopener noreferrer"&gt;Leaf - A scripting language for Elm&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/leaf-a-scripting-language-for-elm/7727" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bkauui3djp4opjhmetz.png" title="Leaf" alt="Leaf" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6ᵗʰ - Kolja Lampe releases a &lt;a href="https://elm-tooling.github.io/tree-sitter-elm/" rel="noopener noreferrer"&gt;browser UI for tree-sitter-elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6ᵗʰ - Loïc Knuchel &lt;a href="https://discourse.elm-lang.org/t/azimutt-explore-your-database-thanks-to-elm/7734" rel="noopener noreferrer"&gt;announces&lt;/a&gt; &lt;a href="https://azimutt.app/" rel="noopener noreferrer"&gt;Azimutt&lt;/a&gt;, an ERD tool to explore databases schema written in Elm. &lt;a href="https://discourse.elm-lang.org/t/azimutt-explore-your-database-thanks-to-elm/7734" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8k8mzv5k19m411lu4e50.png" title="Azimutt" alt="Azimutt" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Jesse Warden releases the video &lt;a href="https://www.youtube.com/watch?v=Ti_CdQcO3jg" rel="noopener noreferrer"&gt;JSON Decoding in Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=Ti_CdQcO3jg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu53tj5tkr9rkn1x7xf1u.png" title="JSON Decoding in Elm" alt="JSON Decoding in Elm" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;10ᵗʰ - Richard Feldman talks at Houston FPUG: &lt;a href="https://www.youtube.com/watch?v=gRFjOo-ZgK8" rel="noopener noreferrer"&gt;Millions of Users, Purely Functional Code&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=gRFjOo-ZgK8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcj3ktmxsrzpenmrpl4d.png" title="Millions of Users, Purely Functional Code" alt="Millions of Users, Purely Functional Code" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - The Elm Radio episode #039, &lt;a href="https://elm-radio.com/episode/elm-charts" rel="noopener noreferrer"&gt;elm-charts&lt;/a&gt;, has Tereza joining the episode to talk about building charts in Elm using the new elm-charts package. &lt;a href="https://elm-radio.com/episode/elm-charts" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #039" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Flavio Corpa talk at the podcast &lt;a href="https://www.buzzsprout.com/1081172/9184947-into-the-functional-world-with-flavio-corpa" rel="noopener noreferrer"&gt;Café con Tech - Into the Functional World with Flavio Corpa&lt;/a&gt;. &lt;a href="https://www.buzzsprout.com/1081172/9184947-into-the-functional-world-with-flavio-corpa" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56vzdjja0n0v50w7rcu6.png" title="Into the Functional World with Flavio Corpa" alt="Into the Functional World with Flavio Corpa" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Nick Walton &lt;a href="https://discourse.elm-lang.org/t/domain-driven-type-narrowing/7753" rel="noopener noreferrer"&gt;initiates a conversation about Domain Driven Type Narrowing&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;14ᵗʰ - Viktor Kløvedal release a &lt;a href="https://viktorstrate.github.io/qr-gen/" rel="noopener noreferrer"&gt;QR code generator&lt;/a&gt; &lt;a href="https://github.com/viktorstrate/qr-gen" rel="noopener noreferrer"&gt;made with pablohirafuji/elm-qrcode&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Andy Thompson  talks at Elm Online Meetup about &lt;a href="https://www.youtube.com/watch?v=aM4rj4e65ZM" rel="noopener noreferrer"&gt;If it's broke, fix it: programming language development in Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=aM4rj4e65ZM" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7xe2gjdpbpbpxoxxo0y.png" title="If it's broke, fix it" alt="If it's broke, fix it" width="800" height="300"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Joël Quenneville talks at Elm Online Meetup about &lt;a href="https://www.youtube.com/watch?v=dSMB3rsufC8" rel="noopener noreferrer"&gt;Inverting a binary tree with 1 line of Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=dSMB3rsufC8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5xx1c2krq0ha32pj1yp.png" title="Inverting a binary tree with 1 line of Elm" alt="Inverting a binary tree with 1 line of Elm" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Erkal Selman publishes the post &lt;a href="https://medium.com/diesdas-direct/making-browser-games-more-secure-with-elm-part-two-3ac1c228aad5" rel="noopener noreferrer"&gt;Making browser games more secure with Elm, Part Two&lt;/a&gt;. &lt;a href="https://medium.com/diesdas-direct/making-browser-games-more-secure-with-elm-part-two-3ac1c228aad5" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiotpdwssm4lctkqinn9y.png" title="Making browser games more secure with Elm, Part Two" alt="Making browser games more secure with Elm, Part Two" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16ᵗʰ - Axel Tetzlaff adds a video to the series &lt;a href="https://www.youtube.com/watch?v=b1vnT6XTFP4" rel="noopener noreferrer"&gt;Elm Tetris&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=b1vnT6XTFP4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzel5nw3esgjt3ja8znaq.png" title="Elm Tetris" alt="Elm Tetris" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;17ᵗʰ - Sam Roberts publishes the post &lt;a href="https://samgqroberts.com/posts/the-whitney-music-box-in-elm" rel="noopener noreferrer"&gt;The Whitney Music Box, in Elm&lt;/a&gt;. &lt;a href="https://samgqroberts.com/posts/the-whitney-music-box-in-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsin0cnqyhrn8o593pinr.png" title="The Whitney Music Box, in Elm" alt="The Whitney Music Box, in Elm" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;21ˢᵗ - Vincent Jousse publishes the post &lt;a href="https://vincent.jousse.org/blog/en/2021-09-21-parcel-tailwind-css-elm-lang-elm-spa" rel="noopener noreferrer"&gt;Using Parcel JS with Tailwind CSS, Elm Lang and Elm Spa&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;25ᵗʰ - Richard Feldman talks about &lt;a href="https://www.youtube.com/watch?v=6qzWm_eoUXM&amp;amp;t=9s" rel="noopener noreferrer"&gt;A Taste of Roc&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=6qzWm_eoUXM&amp;amp;t=9s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2b96fceqxi5uj60f24e.png" title="A Taste of Roc" alt="A Taste of Roc" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - The Elm Radio episode #040, &lt;a href="https://elm-radio.com/episode/phantom-builder" rel="noopener noreferrer"&gt;Phantom Builder Pattern&lt;/a&gt;, has Jeroen introducing the phantom builder pattern and how it enables new guarantees in Elm API design. &lt;a href="https://elm-radio.com/episode/phantom-builder" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #040" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/fixing-docs/" rel="noopener noreferrer"&gt;There, fixed the docs for you&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Pascal Le Merrer announces the book &lt;a href="https://twitter.com/pascallemerrer/status/1442456642608451585" rel="noopener noreferrer"&gt;Elm par la pratique (French)&lt;/a&gt;. &lt;a href="https://twitter.com/pascallemerrer/status/1442456642608451585" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9muml386noml4u5ctsjo.png" title="Elm par la pratique" alt="Elm par la pratique" width="766" height="604"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;29ᵗʰ - Brian Carroll publishes the post &lt;a href="https://dev.to/briancarroll/porting-elm-to-webassembly-2lp4"&gt;Progress about porting Elm to WebAssembly&lt;/a&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  October 2021
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Loïc Knuchel and Tereza Sokol release a video about the &lt;a href="https://www.youtube.com/watch?v=wQSQV0xzmAk" rel="noopener noreferrer"&gt;SQL parser for the Azimutt database schema explorer&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=wQSQV0xzmAk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28fglvsb9j5wuopx2180.png" title="SQL parser for the Azimutt database schema explorer" alt="SQL parser for the Azimutt database schema explorer" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - The Elm Radio episode #041, &lt;a href="https://elm-radio.com/episode/elm-markdown" rel="noopener noreferrer"&gt;elm-markdown&lt;/a&gt;, discusses the elm-markdown's approach to extensibility, the markdown specification, and some advanced uses. &lt;a href="https://elm-radio.com/episode/elm-markdown" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #041" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - Joël Quenneville publishes the post &lt;a href="https://thoughtbot.com/blog/fewer-operations-on-custom-types-is-valuable" rel="noopener noreferrer"&gt;Fewer Operations on Custom Types is Valuable&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - Xossbow showcases &lt;a href="https://twitter.com/Xossbow/status/1447331959890452480" rel="noopener noreferrer"&gt;agog.ninja, a board game written in Elm&lt;/a&gt;. &lt;a href="https://twitter.com/Xossbow/status/1447331959890452480" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffat3ibed8nzz0h66glvl.png" title="agog.ninja" alt="agog.ninja" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - Joël Quenneville publishes the post &lt;a href="https://thoughtbot.com/blog/models-that-match-reality" rel="noopener noreferrer"&gt;Models That Match Reality&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Vladimir Logachev &lt;a href="https://www.youtube.com/watch?v=xJkhxWGIfQ4" rel="noopener noreferrer"&gt;talks about Elm in a series of videos by IT Chat (Russian)&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=xJkhxWGIfQ4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtcahp4hpqge2gn6wmsu.png" title="Elm in a series of videos by IT Chat" alt="Elm in a series of videos by IT Chat" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Luca Mugnaini publishes the post &lt;a href="https://twitter.com/luca_mug/status/1448049766747705351" rel="noopener noreferrer"&gt;From dynamic to static typing in three steps&lt;/a&gt;. &lt;a href="https://twitter.com/luca_mug/status/1448049766747705351" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fie3pgugewmqrbbgi7a4j.jpeg" title="From dynamic to static typing in three steps" alt="From dynamic to static typing in three steps" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Matt "Verge" Virgin publishes a three parts post &lt;a href="https://dev.to/xeticode/using-fission-with-elm-part-1-using-vite-to-manage-elm-applications-4ahk"&gt;Using Fission with Elm&lt;/a&gt;. &lt;a href="https://dev.to/xeticode/using-fission-with-elm-part-1-using-vite-to-manage-elm-applications-4ahk"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktifjyh8r1ueaowq47ga.png" title="Using Fission with Elm" alt="Using Fission with Elm" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;14ᵗʰ - Joël Quenneville publishes the post &lt;a href="https://thoughtbot.com/blog/a-broader-take-on-parsing" rel="noopener noreferrer"&gt;A Broader Take on Parsing&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Michael Rätzel &lt;a href="https://discourse.elm-lang.org/t/introducing-elm-editor-a-web-based-ide-for-elm-programs/7824" rel="noopener noreferrer"&gt;introduces Elm Editor - a web-based IDE for Elm programs&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/introducing-elm-editor-a-web-based-ide-for-elm-programs/7824" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9ceesvqkcftyaz4khzz.png" title="introduces Elm Editor" alt="introduces Elm Editor" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Loïc Knuchel and Antoine Dauguet release a video about the &lt;a href="https://www.youtube.com/watch?v=dZOuYDiJiXI" rel="noopener noreferrer"&gt;SQL parser in Elm with Antoine Dauguet - part 2&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=dZOuYDiJiXI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhnt7pa4yrrt1y8wiv6r.png" title="SQL parser in Elm with Antoine Dauguet - part 2" alt="SQL parser in Elm with Antoine Dauguet - part 2" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;17ᵗʰ - Jesse Warden releases the video &lt;a href="https://www.youtube.com/watch?v=VJCP4_zgbPQ" rel="noopener noreferrer"&gt;Happiness in the Front-End Using Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=VJCP4_zgbPQ" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjirhxp7t863kqgrlf287.png" title="Happiness in the Front-End Using Elm" alt="Happiness in the Front-End Using Elm" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - Tereza Sokol announces that &lt;a href="https://twitter.com/tereza_sokol/status/1450394058644463616" rel="noopener noreferrer"&gt;the official Elm online playground supports installing custom dependencies&lt;/a&gt;. &lt;a href="https://twitter.com/tereza_sokol/status/1450394058644463616" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dn5o8u7h76379nrwehb.gif" title="the official Elm online playground supports installing custom dependencies" alt="the official Elm online playground supports installing custom dependencies" width="600" height="523"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Flavio Corpa publishes the post &lt;a href="https://medium.com/@FlavioCorpa/migrating-from-create-elm-app-to-parcel-2-0-71e5f2fd0e3" rel="noopener noreferrer"&gt;Migrating from create-elm-app to Parcel 2.0&lt;/a&gt;. &lt;a href="https://medium.com/@FlavioCorpa/migrating-from-create-elm-app-to-parcel-2-0-71e5f2fd0e3" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sgad9xffymsb9allseh.png" title="Migrating from create-elm-app to Parcel 2.0" alt="Migrating from create-elm-app to Parcel 2.0" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Michael Rätzel publishes the post &lt;a href="https://dev.to/viir/design-report-migrations-in-elm-fullstack-deployments-79f"&gt;Design Report - Migrations in Elm Fullstack Deployments&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;21ˢᵗ - Nicolas Perriault publishes the post &lt;a href="https://nicolas.perriault.net/code/2021/elm-result-pipeline/" rel="noopener noreferrer"&gt;Elm Result Pipeline&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;25ᵗʰ - Angus Findlay publishes the post &lt;a href="https://blog.theodo.com/2021/10/intro-to-elm-for-react-devs/" rel="noopener noreferrer"&gt;A Quick Intro to Elm for React Developers&lt;/a&gt;. &lt;a href="https://blog.theodo.com/2021/10/intro-to-elm-for-react-devs/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sofbdiwqbzvj4d9coye.png" title="A Quick Intro to Elm for React Developers" alt="A Quick Intro to Elm for React Developers" width="740" height="370"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;25ᵗʰ - Dillon Kearns publishes the post &lt;a href="https://incrementalelm.com/opaque-types-let-you-think-locally" rel="noopener noreferrer"&gt;Opaque Types Let You Think Locally&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;25ᵗʰ - The Elm Radio episode #042, &lt;a href="https://elm-radio.com/episode/ts-and-elm-type-systems" rel="noopener noreferrer"&gt;Comparing TypeScript and Elm's Type Systems&lt;/a&gt;, talks about the different type systems of TypeScript and Elm and their different goals. It dives into the different features and the philosophy behind their different designs. &lt;a href="https://elm-radio.com/episode/ts-and-elm-type-systems" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #042" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;25ᵗʰ - Jason publishes the post &lt;a href="https://dev.to/rametta/lessons-learned-from-my-first-10k-loc-in-elm-40m"&gt;Lessons learned from my first 10k LOC in Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Elm Online Meetup - Video &lt;a href="https://www.youtube.com/watch?v=E3LvpziCs0U" rel="noopener noreferrer"&gt;Color accessibility with elm-hsluv&lt;/a&gt; by Austin. &lt;a href="https://www.youtube.com/watch?v=E3LvpziCs0U" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv815unn3upix45e4lwgr.png" title="Color accessibility with elm-hsluv" alt="Color accessibility with elm-hsluv" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;26ᵗʰ - Elm Online Meetup - Video &lt;a href="https://www.youtube.com/watch?v=Trp3tmpMb-o" rel="noopener noreferrer"&gt;The phantom builder pattern&lt;/a&gt; by Jeroen Engels. &lt;a href="https://www.youtube.com/watch?v=Trp3tmpMb-o" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5bhnj7a1yv4dgfejuqu.png" title="The phantom builder pattern" alt="The phantom builder pattern" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;27ᵗʰ - &lt;a href="https://twitter.com/elm_charts/status/1453344881653469189" rel="noopener noreferrer"&gt;A new version of elm-chart is out&lt;/a&gt;. &lt;a href="https://twitter.com/elm_charts/status/1453344881653469189" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljxwgrrhzjy92dv6vx3g.gif" title="A new version of elm-chart is out" alt="A new version of elm-chart is out" width="400" height="439"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  November 2021
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2ⁿᵈ - The Technical Mindfulness blog &lt;a href="https://www.techmindful.blog/blog/emojis-in-elm" rel="noopener noreferrer"&gt;discusses parsing and displaying emojis&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3ʳᵈ - Evan Czaplicki gives a &lt;a href="https://discourse.elm-lang.org/t/status-update-3-nov-2021/7870" rel="noopener noreferrer"&gt;status update about the exploratory compiler work&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/status-update-3-nov-2021/7870" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ozj4ll6ygxbh1t7oxlo.png" title="status update about the exploratory compiler work" alt="status update about the exploratory compiler work" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;7ᵗʰ - Aaron VonderHaar &lt;a href="https://twitter.com/avh4/status/1457193199135387648" rel="noopener noreferrer"&gt;announces the release of elm-program-test 3.6.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;8ᵗʰ - The Elm Radio episode #43, &lt;a href="https://elm-radio.com/episode/teaching-elm" rel="noopener noreferrer"&gt;Teaching Elm with Richard Feldman&lt;/a&gt;, has Richard Feldman sharing some tips on how to introduce people to new Elm concepts. &lt;a href="https://elm-radio.com/episode/teaching-elm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #043" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11ᵗʰ - Martin talks at the Stockholm Elm meetup about &lt;a href="https://www.youtube.com/watch?v=lw1E9sPbq28" rel="noopener noreferrer"&gt;Audio, Elm style!&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=lw1E9sPbq28" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6u3dy4dg90lso9cf2zpw.png" title="Audio, Elm style!" alt="Audio, Elm style!" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12ᵗʰ - Dillon Kearns announces &lt;a href="https://twitter.com/dillontkearns/status/1458923521346715678" rel="noopener noreferrer"&gt;ellie-app, a tool to run Elm ellie-app examples locally&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Jeroen Engels publishes the post &lt;a href="https://jfmengels.net/stop-the-bleed/" rel="noopener noreferrer"&gt;Stop the bleed&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;15ᵗʰ - Jordane Grenat releases the first video in the series &lt;a href="https://www.youtube.com/watch?v=WToGeMIdoSY" rel="noopener noreferrer"&gt;Discovering Supabase, a Firebase alternative based on PostgreSQL&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=WToGeMIdoSY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flw94akvzmm9kxngmvduo.png" title="Discovering Supabase, a Firebase alternative based on PostgreSQL" alt="Discovering Supabase, a Firebase alternative based on PostgreSQL" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Georges Boris &lt;a href="https://twitter.com/georgesboris/status/1461039417569779714" rel="noopener noreferrer"&gt;announces the launch&lt;/a&gt; of &lt;a href="https://www.uncover.co/" rel="noopener noreferrer"&gt;uncover.co&lt;/a&gt; built with Elm and elm-pages. &lt;a href="https://twitter.com/georgesboris/status/1461039417569779714" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisj8s7hnegxht7qybko4.png" title="uncover.co" alt="uncover.co" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Richard Feldman talks about the book "Elm in Action" at &lt;a href="https://www.youtube.com/watch?v=kcRdv-wZ6Uk" rel="noopener noreferrer"&gt;GOTO Book Club Highlights&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=kcRdv-wZ6Uk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0darv81je2k7ib3gotf.png" title="GOTO Book Club Highlights" alt="GOTO Book Club Highlights" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;18ᵗʰ - Luca Mugnaini talks at the WebHack meetup #49 about &lt;a href="https://www.youtube.com/watch?v=bmo9GV14Rm8" rel="noopener noreferrer"&gt;3 years of Elm: lessons learned&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=bmo9GV14Rm8" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp33qm3wr26qhi4bjho8n.png" title="3 years of Elm: lessons learned" alt="3 years of Elm: lessons learned" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Wolfgang Schuster &lt;a href="https://github.com/withfig/autocomplete/pull/730" rel="noopener noreferrer"&gt;adds support for Elm in Fig&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - Robin Heggelund Hansen starts a series of posts about &lt;a href="https://blogg.bekk.no/successes-and-failures-in-optimizing-elms-runtime-performance-c8dc88f4e623" rel="noopener noreferrer"&gt;Successes, and failures, in optimizing Elm’s runtime performance&lt;/a&gt;. &lt;a href="https://blogg.bekk.no/successes-and-failures-in-optimizing-elms-runtime-performance-c8dc88f4e623" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7szv2klfbsr98h4jo5ve.png" title="optimizing" alt="optimizing" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;22ⁿᵈ - Jordane Grenat releases the video &lt;a href="https://www.youtube.com/watch?v=Zp4p7DiWMuA" rel="noopener noreferrer"&gt;[Code in the Unknown] Adding a "cancel" action to a chess game&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=Zp4p7DiWMuA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nv0r1xre2vvsgih1u3e.png" title="Adding a cancel action to a chess game" alt="Adding a " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;24ᵗʰ - Jonathan Reeve publishes the post &lt;a href="https://functional.works-hub.com/learn/rapid-web-prototyping-with-elm-729bc" rel="noopener noreferrer"&gt;Rapid Web Prototyping with Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - The Elm Radio episode #44, &lt;a href="https://elm-radio.com/episode/elm-webgl" rel="noopener noreferrer"&gt;elm-webgl&lt;/a&gt;, has Andrey Kuzmin walking through Elm's syntax for writing 3D shaders and using them in a type-safe way from Elm. &lt;a href="https://elm-radio.com/episode/elm-webgl" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #044" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;27ᵗʰ - Jordane Grenat talks at Conf42 JavaScript 2021 about &lt;a href="https://www.youtube.com/watch?v=IiZMILEPOa0&amp;amp;t=53s" rel="noopener noreferrer"&gt;Highway to Elm, a safer and funnier front-end world!&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=IiZMILEPOa0&amp;amp;t=53s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbv987qu4knv6xe743ix.png" title="Highway to Elm" alt="Highway to Elm" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Dillon Kearns publishes the post &lt;a href="https://incrementalelm.com/when-it-compiles-but-doesnt-work/" rel="noopener noreferrer"&gt;When It Compiles, But Doesn't Work&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Luca Mugnaini publishes the post &lt;a href="https://dev.to/lucamug/the-functional-donut-19pp"&gt;The Functional Donut&lt;/a&gt;. &lt;a href="https://dev.to/lucamug/the-functional-donut-19pp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnpmm7usjeqmstaa2xw4.png" title="The Functional Donut" alt="The Functional Donut" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;29ᵗʰ - Alex Korban publishes the post &lt;a href="https://korban.net/posts/elm/2021-11-29-elm-review-rule-generate-json-decoders/" rel="noopener noreferrer"&gt;An elm-review rule to generate JSON decoders and encoders from a JSON sample&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  December 2021
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Elm Online Meetup - Video &lt;a href="https://www.youtube.com/watch?v=D-WaKYJLsFU" rel="noopener noreferrer"&gt;Introduction to elm-charts&lt;/a&gt; by Tereza Sokol. &lt;a href="https://www.youtube.com/watch?v=D-WaKYJLsFU" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk4s35ufsz2k9jmxhg66y.png" title="Introduction to elm-charts" alt="Introduction to elm-charts" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Elm Online Meetup - Video &lt;a href="https://www.youtube.com/watch?v=paiA71sG5Pc" rel="noopener noreferrer"&gt;Peeling zeroes in Idris&lt;/a&gt; by Ju Liu. &lt;a href="https://www.youtube.com/watch?v=paiA71sG5Pc" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyax81uzwin6qoxgrpfs.png" title="Peeling zeroes in Idris" alt="Peeling zeroes in Idris" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Robin Heggelund Hansen publishes the post &lt;a href="https://blogg.bekk.no/improving-the-performance-of-record-updates-cb34cb6d4451" rel="noopener noreferrer"&gt;Improving the performance of record updates&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1ˢᵗ - Andy Thompson &lt;a href="https://github.com/ren-lang" rel="noopener noreferrer"&gt;releases version 10.0.0 of Ren&lt;/a&gt;. &lt;a href="https://github.com/ren-lang" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F185dlpwav4xa8pn1izv6.png" title="releases the Ren language" alt="releases the Ren language" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2ⁿᵈ - Ryan Haskell-Glatz starts a series of videos about &lt;a href="https://www.youtube.com/watch?v=ewgMjZAwvhY" rel="noopener noreferrer"&gt;solving Advent of Code 2021 puzzles in Elm&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=ewgMjZAwvhY" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbf1ijx52f9kpvhigwnlp.png" title="solving Advent of Code 2021 puzzles in Elm" alt="solving Advent of Code 2021 puzzles in Elm" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3ʳᵈ - Matthieu Pizenberg releases &lt;a href="https://discourse.elm-lang.org/t/elm-test-rs-v2-0-is-out-now-able-to-run-your-lamdera-tests/7957" rel="noopener noreferrer"&gt;Elm-test-rs v2.0, able to run Lamdera tests&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4ᵗʰ - A thread about &lt;a href="https://discourse.elm-lang.org/t/what-helped-you-learn-elm/7959" rel="noopener noreferrer"&gt;how we heard about Elm for the first time and what convinced us to use it&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5ᵗʰ - James Carlson publishes the post &lt;a href="https://jxxcarlson.medium.com/building-trees-with-elm-75e0dc5da35d" rel="noopener noreferrer"&gt;Building Trees with Elm&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6ᵗʰ - The Elm Radio episode #045, &lt;a href="https://elm-radio.com/episode/learning" rel="noopener noreferrer"&gt;How We Learn&lt;/a&gt;, looks at the techniques to learn Elm. &lt;a href="https://elm-radio.com/episode/learning" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #045" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;8ᵗʰ - Luca Mugnaini publishes &lt;a href="https://twitter.com/luca_mug/status/1468853346346102786" rel="noopener noreferrer"&gt;Elm's guarantees&lt;/a&gt;. &lt;a href="https://twitter.com/luca_mug/status/1468853346346102786" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulwlbis5zcxdnm1w19yg.jpeg" title="Elm's guarantees" alt="Elm's guarantees" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Robin Heggelund Hansen publishes the post &lt;a href="https://blogg.bekk.no/fixing-a-performance-problem-in-elm-using-html-lazy-c4298b72500d" rel="noopener noreferrer"&gt;Fixing a performance problem in Elm using Html.Lazy&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;13ᵗʰ - Dhruv Dang share &lt;a href="https://realfolk.com/" rel="noopener noreferrer"&gt;realfolk.com&lt;/a&gt;, &lt;a href="https://twitter.com/dhruvdang/status/1470301539445055492" rel="noopener noreferrer"&gt;a website built with Elm&lt;/a&gt;. &lt;a href="https://twitter.com/dhruvdang/status/1470301539445055492" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09t9uzybgx2245trztsr.png" title="realfolk.com" alt="realfolk.com" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;14ᵗʰ - Robin Heggelund Hansen publishes the post &lt;a href="https://blogg.bekk.no/increasing-the-performance-of-elm-css-34075512d6a6" rel="noopener noreferrer"&gt;Increasing the performance of elm-css&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;19ᵗʰ - Lindsay Wardell publishes the post &lt;a href="https://www.lindsaykwardell.com/blog/setting-up-elm-in-2022/" rel="noopener noreferrer"&gt;Setting up an Elm project in 2022&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Dillon Kearns publishes &lt;a href="https://incrementalelm.com/if-it-compiles-it-works/" rel="noopener noreferrer"&gt;What Does "If It Compiles, It Works" Really Mean?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - Noah publishes the post &lt;a href="https://derw.substack.com/p/why-derw-an-elm-like-language-that" rel="noopener noreferrer"&gt;Why Derw: an Elm-like language that compiles to TypeScript?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20ᵗʰ - The Elm Radio episode #046, &lt;a href="https://elm-radio.com/episode/2021-holiday-special/" rel="noopener noreferrer"&gt;2021 Holiday Special!&lt;/a&gt;, is out. &lt;a href="https://elm-radio.com/episode/2021-holiday-special/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji5itbebxeklcnjvzp4w.png" title="Elm Radio" alt="Elm Radio #046" width="800" height="111"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;23ᵗʰ - Sander Melnikov announces the new &lt;a href="https://twitter.com/sandy_doo/status/1473680611177025543" rel="noopener noreferrer"&gt;UI of Flux, built with Elm&lt;/a&gt;. &lt;a href="https://twitter.com/sandy_doo/status/1473680611177025543" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fianylwqbj57n11tyai01.gif" title="UI of Flux, built with Elm" alt="UI of Flux, built with Elm" width="120" height="63"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Simon Hampton publishes the post &lt;a href="https://simonh1000.github.io/2021/12/recursive-decoders/" rel="noopener noreferrer"&gt;Recursive event handler decoders&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;28ᵗʰ - Luca Mugnaini publishes Elm 2021, a year in review (&lt;a href="https://lucamug.github.io/elm-2021/header.jpeg" rel="noopener noreferrer"&gt;Header image&lt;/a&gt;). &lt;a href="https://lucamug.github.io/elm-2021/header.jpeg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fup22o7o2r2ze68du5zqd.gif" title="Elm 2021, a year in review" alt="Elm 2021, a year in review" width="720" height="305"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This is all. See you in 2022!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❤️&lt;/p&gt;

</description>
      <category>elm</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Elm's guarantees</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Tue, 07 Dec 2021 22:33:59 +0000</pubDate>
      <link>https://dev.to/lucamug/elms-guarantees-13e4</link>
      <guid>https://dev.to/lucamug/elms-guarantees-13e4</guid>
      <description>&lt;p&gt;A short reminder about the guarantees of the Elm language:&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ No Runtime Exceptions
&lt;/h2&gt;

&lt;p&gt;Thanks to the absence of null/undefined, errors treated as data, and a sound type systems, Elm guarantees that our compiled JavaScript code never throws errors at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ 100% Immutable Data
&lt;/h2&gt;

&lt;p&gt;All data in Elm is immutable. So no surprises when you need to find a bug and there is a wrong value somewhere. You can easily find who created that value.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ 100% Pure Functions
&lt;/h2&gt;

&lt;p&gt;All functions must be pure, otherwise, they don't compile. Pure functions have the usual benefits of being easy to read, easy to test, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ All Types Are Checked
&lt;/h2&gt;

&lt;p&gt;Elm is based on a provable type system so types are always correct and type annotations are always optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ No surprises when upgrading dependencies
&lt;/h2&gt;

&lt;p&gt;Elm enforces Semantic Versioning. This means that your code is guaranteed to compile also after you upgrade your dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Bonus: Guarantees also apply to all dependencies!
&lt;/h2&gt;

&lt;p&gt;All these guarantees apply not only to your code but also to all your dependencies!&lt;/p&gt;

&lt;p&gt;To learn more: &lt;a href="https://elm-lang.org/" rel="noopener noreferrer"&gt;elm-lang.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;❤️&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Header &lt;a href="https://www.pexels.com/photo/arbuckles-roasted-coffees-175747/" rel="noopener noreferrer"&gt;photograph&lt;/a&gt; by &lt;a href="https://www.pexels.com/@conojeghuo" rel="noopener noreferrer"&gt;Clem Onojeghuo&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>elm</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>typescript</category>
    </item>
    <item>
      <title>🍩 The Functional Donut 🍩</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Sun, 28 Nov 2021 01:54:24 +0000</pubDate>
      <link>https://dev.to/lucamug/the-functional-donut-19pp</link>
      <guid>https://dev.to/lucamug/the-functional-donut-19pp</guid>
      <description>&lt;p&gt;&lt;em&gt;Demo: &lt;a href="https://lucamug.github.io/elm-donut/" rel="noopener noreferrer"&gt;https://lucamug.github.io/elm-donut/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;It was about time to create a functional version of the &lt;a href="https://www.a1k0n.net/2006/09/15/obfuscated-c-donut.html" rel="noopener noreferrer"&gt;Obfuscated C Donut&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The C Donut is a 15-year-old creation by &lt;a href="https://twitter.com/a1k0n/" rel="noopener noreferrer"&gt;Andy Sloane&lt;/a&gt; that renders a rotating three-dimensional donut in a terminal using characters.&lt;/p&gt;

&lt;p&gt;I rewrote it using &lt;a href="https://elm-lang.org/" rel="noopener noreferrer"&gt;Elm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Elm is a &lt;a href="https://en.wikipedia.org/wiki/Purely_functional_programming" rel="noopener noreferrer"&gt;purely functional language&lt;/a&gt; to create web applications. It compiles into JavaScript.&lt;/p&gt;

&lt;p&gt;As per tradition, I also made an obfuscated version shaped like a donut.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://ellie-app.com/fXPnBZMFhqQa1" rel="noopener noreferrer"&gt;see it in action here&lt;/a&gt; 🍩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wql1xjb5pg5mqy58cj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wql1xjb5pg5mqy58cj8.png" title="The donut code in donut shape" alt="The donut code in donut shape" width="800" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the rest of the post, I will refer to the &lt;strong&gt;un-obfuscated&lt;/strong&gt; version of the code (&lt;a href="https://github.com/lucamug/elm-donut/blob/master/src/Main.elm" rel="noopener noreferrer"&gt;Source&lt;/a&gt;, &lt;a href="https://lucamug.github.io/elm-donut/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;, &lt;a href="https://ellie-app.com/fXPxrfTBfsfa1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt;) that doesn't have the donut shape but use the same logic.&lt;/p&gt;

&lt;p&gt;The un-obfuscated version has some extra features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start/Stop &lt;/li&gt;
&lt;li&gt;Cache system&lt;/li&gt;
&lt;li&gt;FPS setting (60 ~ 6)&lt;/li&gt;
&lt;li&gt;Speed setting&lt;/li&gt;
&lt;li&gt;Position settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdod4won8h8hz088tuee5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdod4won8h8hz088tuee5.gif" title="Animated donut" alt="Animated donut" width="600" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this post, I will explain how I converted this script to Elm. If you are interested instead in the math of the script, refer to &lt;a href="https://www.a1k0n.net/2011/07/20/donut-math.html" rel="noopener noreferrer"&gt;Donut math: how donut.c works&lt;/a&gt; by the original author, where these concepts are explained very well.&lt;/p&gt;

&lt;p&gt;This is not going to be by any means an introduction to functional programming. If you want to learn more about functional programming and the Elm language, I suggest starting with the &lt;a href="https://guide.elm-lang.org/" rel="noopener noreferrer"&gt;Elm Official Guide&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Starting from JavaScript
&lt;/h1&gt;

&lt;p&gt;I created the Elm version converting the &lt;a href="https://github.com/lucamug/elm-donut/blob/master/docs/a1k0n-originals/donut.js" rel="noopener noreferrer"&gt;JavaScript version&lt;/a&gt; of the donut.&lt;/p&gt;

&lt;p&gt;The script itself is not that complicated, but it is very imperative. It uses mutability and loops. &lt;/p&gt;

&lt;p&gt;How can we convert it into a purely functional language? But foremost...&lt;/p&gt;

&lt;h1&gt;
  
  
  What is a purely functional language?
&lt;/h1&gt;

&lt;p&gt;A purely functional language, like Elm,  is a language that &lt;a href="http://blog.jenkster.com/2015/12/what-is-functional-programming.html" rel="noopener noreferrer"&gt;supports and motivates programming with controlled side effects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Usually, this comes with immutable data and pure functions. Pure functions return the same output for the same input and cannot have any side effects.&lt;/p&gt;

&lt;p&gt;If the data is immutable, how can we have for-loops, where typically the counter &lt;code&gt;i&lt;/code&gt; mutate at each iteration?&lt;/p&gt;

&lt;p&gt;With recursion!&lt;/p&gt;

&lt;h1&gt;
  
  
  Loop = Recursion
&lt;/h1&gt;

&lt;p&gt;The JavaScript code contains three loops:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;6.28&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;6.28&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.07&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1760&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imperative loops can be converted to functional code in several ways, depending on the type of the loop. If the loop involves the items of an array, for example, functions like &lt;a href="https://package.elm-lang.org/packages/elm/core/latest/List#map" rel="noopener noreferrer"&gt;&lt;code&gt;map&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://package.elm-lang.org/packages/elm/core/latest/List#foldl" rel="noopener noreferrer"&gt;&lt;code&gt;fold&lt;/code&gt;&lt;/a&gt; can be helpful. In other cases, we reach for &lt;a href="https://functional-programming-in-elm.netlify.app/recursion/" rel="noopener noreferrer"&gt;&lt;strong&gt;recursion&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fun07qf4thl48c1sgt6ss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fun07qf4thl48c1sgt6ss.png" title="Baking powder can" alt="Baking powder can" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The label of this baking powder can, an important ingredient in donuts, is an example of recursion. &lt;a href="https://en.wikipedia.org/wiki/File:Royal_Baking_Powder.jpg" rel="noopener noreferrer"&gt;Photo&lt;/a&gt; by &lt;a href="https://commons.wikimedia.org/wiki/User:Jmabel" rel="noopener noreferrer"&gt;Joe Mabel&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because there are several loops in the original code, let's build a declarative function that is implementing the loop logic. After that, every time we need a loop, it will be enough to call this function with the proper details.&lt;/p&gt;

&lt;p&gt;A generic loop in this script needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;counter&lt;/strong&gt;, that holds the present value of the counter (that increments at each iteration)&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;max&lt;/strong&gt; limit, so that the loop can be terminated when the counter reach this limit&lt;/li&gt;
&lt;li&gt;an &lt;strong&gt;increment&lt;/strong&gt; value, to be added to the counter at each iteration&lt;/li&gt;
&lt;li&gt;some &lt;strong&gt;data&lt;/strong&gt;, to keep around for the function below&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;donut&lt;/strong&gt; (the result)&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;helper&lt;/strong&gt; function that, given the &lt;strong&gt;counter&lt;/strong&gt;, the &lt;strong&gt;data&lt;/strong&gt;, and the previous &lt;strong&gt;donut&lt;/strong&gt;, generate a new &lt;strong&gt;donut&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And will return a &lt;strong&gt;donut&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's translate this into a type annotation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
        &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;..and this is its implementation, the heart of our script that will take care of all our loops:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="c1"&gt;-- We reached the limit, we simply return&lt;/span&gt;
        &lt;span class="c1"&gt;-- the current donut&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;donut&lt;/span&gt;

    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="c1"&gt;-- Otherwise we call `loop` recursively...&lt;/span&gt;
        &lt;span class="n"&gt;loop&lt;/span&gt;
            &lt;span class="c1"&gt;-- ..after incrementing the counter...&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;increment&lt;/span&gt;

            &lt;span class="c1"&gt;-- ..and calculating a new donut...&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;
                    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
                    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;donut&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;-- ...while the rest of the data&lt;/span&gt;
            &lt;span class="c1"&gt;--    remain as it is.&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;increment&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have this utility function we can convert the JavaScript. Let's start, for example, with this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;6.28&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can write it in Elm like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;loop&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;6.28&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;-- some data&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i_loopHelper&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may seem that we created some unnecessary boilerplate compared to the JavaScript loop, but at the same time this form is more declarative and we don't need to write the logic of the loop over and over, we just pass the details about how the loop should be.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tail-call optimization
&lt;/h1&gt;

&lt;p&gt;Ok, this is all nice and well, but what happens if we iterate too many times, don't we risk a &lt;strong&gt;stack overflow&lt;/strong&gt; error?&lt;/p&gt;

&lt;p&gt;Yes, we do, but the Elm compiler is smart enough to convert a recursive call to a function back to a simple loop. (Note that &lt;a href="https://jfmengels.net/tail-call-optimization/" rel="noopener noreferrer"&gt;this may not happen if certain requirements are not met&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Out of curiosity, this is an approximation of how Elm compiles the recursive &lt;code&gt;loop&lt;/code&gt; function described above into JavaScript.&lt;/p&gt;

&lt;p&gt;From Elm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;donut&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;loop&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;increment&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;
                    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
                    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;donut&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;increment&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
            &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;helper&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To JavaScript (by the Elm compiler):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;donut&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;donut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                    &lt;span class="na"&gt;donut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;donut&lt;/span&gt;
                &lt;span class="p"&gt;}),&lt;/span&gt;
                &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the end of the day, we are going back to a code that is similar to the original JavaScript, without recursion, and with mutability. &lt;/p&gt;

&lt;p&gt;This technique is called &lt;a href="https://functional-programming-in-elm.netlify.app/recursion/tail-call-elimination.html" rel="noopener noreferrer"&gt;Tail-call optimization&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Elm is like a level of abstraction above JavaScript where all functions are pure, data is immutable, types are correct, and runtime exceptions don’t exist. Pretty neat!&lt;/p&gt;

&lt;h1&gt;
  
  
  Trivial conversion
&lt;/h1&gt;

&lt;p&gt;The rest of the conversion is trivial at this point. Just one to one coversion. For example, from Javascript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nx"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sA&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cA&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sB&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sB&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cB&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;cA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sB&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To Elm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;sp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="n"&gt;cp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cos&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="n"&gt;h&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sA&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cA&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sA&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sB&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sB&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cB&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;o&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sB&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other places requires small changes, for example this construct in JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.,-~:;=!*#$@&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Is changing both &lt;code&gt;z&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; arrays in place. This mutability is not allowed in Elm. Moreover Elm always requires an &lt;code&gt;else&lt;/code&gt; block, so this will be converted into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;79&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;zValue&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filler&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note how we return a new record here without changing the old one, also in the &lt;code&gt;else&lt;/code&gt; case, where we return a new record that is the same as the previous one.&lt;/p&gt;

&lt;h1&gt;
  
  
  Almost there
&lt;/h1&gt;

&lt;p&gt;The main function that create a donut frame is now reduced to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;donutBuilder&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;J_loopData&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
&lt;span class="n"&gt;donutBuilder&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;j_loop&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
        &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toList&lt;/span&gt;
        &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that there are type annotations throughout the code, but in Elm these are optional. The compiler is able to infer correctly all the types without annotations. The reason we add them is for better readability of the code, and also to help the compiler to give more meaningful error messages.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cache system
&lt;/h1&gt;

&lt;p&gt;In the Elm version I added a cache system, so after a few seconds, once all the 200 initial donut positions are calculated, the animation proceeds with a smaller usage of resources (see the graph below).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbya2pigv7ny45tf8rc9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbya2pigv7ny45tf8rc9k.png" title="Cache performance" alt="Cache performance" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the cache is generated, each frame is rendered well under 16 milliseconds, assuring a smooth animation at 60 frames per second on most recent devices.&lt;/p&gt;

&lt;p&gt;After the cache is generated, the CPU is mainly used to update the DOM 60 times per second.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusions
&lt;/h1&gt;

&lt;p&gt;We converted a highly dynamic, imperative code into pure and immutable code. And then we got it converted back to a highly dynamic, imperative code by the Elm compiler 🤯&lt;/p&gt;

&lt;p&gt;I tried to follow as closely as possible the original JavaScript code, I am sure that there are better ways to convert this script.&lt;/p&gt;

&lt;p&gt;For such a small piece of code, it was just a style exercise. But also in this small example, I think it is interesting to see how a safe environment where all functions are pure and all data is immutable makes the code different, more explicit if you want.&lt;/p&gt;

&lt;p&gt;This has an impact on maintainability and expandability in the long run, especially on larger projects.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed the post. Let me know your thoughts and if you have a more functional way to convert the script, add it in the comments below.&lt;/p&gt;

&lt;p&gt;❤️&lt;/p&gt;

</description>
      <category>c</category>
      <category>elm</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From dynamic to static typing in three steps</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Tue, 12 Oct 2021 22:08:44 +0000</pubDate>
      <link>https://dev.to/lucamug/three-steps-4n7</link>
      <guid>https://dev.to/lucamug/three-steps-4n7</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; Jump to the conclusions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We have been told that a robust static type system can reduce the number of bugs in our applications, transforming a 2 a.m. production issue into a red squiggly in our text editor. This is an appealing proposition.&lt;/p&gt;

&lt;p&gt;In this post, we will set the stage with some definition, a scenario, and a goal and see how this little adventure goes. We will then try to draw some conclusions.&lt;/p&gt;

&lt;h3&gt;
  
  
  What do Dynamic and Static mean?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;dynamic&lt;/strong&gt; type system is a system where types are checked at &lt;strong&gt;runtime&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;static&lt;/strong&gt; type system is a system where types are checked at &lt;strong&gt;compile time&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scenario
&lt;/h3&gt;

&lt;p&gt;Let's imagine that our code needs a simple function that returns the last element of an array (let's call it "&lt;code&gt;last&lt;/code&gt;").&lt;/p&gt;

&lt;h3&gt;
  
  
  Goal 🏁
&lt;/h3&gt;

&lt;p&gt;Our goal is to have a system that would warn us if we try to call this function with anything other than an array and also ensures that our functions accept arrays as input and return one element (or error, in case the array is empty) as output.&lt;/p&gt;

&lt;p&gt;This is the behavior we would like to get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;// Should return 2&lt;/span&gt;

&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// Should return "2"&lt;/span&gt;

&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;           &lt;span class="c1"&gt;// Should return some kind &lt;/span&gt;
                   &lt;span class="c1"&gt;// of error, because an &lt;/span&gt;
                   &lt;span class="c1"&gt;// empty array does not &lt;/span&gt;
                   &lt;span class="c1"&gt;// have a last element&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These calls instead should not be allowed by the type system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;             &lt;span class="c1"&gt;// Should not be allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;// Should not be allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// Should not be allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// Should not be allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// Should not be allowed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. JavaScript as starter
&lt;/h2&gt;

&lt;p&gt;Let's start from JavaScript. Here is our simple function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are the results of calling it. &lt;code&gt;PASS&lt;/code&gt; and &lt;code&gt;FAIL&lt;/code&gt; refer to our goal requirement stated above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;// PASS: 2&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// PASS: "2"&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;        &lt;span class="c1"&gt;// PASS: undefined&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;          &lt;span class="c1"&gt;// FAIL: Crash&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;// FAIL: undefined&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// FAIL: "2"&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// FAIL: Crash&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// FAIL: Crash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We got 3 PASSES and 5 FAILS. JavaScript does its best to keep our script running even when we send values that are not arrays, like &lt;code&gt;42&lt;/code&gt; and &lt;code&gt;"42"&lt;/code&gt;. After all, both of them yield some kind of result, so why not? But for more drastic types, like &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;, also the &lt;a href="https://en.wikipedia.org/wiki/JavaScript#Weakly_typed" rel="noopener noreferrer"&gt;weakly typed JavaScript&lt;/a&gt; fails, throwing a couple of errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uncaught TypeError: Cannot read properties
of undefined (reading 'length')

Uncaught TypeError: Cannot read properties
of null (reading 'length')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript is lacking a mechanism to warn us about a possible failure before executing the script itself. So our scripts, if not properly tested, may crash directly in our users' browsers... in production at 2 a.m.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. TypeScript to the rescue
&lt;/h2&gt;

&lt;p&gt;TypeScript is a superset of JavaScript so we can recycle the same function written before and see what TypeScript has to offer, out of the box, starting with a loose setting.&lt;/p&gt;

&lt;p&gt;The difference that we see at this point is that the result of calling &lt;code&gt;last&lt;/code&gt; without arguments changed from crashing our application in JavaScript to this error in TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected 1 arguments, but got 0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an improvement! All other behaviors remain the same, but we get a new warning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parameter 'arr' implicitly has an 'any' type,
but a better type may be inferred from usage.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It seems that TypeScript tried to infer the type of this function but was not able to do it, so it defaulted to &lt;code&gt;any&lt;/code&gt;. In TypeScript, &lt;code&gt;any&lt;/code&gt; means that everything goes, no checking is done, similar to JavaScript. &lt;/p&gt;

&lt;p&gt;This are the types inferred by TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's instruct the type checker that we want this function to only accepts arrays of number or arrays of strings. In TypeScript we can do this by adding a type annotation with &lt;code&gt;number[] | string[]&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We could also have used &lt;code&gt;Array&amp;lt;number&amp;gt; | Array&amp;lt;string&amp;gt;&lt;/code&gt; instead of &lt;code&gt;number[] | string[]&lt;/code&gt;, they are the same thing.&lt;/p&gt;

&lt;p&gt;This is the behaviour now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;// PASS: 2&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// PASS: "2"&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;        &lt;span class="c1"&gt;// PASS: undefined&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;          &lt;span class="c1"&gt;// PASS: Not allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;// PASS: Not allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// PASS: Not allowed&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// FAIL: Crash&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// FAIL: Crash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is a substantial improvement! 6 PASSES and 2 FAILS.&lt;/p&gt;

&lt;p&gt;We are still getting issues with &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt;. Time to give TypeScript more power! Let's activate these flags&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;noImplicitAny&lt;/code&gt; - Enable error reporting for expressions and declarations with an implied &lt;code&gt;any&lt;/code&gt; type. Before we were only getting warnings, now we should get errors.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;strictNullChecks&lt;/code&gt; - Will make &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; to have their distinct types so that we will get a type error if we try to use them where a concrete value is expected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And boom! Our last two conditions are now met. Calling the function with either &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt; generate the error&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Argument of type 'null' is not assignable 
to parameter of type 'number[] | string[]'.

Argument of type 'undefined' is not assignable
to parameter of type 'number[] | string[]'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's look at the type annotation (you can usually see it when you mouse-hover the function name or looking at the &lt;code&gt;.D.TS&lt;/code&gt; tab if you use the online playground).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This seems slightly off as we know that the function can also return &lt;code&gt;undefined&lt;/code&gt; when we call &lt;code&gt;last&lt;/code&gt; with an empty array, as empty arrays don't have the last element. But the inferred type annotation says that only strings or numbers are returned.&lt;/p&gt;

&lt;p&gt;This can create issues if we call this function ignoring the fact that it can return undefined values, making our application vulnerable to crashes, exactly what we were trying to avoid.&lt;/p&gt;

&lt;p&gt;We can rectify the problem by providing an explicit type annotation also for the returned values&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
        &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I eventually find out that there is also a flag for this, it is called &lt;code&gt;noUncheckedIndexedAccess&lt;/code&gt;. With this flag set to true, the type &lt;code&gt;undefined&lt;/code&gt; will be inferred automatically so we can roll back our latest addition.&lt;/p&gt;

&lt;p&gt;One extra thing. What if we want to use this function with a list of booleans? Is there a way to tell this function that any type of array is fine? ("any" is intended here as the English word "any" and not the TypeScript type &lt;code&gt;any&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Let's try with Generics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, now &lt;code&gt;boolean&lt;/code&gt; and possibly other types are accepted. the final type annotation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: If you get some error while using Generics like, for example, &lt;code&gt;Cannot find name 'T'&lt;/code&gt;, is probably caused by the JSX interpreter. I think it gets confused thinking that &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; is HTML. In the online playground, you can disable it by choosing &lt;code&gt;none&lt;/code&gt; in &lt;code&gt;TS Config &amp;gt; JSX&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To be pedantic, it seems that we still have a small problem here. If we call &lt;code&gt;last&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;            &lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We get back the same value even though the arguments we used to call the function were different. This means that if &lt;code&gt;last&lt;/code&gt; returns &lt;code&gt;undefined&lt;/code&gt;, we cannot be 100% confident that the input argument was an empty array, it could have been an array with an undefined value at the end.&lt;/p&gt;

&lt;p&gt;But it is good enough for us, so let's accept this as our final solution! 🎉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To learn more about TypeScript,  you can find excellent material on the &lt;a href="https://www.typescriptlang.org/docs/" rel="noopener noreferrer"&gt;official documentation website&lt;/a&gt;, or you can &lt;a href="https://www.typescriptlang.org/play?noUncheckedIndexedAccess=true&amp;amp;allowUnreachableCode=true&amp;amp;allowUnusedLabels=true&amp;amp;noUnusedLocals=true&amp;amp;noUnusedParameters=true&amp;amp;esModuleInterop=false&amp;amp;target=8&amp;amp;jsx=0&amp;amp;useUnknownInCatchVariables=true&amp;amp;exactOptionalPropertyTypes=true&amp;amp;noFallthroughCasesInSwitch=true&amp;amp;noImplicitOverride=true&amp;amp;noPropertyAccessFromIndexSignature=true&amp;amp;ssl=8&amp;amp;ssc=1&amp;amp;pln=10&amp;amp;pc=1#code/PTAEGMHsDsGcBdQBsCGDQF5QCgSn-gBQoBOJAlJgHyikkDatZAdEgKbQDm8AFqALSgAjKAC62XGChxEqdFkkEidAFyhoAVwC2AIzYNRoAD6gEJAJZd6oyhhqKlSuozqsO3PoJHjs09HMQsAB4AFSpiMjUQ61sqbABIZ1d2Ll4BYR8-SHZWSE5CAMJ6IQAaACYbcl8YWGy2XPzC+gAiIWaS0Gay5srquDqGgrR4IvgSDTYOgDMUJFg2XqycpDyhhCKNaAATNinLNi3FmoGVxuGio-7l1cLyKqX607WR5oAWbru+2uuz9ffPh6DQqbHZ7aAHAHHH7PQiaJBIT5AA" rel="noopener noreferrer"&gt;check the example of this post&lt;/a&gt;  in the online playground.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Elm for the typed-FP experience
&lt;/h2&gt;

&lt;p&gt;How is the experience of reaching the same goal using a functional language? &lt;/p&gt;

&lt;p&gt;Let's &lt;a href="https://ellie-app.com/fny8L3Nn556a1" rel="noopener noreferrer"&gt;rewrite our function in Elm&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the outcome of calling the function, for all our cases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;-- PASS: Just 2&lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2"&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;-- PASS: Just "2" &lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="kt"&gt;True&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;-- PASS: Just True &lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;           &lt;span class="c1"&gt;-- PASS: Nothing&lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;                      &lt;span class="c1"&gt;-- PASS: Not allowed&lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;                      &lt;span class="c1"&gt;-- PASS: Not allowed&lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;42"&lt;/span&gt;                    &lt;span class="c1"&gt;-- PASS: Not allowed&lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="kt"&gt;Nothing&lt;/span&gt;                 &lt;span class="c1"&gt;-- PASS: Not allowed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We got all PASS, all the code is correctly type-checked, everything works as expected out of the box. Elm could infer all the types correctly and we didn't need to give any hint to the Elm compiler. The goal is reached! 🎉&lt;/p&gt;

&lt;p&gt;How about the "pedantic" problem mentioned above? These are the results of calling &lt;code&gt;last&lt;/code&gt; with &lt;code&gt;[]&lt;/code&gt; and &lt;code&gt;[ Nothing ]&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;           &lt;span class="c1"&gt;-- Nothing&lt;/span&gt;
&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromList&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="kt"&gt;Nothing&lt;/span&gt; &lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;-- Just Nothing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nice! We got two different values so we can now discriminate between these two cases.&lt;/p&gt;

&lt;p&gt;Out of curiosity, the inferred type annotation of &lt;code&gt;last&lt;/code&gt; is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;To learn more about Elm, the &lt;a href="https://guide.elm-lang.org/" rel="noopener noreferrer"&gt;official guide&lt;/a&gt; is the perfect place to start, or you can &lt;a href="https://ellie-app.com/fny8L3Nn556a1" rel="noopener noreferrer"&gt;check the example of this post&lt;/a&gt;  in the online playground.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;This example covers only certain aspects of a type system, so it is far from being an exhaustive analysis but I think we can already extrapolate some conclusions.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Plain JavaScript is lacking any capability of warning us if something is wrong&lt;/strong&gt; before being executed. It is great for building prototypes when we only care for the happy paths, but if we need reliability better not to use it plain.&lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript
&lt;/h3&gt;

&lt;p&gt;TypeScript is a powerful tool designed to allow us to work seamlessly with the idiosyncrasies of the highly dynamic language that is JavaScript. &lt;/p&gt;

&lt;p&gt;Adding static types on top of a weakly typed dynamic language, while remaining a superset of it, is not a simple task and comes with  trade-offs.&lt;/p&gt;

&lt;p&gt;TypeScript allows certain operations that can’t be known to be safe at compile-time. When a type system has this property, it is said to be "not sound". &lt;strong&gt;TypeScript requires us to write type annotations to help to infer the correct types. TypeScript cannot prove correctness.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This also means that sometimes is necessary to fight with the TypeScript compiler to get things right.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elm
&lt;/h3&gt;

&lt;p&gt;Elm took a different approach from its inception, breaking free from JavaScript. This allowed building a language with an ergonomic and coherent type system that is baked in the language itself.&lt;/p&gt;

&lt;p&gt;The Elm type system is "sound", all types are proved correct in the entire code base, including all external dependencies (The concept of &lt;code&gt;any&lt;/code&gt; does not exist in Elm).&lt;/p&gt;

&lt;p&gt;The type system of Elm also does extra things like handling missing values and errors so the concepts of &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;throw&lt;/code&gt; and &lt;code&gt;try/catch&lt;/code&gt; are not needed. Elm also comes with immutability and purity built-in.&lt;/p&gt;

&lt;p&gt;This is how &lt;strong&gt;Elm guarantees the absence of runtime exceptions&lt;/strong&gt;, exonerating us from the responsibility of finding all cases where things can go wrong so that we can concentrate on other aspects of coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Elm, type annotations are completely optional and the inferred types are always correct&lt;/strong&gt;. We don't need to give hints to the Elm inference engine.&lt;/p&gt;

&lt;p&gt;So if the Elm compiler complains, it means that objectively there is a problem in the types.&lt;/p&gt;

&lt;p&gt;Elm is like a good assistant that does their job without asking questions but doesn't hesitate to tell us when we are wrong.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The header illustration is derived from a work by &lt;a href="https://www.freepik.com/free-vector/set-torii-gates-water_9925874.htm" rel="noopener noreferrer"&gt; Pikisuperstar&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>elm</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Elm Cheat Sheet</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Sat, 06 Mar 2021 00:03:47 +0000</pubDate>
      <link>https://dev.to/lucamug/elm-cheat-sheet-4jp4</link>
      <guid>https://dev.to/lucamug/elm-cheat-sheet-4jp4</guid>
      <description>&lt;p&gt;For a training session at work, I created a &lt;a href="https://twitter.com/luca_mug/status/1366200906606252037" rel="noopener noreferrer"&gt;Cheat Sheet for the Elm language&lt;/a&gt;. I think is a valuable reference for people that are learning Elm.&lt;/p&gt;

&lt;p&gt;Most things are there, both basics and advanced. It also contains full code examples to see the structure of a simple application implemented using The Elm Architecture.&lt;/p&gt;

&lt;p&gt;It is interesting to see how much Elm you can fit on a single page!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/luca_mug/status/1366200906606252037" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmp9jbafj42fdb071zawz.png" alt="Alt Text" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are other valuable resources to learn Elm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://guide.elm-lang.org/" rel="noopener noreferrer"&gt;The official Elm guide&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://elm-lang.org/examples" rel="noopener noreferrer"&gt;Basic examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Online sandboxes: &lt;a href="https://elm-lang.org/try" rel="noopener noreferrer"&gt;elm-lang.org/try&lt;/a&gt; and &lt;a href="https://ellie-app.com/" rel="noopener noreferrer"&gt;ellie-app.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elm-lang.org/docs/syntax" rel="noopener noreferrer"&gt;Overview of the Elm syntax&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://elm-lang.org/docs/from-javascript" rel="noopener noreferrer"&gt;Similarities between Elm and JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://faq.elm-community.org/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://elmprogramming.com/" rel="noopener noreferrer"&gt;A gentle introduction to Elm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Elm at Rakuten</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Mon, 25 Jan 2021 01:04:29 +0000</pubDate>
      <link>https://dev.to/lucamug/elm-6m8</link>
      <guid>https://dev.to/lucamug/elm-6m8</guid>
      <description>&lt;p&gt;In our team at Rakuten, &lt;strong&gt;we have been using Elm&lt;sup id="fnref1"&gt;1&lt;/sup&gt; in production for almost two years now&lt;/strong&gt;. This post is about our story, the lessons we learned, and our likes and dislikes.&lt;/p&gt;

&lt;p&gt;This post is quite long so if you prefer to see an overview, feel free to  jump to the index.&lt;/p&gt;

&lt;p&gt;Everything started in the Berlin branch of Rakuten during the summer of 2017. We were maintaining a medium-size single-page application written in Vanilla JavaScript when things started going out of control.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Our JavaScript application had global variables everywhere, and debugging was a nightmare.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fixing something in one place would break the code in several other locations. We had global variables everywhere, and debugging was a nightmare.&lt;/p&gt;

&lt;p&gt;We decided to impose some discipline and start rewriting functions in a &lt;em&gt;pure style&lt;/em&gt;&lt;sup id="fnref2"&gt;2&lt;/sup&gt; to regain some control over our application. The code was getting better, more self-contained, and simpler to understand.&lt;/p&gt;

&lt;p&gt;We were thinking: &lt;em&gt;“if we only could find a tool to enforce these rules so we wouldn’t have to rely on our self-discipline...”&lt;/em&gt; and then we came across the post &lt;em&gt;"Introduction to The Elm Architecture and How to Build our First Application"&lt;/em&gt;&lt;sup id="fnref3"&gt;3&lt;/sup&gt; published in the website css-tricks.com. It was love at first sight.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A delightful language with no runtime exceptions."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-- The Elm website &lt;sup id="fnref4"&gt;4&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elm was promising that &lt;strong&gt;all of our functions would be pure&lt;/strong&gt; by design and that there would be &lt;strong&gt;no errors at runtime&lt;/strong&gt;&lt;sup id="fnref5"&gt;5&lt;/sup&gt; anymore.&lt;/p&gt;

&lt;p&gt;Moreover, &lt;strong&gt;The Elm Architecture&lt;/strong&gt;, included in the Elm language, &lt;strong&gt;seemed an excellent way to structure an application&lt;/strong&gt;. It ended up being one of the most influential Elm ideas in the front-end world, more about this later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pb5s0o8s3pwgen0ndoa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pb5s0o8s3pwgen0ndoa.jpg" alt="The Elm Architecture" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Elm Architecture, illustration by &lt;a href="https://twitter.com/01k" rel="noopener noreferrer"&gt;Kolja Wilcke&lt;/a&gt;, licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, we started learning Elm by building some prototypes, and the first results were promising. But the technology stack was still heavily server-side based, mostly PHP, and the adoption was proceeding slowly.&lt;/p&gt;
&lt;h3&gt;
  
  
  🕒　One year later
&lt;/h3&gt;

&lt;p&gt;Fast forward one year (and move 9,000 kilometers to the right), and in the headquarters of Rakuten, in Tokyo, there was an environment where Elm would have taken root successfully.&lt;/p&gt;

&lt;p&gt;Several engineers were already pushing for a more functional-style way of writing code, and in a department heavily based on back-end APIs, there was a strong need for a decoupled way to write user interfaces.&lt;/p&gt;
&lt;h3&gt;
  
  
  🕒　Two years later
&lt;/h3&gt;

&lt;p&gt;Fast forward another couple of years, and here we are, with &lt;strong&gt;several applications in production built with Elm for a total of ~100k lines of code&lt;/strong&gt;.&lt;sup id="fnref6"&gt;6&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;These are some of our public projects made in Elm: A highly-customizable authentication and registration system used across different Rakuten services (for example &lt;a href="https://login.account.rakuten.com/sso/register?client_id=rakuten_tw01&amp;amp;redirect_uri=https%3A%2F%2Fwww.rakuten.com.tw%2Fmember%2Fdelegate&amp;amp;response_type=code&amp;amp;scope=openid+profile+email&amp;amp;ui_locales=en-UK#/registration/1" rel="noopener noreferrer"&gt;Rakuten Taiwan&lt;/a&gt; and &lt;a href="https://login.account.rakuten.com/sso/register?client_id=rakuten_sports&amp;amp;redirect_uri=https%3A%2F%2Fsports.rakuten.com%2F&amp;amp;response_type=code&amp;amp;scope=openid%2Bemail%2Bprofile&amp;amp;ui_locales=en-UK#/sign_in" rel="noopener noreferrer"&gt;Rakuten Sport&lt;/a&gt;) with different user journey requirements, a &lt;a href="https://package.elm-lang.org/packages/rakutentech/r10/latest/" rel="noopener noreferrer"&gt;UI library&lt;/a&gt; to build &lt;a href="https://ellie-app.com/dYydQR9MxNwa1" rel="noopener noreferrer"&gt;stuff like this&lt;/a&gt;, an &lt;a href="https://rakutentech.github.io/http-trinity/" rel="noopener noreferrer"&gt;HTTP library&lt;/a&gt;, the &lt;a href="https://rakutentech.github.io/" rel="noopener noreferrer"&gt;Rakuten Open Source website&lt;/a&gt; (&lt;a href="https://github.com/rakutentech/rakutentech.github.io" rel="noopener noreferrer"&gt;source code&lt;/a&gt;), a simple — but infinitely cute! — &lt;a href="https://login.account.rakuten.com/" rel="noopener noreferrer"&gt;404 error page&lt;/a&gt;, an &lt;a href="https://static.id.rakuten.co.jp/static/about_security/jpn/" rel="noopener noreferrer"&gt;informative page about security&lt;/a&gt; (in Japanese).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xwwhozphc51ongeeoyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xwwhozphc51ongeeoyf.png" alt="Credit Card Demo" width="800" height="481"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://r10.netlify.app/form_example_credit_card/" rel="noopener noreferrer"&gt;Example of a credit card form&lt;/a&gt; made using the R10 library.&lt;/em&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  Index
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Top&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What we like about Elm
&lt;/h3&gt;

&lt;p&gt;In no particular order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Guarantees&lt;/li&gt;
&lt;li&gt;Controlled state&lt;/li&gt;
&lt;li&gt;Principle of least astonishment&lt;/li&gt;
&lt;li&gt;“Making impossible states impossible”&lt;/li&gt;
&lt;li&gt;One way of doing things&lt;/li&gt;
&lt;li&gt;Stability&lt;/li&gt;
&lt;li&gt;Functional programming&lt;/li&gt;
&lt;li&gt;Enforced discipline&lt;/li&gt;
&lt;li&gt;Learnability&lt;/li&gt;
&lt;li&gt;Compiler as assistant&lt;/li&gt;
&lt;li&gt;Elm as an influencer&lt;/li&gt;
&lt;li&gt;The Elm Architecture&lt;/li&gt;
&lt;li&gt;The Elm debugger&lt;/li&gt;
&lt;li&gt;Elm-UI, the alternative to CSS/HTML&lt;/li&gt;
&lt;li&gt;Readability and Elm syntax&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;li&gt;Hiring&lt;/li&gt;
&lt;li&gt;Fast performance and small assets&lt;/li&gt;
&lt;li&gt;Content-driven static websites&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  What we don't like about Elm
&lt;/h3&gt;

&lt;p&gt;In no particular order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Not mainstream&lt;/li&gt;
&lt;li&gt;Lack of googleable resources&lt;/li&gt;
&lt;li&gt;Reinventing the wheel&lt;/li&gt;
&lt;li&gt;Mindset shift&lt;/li&gt;
&lt;li&gt;Some JavaScript and CSS are still necessary&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Other testimonies&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  What we like about Elm
&lt;/h1&gt;


&lt;h2&gt;
  
  
  1. Guarantees
&lt;/h2&gt;

&lt;p&gt;These are probably the most objective and important guarantees that Elm provides and that are difficult (impossible?) to find in other frameworks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⛔ No runtime exceptions.&lt;/li&gt;
&lt;li&gt;🗿 100% immutable data.&lt;/li&gt;
&lt;li&gt;💧 100% pure functions, also in all dependencies.&lt;/li&gt;
&lt;li&gt;♻️ 100% type inference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are tradeoffs when choices, like these above, are made. For example, is not possible to call a JavaScript function directly from Elm. If that is of paramount importance for you, Elm is not the right choice.&lt;/p&gt;

&lt;p&gt;If instead, you think that Elm guarantees are more important, then Elm is the right choice.&lt;/p&gt;

&lt;p&gt;In the section &lt;em&gt;The Limits of Elm/JS Interop&lt;/em&gt; of the Elm guide, Evan Czaplicki elaborates more on this concept.&lt;sup id="fnref7"&gt;7&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Controlled state
&lt;/h2&gt;

&lt;p&gt;JavaScript lets us do what we want with the state of a program. This can be useful for a quick prototype, but it is the precursor of bugs because it is difficult to track and understand changes in global variables.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A large fraction of the flaws in software development are due to programmers not fully understanding all the possible states their code may execute in”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-- John Carmack &lt;sup id="fnref8"&gt;8&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;All functions in Elm must be pure&lt;/strong&gt;, so they cannot hold any state, and &lt;strong&gt;all data must be immutable&lt;/strong&gt;. The entire state of your application needs to be stored in one place, by design, making your &lt;strong&gt;application simpler to comprehend and easier to debug&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The place where the state is, in Elm, is the &lt;code&gt;Model&lt;/code&gt; and it is managed by the &lt;em&gt;Elm Runtime system&lt;/em&gt;&lt;sup id="fnref9"&gt;9&lt;/sup&gt; so that 100% of the code that we write can be pure (these concepts will be explained in more detail later).&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Principle of least astonishment
&lt;/h2&gt;

&lt;p&gt;One of the ideas of Elm is that the outcome of the code should be predictable, without surprises.&lt;sup id="fnref10"&gt;10&lt;/sup&gt; For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Elm static type system&lt;/strong&gt;, discussed in detail below, removes a whole category of surprises related to dynamic typing.&lt;/li&gt;
&lt;li&gt;The Elm Package Manager supports &lt;strong&gt;Enforced Semantic Versioning&lt;/strong&gt;.&lt;sup id="fnref11"&gt;11&lt;/sup&gt; There are no surprises in PATCH releases because version numbers are enforced by a script that scans libraries detecting, for example, removal or renaming of exposed functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elm-UI&lt;/strong&gt;, a library to render views that translate developers' intents into layouts in a clear manner, discussed in detail later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Languages with &lt;strong&gt;automatic type conversion&lt;/strong&gt; (also called &lt;strong&gt;implicit type casting&lt;/strong&gt;), like JavaScript, can lead to surprises.&lt;sup id="fnref12"&gt;12&lt;/sup&gt; What happens if we add a &lt;em&gt;number&lt;/em&gt; and a &lt;em&gt;string&lt;/em&gt; together? For example, &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;"2"&lt;/code&gt;? Do we get &lt;code&gt;3&lt;/code&gt;? Do we get &lt;code&gt;"12"&lt;/code&gt;? Do we get an error? Do we get something else?&lt;/p&gt;

&lt;p&gt;Elm, in contrast, is strongly and statically typed so cases like the one mentioned above are not possible.&lt;sup id="fnref13"&gt;13&lt;/sup&gt; It is not even necessary to add &lt;em&gt;types annotations&lt;/em&gt;&lt;sup id="fnref14"&gt;14&lt;/sup&gt; because types are inferred by the Elm compiler. The type inference covers 100% of the code, including all external libraries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkineo0d35mq63bz3a2e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkineo0d35mq63bz3a2e2.png" alt="Dynamic Typing vs Static Typing" width="800" height="546"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dynamic Typing vs Static Typing, illustration by &lt;a href="https://twitter.com/01k" rel="noopener noreferrer"&gt;Kolja Wilcke&lt;/a&gt;, licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you need to create a quick proof of concept, dynamic typing may be faster and the puzzle does resemble a giraffe even if it contains mistakes. But for robust applications and correct puzzle solutions, static typing is the right way to go.&lt;/p&gt;

&lt;p&gt;TypeScript, which adds optional static typing to JavaScript and is probably one of the best things to happen to JavaScript, can partially mitigate the issues with the JavaScript dynamic type system. But being a superset of JavaScript it needs to compromise on elegance and simplicity. It also has several "blind spots".&lt;sup id="fnref15"&gt;15&lt;/sup&gt; For example, type declarations are optional (&lt;em&gt;any&lt;/em&gt; as escape hatch), inference doesn’t cover all the code, it requires &lt;em&gt;type guards&lt;/em&gt;,&lt;sup id="fnref16"&gt;16&lt;/sup&gt; JSON data is not type-checked, and not all JavaScript libraries have type annotations.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  4. “Making impossible states impossible”
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy4769bzzvavy3x7maq1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy4769bzzvavy3x7maq1.jpg" alt="Penrose Triangle" width="800" height="319"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Penrose Triangle.&lt;sup id="fnref17"&gt;17&lt;/sup&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The depth of the Elm type system allows us to model scenarios precisely, to &lt;strong&gt;make impossible states impossible&lt;/strong&gt;.&lt;sup id="fnref18"&gt;18&lt;/sup&gt; This is more a &lt;strong&gt;coding pattern&lt;/strong&gt;&lt;sup id="fnref19"&gt;19&lt;/sup&gt; rather than a language feature, and it requires a fully-fledged type system to work.&lt;/p&gt;

&lt;p&gt;To clarify, let's make an example modeling the HTTP state with a &lt;strong&gt;type alias&lt;/strong&gt;:&lt;sup id="fnref20"&gt;20&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="kt"&gt;HttpState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;strong&gt;cardinality&lt;/strong&gt; (number of possible states) for this structure is 2 x 2 x 2 = 8 because both &lt;strong&gt;Bool&lt;/strong&gt; and &lt;strong&gt;Maybe&lt;/strong&gt;&lt;sup id="fnref21"&gt;21&lt;/sup&gt; have cardinality = 2.&lt;/p&gt;

&lt;p&gt;But the possible states of the HTTP request are only three: &lt;code&gt;Loading&lt;/code&gt;, &lt;code&gt;Error&lt;/code&gt;, and &lt;code&gt;Success&lt;/code&gt;. To make these extra five impossible states impossible, we can rewrite the code using a &lt;strong&gt;custom type&lt;/strong&gt;:&lt;sup id="fnref22"&gt;22&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;HttpState&lt;/span&gt;
    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Loading&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Error&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Success&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Custom types&lt;/em&gt; are also called &lt;em&gt;Sum types&lt;/em&gt; in the sense that the cardinality is now a sum: 1 + 1 + 1 = 3. The right number of possible states.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  5. One way of doing things
&lt;/h2&gt;

&lt;p&gt;One application of this principle&lt;sup id="fnref23"&gt;23&lt;/sup&gt; is about finding the best solution to a problem and then enforcing it in the language.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The adoption of The Elm Architecture&lt;/strong&gt; as the standard way to structure web applications&lt;/li&gt;
&lt;li&gt;The linter &lt;strong&gt;Elm-Format is not configurable&lt;/strong&gt;. Therefore, all Elm code is formatted using the same style. The end of the tab vs. space war.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The principle guarantees consistency across codebases, even when they belong to different teams and organizations.&lt;/p&gt;

&lt;p&gt;Other languages and frameworks follow different principles. For example, JavaScript follows the &lt;strong&gt;“One JavaScript”&lt;/strong&gt; principle.&lt;sup id="fnref24"&gt;24&lt;/sup&gt; It means that JavaScript is not versioned and is back compatible. Back-compatibility is the precursor of "several ways of doing things."&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Stability
&lt;/h2&gt;

&lt;p&gt;A lot of work has been done to improve the Elm compiler, but the language per se has not undergone any major updates in more than four years.&lt;sup id="fnref25"&gt;25&lt;/sup&gt; Moreover, no foreseeable updates are coming soon.&lt;sup id="fnref26"&gt;26&lt;/sup&gt; The latest versions were mainly about improvements of the compiler’s performances and removal of features that were considered unnecessary or even detrimental, like the infix operator.&lt;sup id="fnref27"&gt;27&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;And this is great because we can concentrate on building great products instead of spending time updating our code to the latest release.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It seems that perfection is attained not when there is nothing more to add, but when there is nothing more to remove"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-- Antoine de Saint Exupéry&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The core modules are also very stable. Most of the action nowadays is happening in non-core modules and toolings.&lt;sup id="fnref28"&gt;28&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;We started writing Elm in version 0.18, and the transition to version 0.19&lt;sup id="fnref29"&gt;29&lt;/sup&gt; was very smooth. We had more issues with the update of the HTTP library&lt;sup id="fnref30"&gt;30&lt;/sup&gt; when, for lack of internal communication, one of our in-house dependencies was suddenly updated to HTTP 2.0, forcing us to refresh all the rest of the code in a short time.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  7. Functional programming
&lt;/h2&gt;

&lt;p&gt;Functional programming&lt;sup id="fnref31"&gt;31&lt;/sup&gt; is on the rise again! Maybe we are already in the middle of a third paradigm shift.&lt;sup id="fnref32"&gt;32&lt;/sup&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"No matter what language you work in, programming in a functional style provides benefits. You should do it whenever it is convenient, and you should think hard about the decision when it isn't convenient."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-- John Carmack &lt;sup id="fnref33"&gt;33&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Functional programming is good at handling complexity using &lt;strong&gt;function composition&lt;/strong&gt;, splitting difficult problems into manageable problems. Then the functions that solve these manageable problems are composed together to solve the original difficult problem.    &lt;/p&gt;

&lt;p&gt;Functions obtained with this process tend to be small, increasing their reusability, maintainability, and readability.&lt;/p&gt;

&lt;p&gt;An interesting fact is that Elm is acting, for many developers, as a gateway to Functional Programming, as a pedagogical tool, because it is simpler to learn than other functional languages.&lt;/p&gt;

&lt;p&gt;Recently several new functional programming languages have appeared: &lt;a href="https://youtu.be/ceynSTa1dV4" rel="noopener noreferrer"&gt;Gleam&lt;/a&gt;, &lt;a href="https://youtu.be/gCWtkvDQ2ZI" rel="noopener noreferrer"&gt;Unison&lt;/a&gt;, &lt;a href="https://youtu.be/ZnYa99QoznE?t=4765" rel="noopener noreferrer"&gt;Roc&lt;/a&gt;, &lt;a href="https://koka-lang.github.io/" rel="noopener noreferrer"&gt;Koka&lt;/a&gt;, &lt;a href="https://github.com/moonad/Formality" rel="noopener noreferrer"&gt;Formality&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is an exciting moment for functional programming.&lt;/p&gt;
&lt;h3&gt;
  
  
  Currying
&lt;/h3&gt;

&lt;p&gt;Currying is a characteristic that is found in many functional languages. In Elm, all functions are curried by default. Currying means converting a function that takes multiple arguments into a sequence of functions that take a single argument:&lt;sup id="fnref34"&gt;34&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="c1"&gt;-- &amp;lt;function&amp;gt; : number -&amp;gt; number -&amp;gt; number&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;           &lt;span class="c1"&gt;-- &amp;lt;function&amp;gt; : number -&amp;gt; number&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;         &lt;span class="c1"&gt;-- 3 : number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The main advantage of currying is the increased flexibility in combining functions, like a puzzle game done with type signatures.&lt;sup id="fnref35"&gt;35&lt;/sup&gt; For example, if you need to add 10 to the items of a list, you can write, using the &lt;code&gt;add&lt;/code&gt; function defined above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;-- Gives [11,12,13]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  8. Enforced discipline
&lt;/h2&gt;

&lt;p&gt;Purely functional languages motivate programmers to think better about the programs they are building. Although the initial development time can increase with such restrictions, the increased maintainability compensates for the effort.&lt;/p&gt;

&lt;p&gt;Elm enforces discipline on developers rather than letting developers be disciplined on their own. This fact, in conjunction with other characteristics, makes Elm a good fit for large front-end teams.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Everything that is syntactically legal will eventually end up in your codebase”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-- John Carmack &lt;sup id="fnref36"&gt;36&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another example of enforced discipline is that it is not possible to include JavaScript code in Elm libraries.&lt;sup id="fnref37"&gt;37&lt;/sup&gt; This fact means that the Elm guarantees, like no &lt;em&gt;runtime errors&lt;/em&gt;, are also valid for your dependencies.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  9. Learnability
&lt;/h2&gt;

&lt;p&gt;Elm is beginner-friendly. It doesn't mean that Elm is not sophisticated. It means that it is well designed. There are both simple constructs for beginners and complex constructs for masters. Complexity gets introduced gradually.&lt;sup id="fnref38"&gt;38&lt;/sup&gt; This concept is sometimes called "gradual learning" or "progressive disclosure of complexity".&lt;sup id="fnref39"&gt;39&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Moreover, during its evolution, features that created confusion and were not important have been removed or modified, transforming it into a lean language that is easy to learn.&lt;sup id="fnref40"&gt;40&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;To write a web application in Elm you don't need to be an expert in JavaScript, CSS, or HTML.&lt;/p&gt;

&lt;p&gt;Setting up a development environment is also simple because all tools usually needed in a “modern web” setup, like bundlers, linters, and web frameworks, in Elm are either embedded or unnecessary.&lt;sup id="fnref41"&gt;41&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;A beginner Elm developer, in our experience, can be productive in a couple of weeks and can master the language in a couple of months.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  10. Compiler as assistant
&lt;/h2&gt;

&lt;p&gt;The Elm compiler can statically analyze the code for inconsistencies and provide precise feedback to the programmer.&lt;sup id="fnref42"&gt;42&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;This feature is so crucial that it inspired a new coding style: &lt;strong&gt;Compiler Driven Development&lt;/strong&gt;. In short: change parts of the code and then let the compiler errors guide you in the rest of the task. Then rinse and repeat.&lt;sup id="fnref43"&gt;43&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;When Compiler Driven development&lt;sup id="fnref44"&gt;44&lt;/sup&gt; involves defining type signatures first, we enter the realm of &lt;strong&gt;Type Driven Development&lt;/strong&gt;.&lt;sup id="fnref45"&gt;45&lt;/sup&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If it compiles, it works” &lt;strong&gt;&lt;sup id="fnref46"&gt;46&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Best practices should be automated as much as possible and the Elm compiler is playing an important role in this direction. &lt;strong&gt;Elm makes “best practices” the default&lt;/strong&gt;.&lt;sup id="fnref47"&gt;47&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The compiler guarantees that all edge cases are covered, something difficult to achieve with hand-made unit tests. Another advantage of the compiler static analysis is that it is extremely fast and can provide the exact location of errors.&lt;sup id="fnref48"&gt;48&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/id_aa_carmack/status/735197548034412546" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9nuy9yv54ebv36fq648.png" alt="John Carmack on Elm Errors" width="800" height="581"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;John Carmack's comment about the Elm error messages.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Elm compiler produces &lt;strong&gt;state-of-the-art error messages&lt;/strong&gt; and its high standard of quality is now an inspiration for other designers of languages too.&lt;sup id="fnref49"&gt;49&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  11. Elm as an influencer
&lt;/h2&gt;

&lt;p&gt;Most technologies get influenced by existing ideas in one way or another. Elm, for example, was influenced by Haskell, Standard ML, OCaml, and F#.&lt;/p&gt;

&lt;p&gt;On the other side, Elm is influencing the front-end community and the programming industry in general, thanks to its innovative ideas.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redux&lt;/strong&gt;, the React state management system, was inspired by The Elm Architecture.&lt;sup id="fnref50"&gt;50&lt;/sup&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SwiftUI&lt;/strong&gt;, a tool to build user interfaces across all Apple platforms, was heavily inspired by The Elm Architecture and React.&lt;sup id="fnref51"&gt;51&lt;/sup&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These are other UI frameworks and libraries inspired by The Elm Architecture: &lt;a href="https://elmish.github.io/elmish/" rel="noopener noreferrer"&gt;Elmish&lt;/a&gt; | &lt;a href="https://github.com/hydux/hydux" rel="noopener noreferrer"&gt;Hydux&lt;/a&gt; | &lt;a href="https://hyperapp.dev/" rel="noopener noreferrer"&gt;Hyperapp&lt;/a&gt; | &lt;a href="https://dvajs.com/" rel="noopener noreferrer"&gt;DvaJS&lt;/a&gt; | &lt;a href="https://github.com/hecrj/iced" rel="noopener noreferrer"&gt;Iced&lt;/a&gt; | &lt;a href="https://haskell-miso.org/" rel="noopener noreferrer"&gt;Miso&lt;/a&gt; | &lt;a href="https://github.com/antoyo/relm" rel="noopener noreferrer"&gt;Realm&lt;/a&gt; | &lt;a href="https://crates.io/crates/yew/0.1.0" rel="noopener noreferrer"&gt;Yew&lt;/a&gt; | &lt;a href="https://fsbolero.io/" rel="noopener noreferrer"&gt;Bolero&lt;/a&gt; | &lt;a href="https://github.com/OvermindDL1/bucklescript-tea" rel="noopener noreferrer"&gt;Bucklescript-tea&lt;/a&gt; | &lt;a href="https://fsprojects.github.io/Fabulous/" rel="noopener noreferrer"&gt;Fabulous&lt;/a&gt; | &lt;a href="https://github.com/rizumita/Selm" rel="noopener noreferrer"&gt;Selm&lt;/a&gt; | &lt;a href="https://github.com/inamiy/SwiftElm" rel="noopener noreferrer"&gt;SwiftElm&lt;/a&gt; | &lt;a href="https://github.com/chriseidhof/tea-in-swift" rel="noopener noreferrer"&gt;Tea-in-swift&lt;/a&gt; | &lt;a href="https://github.com/guidomb/Portal" rel="noopener noreferrer"&gt;Portal&lt;/a&gt;  | &lt;a href="https://github.com/momentumworks/swift-elm" rel="noopener noreferrer"&gt;Swift-elm&lt;/a&gt; | &lt;a href="https://github.com/inamiy/Harvest" rel="noopener noreferrer"&gt;Harvest&lt;/a&gt; | &lt;a href="https://github.com/paldepind/functional-frontend-architecture" rel="noopener noreferrer"&gt;Functional-frontend-architecture&lt;/a&gt; |  &lt;a href="https://github.com/sindreij/willow" rel="noopener noreferrer"&gt;Willow&lt;/a&gt; | &lt;a href="https://seed-rs.org/" rel="noopener noreferrer"&gt;Seed&lt;/a&gt; | &lt;a href="https://act-framework.github.io/act/" rel="noopener noreferrer"&gt;Act&lt;/a&gt; | &lt;a href="https://yew.rs/" rel="noopener noreferrer"&gt;Yew&lt;/a&gt; | &lt;a href="https://github.com/gcanti/elm-ts" rel="noopener noreferrer"&gt;elm-ts&lt;/a&gt; | &lt;a href="https://devblogs.microsoft.com/dotnet/introducing-net-multi-platform-app-ui/" rel="noopener noreferrer"&gt;.NET Multi-platform App UI&lt;/a&gt; | &lt;a href="https://fsbolero.io/" rel="noopener noreferrer"&gt;Bolero&lt;/a&gt;.     &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are also several programming languages influenced by Elm: &lt;a href="https://youtu.be/ZnYa99QoznE?t=4792" rel="noopener noreferrer"&gt;Roc&lt;/a&gt; | &lt;a href="https://youtu.be/ceynSTa1dV4" rel="noopener noreferrer"&gt;Gleam&lt;/a&gt; | &lt;a href="https://darklang.com/" rel="noopener noreferrer"&gt;Dark&lt;/a&gt; | &lt;a href="https://www.play-lang.dev/" rel="noopener noreferrer"&gt;Play&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The quality of error messages provided by the Elm compiler propelled efforts by several other compilers, such as the &lt;a href="https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; and the &lt;a href="https://www.scala-lang.org/blog/2016/10/14/dotty-errors.html" rel="noopener noreferrer"&gt;Scala&lt;/a&gt; compilers, to improve their error messaging system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We now use Elm because we believe it is one of the best options for web development, and the number of tools inspired by it is a testament to its qualities. At the same time, we are keeping an eye on what is happening in the field, and we are not concerned about switching if something better becomes available.&lt;/p&gt;

&lt;p&gt;Considering how influential Elm is and the general trend toward Functional Programming, it seems that this “something better” will be something similar to Elm. So the transition, if any, should be smooth.&lt;sup id="fnref52"&gt;52&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  12. The Elm Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Elm Architecture&lt;/strong&gt; is probably the most relevant and influential innovation of Elm.&lt;sup id="fnref53"&gt;53&lt;/sup&gt; It is a &lt;strong&gt;unidirectional data flow&lt;/strong&gt;&lt;sup id="fnref54"&gt;54&lt;/sup&gt; that helps to keep your application well organized. Also, it helps you to quickly understand applications built by other developers as this is the standard way to build applications in Elm.    &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Fpost-Elm-at-Rakuten%2Fimages%2Fthe-elm-architecture.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2Fpost-Elm-at-Rakuten%2Fimages%2Fthe-elm-architecture.svg" alt="The Elm Architecture, animated" width="500" height="383"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A simple representation of the unidirectional data flows in The Elm Architecture. (Source: The Elm Guide) .&lt;sup id="fnref55"&gt;55&lt;/sup&gt; Licensed under &lt;a href="https://creativecommons.org/licenses/by-nc-nd/4.0/" rel="noopener noreferrer"&gt;CC BY-NC-ND 4.0&lt;/a&gt; &lt;a href="https://github.com/evancz/guide.elm-lang.org/blob/master/LICENSE" rel="noopener noreferrer"&gt;license&lt;/a&gt;.&lt;/em&gt;    &lt;/p&gt;

&lt;p&gt;There are three building blocks in The Elm Architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Model&lt;/code&gt; --- the state of your application, the only thing that can mutate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;view&lt;/code&gt; --- a way to turn your state into HTML&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update&lt;/code&gt; --- a way to update your state based on the &lt;code&gt;Model&lt;/code&gt; and the &lt;em&gt;messages&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we zoom in on the &lt;code&gt;Elm&lt;/code&gt; block in the diagram above, this is what we would see inside:        &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6zq86wndj9ia3lzxxs9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6zq86wndj9ia3lzxxs9.gif" alt="The Elm Architecture, animated" width="760" height="341"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How the Elm runtime system&lt;sup id="fnref56"&gt;56&lt;/sup&gt; orchestrates the infinite loop&lt;sup id="fnref57"&gt;57&lt;/sup&gt; of an Elm application using The Elm Architecture.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Elm runtime system&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waits for something to happen, for example, "a button is pressed"&lt;/li&gt;
&lt;li&gt;Converts the event into the appropriate message &lt;code&gt;Msg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sends &lt;code&gt;Msg&lt;/code&gt; and &lt;code&gt;Model&lt;/code&gt; to &lt;code&gt;update&lt;/code&gt; that will return an updated &lt;code&gt;Model&lt;/code&gt; and optional commands &lt;code&gt;Cmd&lt;/code&gt;, for example, an HTTP request&lt;/li&gt;
&lt;li&gt;Sends &lt;code&gt;Cmd&lt;/code&gt;, if any, to the &lt;em&gt;effects engine&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Sends the updated &lt;code&gt;Model&lt;/code&gt; to &lt;code&gt;view&lt;/code&gt; that will return new HTML&lt;/li&gt;
&lt;li&gt;Updates the DOM using the new HTML&lt;/li&gt;
&lt;li&gt;GOTO start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  13. The Elm debugger
&lt;/h2&gt;

&lt;p&gt;The built-in &lt;strong&gt;Elm debugger&lt;/strong&gt;&lt;sup id="fnref58"&gt;58&lt;/sup&gt; is a useful tool to debug Elm applications. It shows the state of the application and keeps track of all the messages fired during the application's life. It also gives you the ability to go back in time, creating an immediate connection to what we are coding.&lt;sup id="fnref59"&gt;59&lt;/sup&gt;    &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vzz4m45jrrfkkdhpc00.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vzz4m45jrrfkkdhpc00.gif" alt="The Elm Debugger" width="760" height="319"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Elm debugger. From the left to the right: the application; the history of messages; the current message and the model. &lt;sup id="fnref60"&gt;60&lt;/sup&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is similar to what Bret Victor showed in his famous talk "Inventing on Principle."&lt;sup id="fnref61"&gt;61&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  14. Elm-UI, the alternative to CSS/HTML
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Elm-UI&lt;/strong&gt; is &lt;strong&gt;a new language for layout and interface&lt;/strong&gt;.&lt;sup id="fnref62"&gt;62&lt;/sup&gt; It is a complete alternative to HTML and CSS. It is the most used non-core Elm library, and we use it in almost all of our projects.&lt;sup id="fnref63"&gt;63&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;It applies the Principle of least astonishment seen earlier to the design of a web page. Your intents are translated clearly in the design, a rarity using CSS, making the design process fun and quick.&lt;/p&gt;

&lt;p&gt;For example, let's suppose we have a blue box and we want to center (horizontally and vertically) an element of unknown width and height containing the text "I'm centered! 🎉" in it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gmc9swx2sk4ahyytz1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gmc9swx2sk4ahyytz1y.png" alt="Escape" width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A possible solution in HTML/CSS using Flexbox is:&lt;sup id="fnref64"&gt;64&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;.parent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"parent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;I'm centered! 🎉&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To obtain the same result in Elm-UI you would write:&lt;sup id="fnref65"&gt;65&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;centerX&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;centerY&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm centered! 🎉"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note how this solution is less verbose and our intents, &lt;code&gt;centerX&lt;/code&gt;, and &lt;code&gt;centerY&lt;/code&gt; are clearly stated, and directly applied to the element containing the text, and not to its parent.&lt;/p&gt;

&lt;p&gt;How does it work? Let’s briefly see what Elm-UI is doing behind the scenes.&lt;/p&gt;

&lt;p&gt;First of all, Elm doesn't have a separate templating language, &lt;strong&gt;the templating language for Elm is Elm&lt;/strong&gt;.&lt;sup id="fnref66"&gt;66&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For example, this block of Elm code that uses the standard Elm HTML library (not Elm-UI):&lt;sup id="fnref67"&gt;67&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm centered! 🎉"&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;generates this HTML&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;I'm centered! 🎉&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There is a one-to-one mapping between these two representations. So nothing special here.&lt;/p&gt;

&lt;p&gt;Now, using &lt;strong&gt;Elm-UI&lt;/strong&gt;, when we write:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;centerX&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;centerY&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm centered! 🎉"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Elm-UI&lt;/strong&gt; programmatically generate the following HTML (plus a bunch of CSS, omitted for brevity):&lt;sup id="fnref68"&gt;68&lt;/sup&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hc ah cx av cy s e wc"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"s t wf hf"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        I'm centered! 🎉
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Elm-UI&lt;/strong&gt; does all the heavy lifting for us, adding styling and elements to ensure that the page looks exactly the way we meant.&lt;sup id="fnref69"&gt;69&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Elm-UI&lt;/strong&gt;, the one-to-one mapping is not between the Elm code and the HTML/CSS anymore, but between the Elm code and the layout, making the outcome predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elm-UI&lt;/strong&gt; treats CSS/HTML as bytecode the same way that &lt;strong&gt;Elm&lt;/strong&gt; treats Javascript as bytecode.&lt;sup id="fnref70"&gt;70&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;It feels like a breath of fresh air after years spent learning all sorts of CSS tricks.&lt;sup id="fnref71"&gt;71&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  15. Readability and Elm syntax
&lt;/h2&gt;

&lt;p&gt;Functional languages, being declarative, allow us to concentrate on writing &lt;em&gt;what&lt;/em&gt; and not &lt;em&gt;how&lt;/em&gt;. Hiding the &lt;em&gt;how&lt;/em&gt; details make the code easier to read and understand, the “intentions” of the code became transparent. &lt;/p&gt;

&lt;p&gt;In the Elm community, writing &lt;strong&gt;readable code is considered a high priority&lt;/strong&gt;. This fact is important because, as developers, we spend more time reading code than writing code.&lt;/p&gt;

&lt;p&gt;Elm has an ML-style syntax, in contrast to the C-style syntax of Java, JavaScript, and other popular languages. It was a choice that traded familiarity with convenience and fitness,&lt;sup id="fnref72"&gt;72&lt;/sup&gt; as sometimes &lt;em&gt;familiarity hides complexity&lt;/em&gt;.&lt;sup id="fnref73"&gt;73&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;What we like about this syntax is its simplicity. Compared to C-style syntax, most parentheses, keywords, and punctuations are not necessary.&lt;/p&gt;

&lt;p&gt;For example, this is how we define &lt;code&gt;add&lt;/code&gt;, a function that adds two numbers together:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Pipeline operator
&lt;/h3&gt;

&lt;p&gt;The pipeline operator, which is also present in other languages like Elixir, F#, and (maybe) JavaScript,&lt;sup id="fnref74"&gt;74&lt;/sup&gt; can help to deal with multiple parentheses or with data flows. Let's consider this snippet that calls four nested functions:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It can be re-written with the pipeline operator as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The benefit of this style is that we don't need the closing parentheses anymore.&lt;/p&gt;

&lt;p&gt;With a reversed pipeline operator, we can re-write it in a second style to make the data flow explicit:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Pattern matching
&lt;/h3&gt;

&lt;p&gt;An example of pattern matching is the &lt;code&gt;case .. of&lt;/code&gt; that allows us to branch based on the &lt;strong&gt;custom type&lt;/strong&gt; variant. For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;TrafficLight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Green&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Yellow&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;Red&lt;/span&gt; &lt;span class="c1"&gt;-- Or Blue | Yellow | Red in Japan 🚦&lt;/span&gt;

&lt;span class="n"&gt;hexColor&lt;/span&gt; &lt;span class="n"&gt;trafficLight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;trafficLight&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;
        &lt;span class="kt"&gt;Green&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;00ff00"&lt;/span&gt;
        &lt;span class="kt"&gt;Yellow&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ffff00"&lt;/span&gt;
        &lt;span class="kt"&gt;Red&lt;/span&gt;    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ff0000"&lt;/span&gt;        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If we wanted to add a fourth variant to the color type, the compiler would force us to add that case to this construct – this is very useful.&lt;/p&gt;
&lt;h3&gt;
  
  
  Separator-leading lists
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Elm-Format&lt;/strong&gt;, the formatter of Elm, formats lists putting the separator (a comma) at the beginning of the line and not at the end. For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;trafficLights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="kt"&gt;Green&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Yellow&lt;/span&gt;
    &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Red&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This formatting style has several benefits, for example, the code looks more organized (all commas are aligned), and there are fewer merge conflicts.&lt;sup id="fnref75"&gt;75&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  16. Refactoring
&lt;/h2&gt;

&lt;p&gt;The idea that the Elm compiler is like an assistant and the fact that once the code compiles, it usually works makes refactoring a pleasant experience.&lt;/p&gt;

&lt;p&gt;An additional factor that makes refactoring easy is that being a purely functional language, &lt;strong&gt;the order in which we write the code doesn’t matter&lt;/strong&gt;.&lt;sup id="fnref76"&gt;76&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For example, in Elm, we can write:&lt;sup id="fnref77"&gt;77&lt;/sup&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elm"&gt;&lt;code&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Even if the two lines seem in the wrong order, it works well in Elm, but the same code will throw the error “&lt;em&gt;b&lt;/em&gt; is not defined” in imperative languages.&lt;sup id="fnref78"&gt;78&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Refactoring became simpler because &lt;strong&gt;we can shuffle pieces of code around&lt;/strong&gt; without warring.&lt;/p&gt;

&lt;p&gt;In our largest project, we are in the middle of a third major refactoring iteration, and we have pieces of code that are still at the first iteration and some code in the second iteration. And all of our code works well together. We are now incrementally moving all our code toward the third iteration. In Elm, you don't need to get things right from the beginning.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  17. Hiring
&lt;/h2&gt;

&lt;p&gt;Hiring for a language that is not mainstream has some downsides. For example, not many developers know it fluently.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;learning Elm is a fast process&lt;/strong&gt;. As already stated, our experience is that it takes a couple of weeks to be productive and a couple of months to master it. &lt;/p&gt;

&lt;p&gt;As a result, rather than asking “How many applicants know X?” we should better ask: “What does, knowing X, tell us about an applicant?” focusing on engineers that have the passion and are capable of adapting and learning new concepts.    &lt;/p&gt;

&lt;p&gt;Moreover, hiring for a minor technology can boost your brand as an innovative company, making you the coolest kid on the block.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  18. Fast performance and small assets
&lt;/h2&gt;

&lt;p&gt;The Elm compiler can apply several optimizations specific to the fact that Elm is a purely functional language. This leads to several benefits, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The performances of Elm applications are among the fastest. Internally Elm uses the concept of a virtual DOM, similar to React. The speed of the Elm virtual DOM is comparable to Svelte, which uses a different mechanism to update the DOM.&lt;sup id="fnref79"&gt;79&lt;/sup&gt;
&lt;/li&gt;
&lt;li&gt;The Elm compiler produces smaller assets compared to other frameworks. Among the various optimizations to achieve this result, there is the &lt;strong&gt;dead code elimination&lt;/strong&gt; with granularity to the single function that works across the entire ecosystem. If you import a large package and use only one of the functions contained, the compiler will ensure that only that function ends up in your generated code.&lt;sup id="fnref80"&gt;80&lt;/sup&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Elm compiler per se is also fast. Our bigger codebase contains ~66,500 lines of Elm code, and it compiles incrementally in 0.3 seconds and from scratch in 2.5 seconds.&lt;sup id="fnref81"&gt;81&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  19. Content-driven static websites
&lt;/h2&gt;

&lt;p&gt;Elm is not a good fit to build static websites that are mostly content-driven. In these cases, an old server-side rendered website can be a better option.&lt;/p&gt;

&lt;p&gt;On the other side, if you get to like Elm, it is hard to go back to plain JavaScript/HTML/CSS, so we experimented with Elm for static websites. There are several tools for static site generation. We used &lt;em&gt;Elm-Starter&lt;/em&gt;,&lt;sup id="fnref82"&gt;82&lt;/sup&gt; a library that transforms an Elm website into a server-side rendered PWA that is also installable, works off-line and works without JavaScript.&lt;/p&gt;

&lt;p&gt;These characteristics help to achieve good Lighthouse scores and good search engine ranking (SEO).&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h1&gt;
  
  
  What we don't like about Elm
&lt;/h1&gt;


&lt;h2&gt;
  
  
  1. Not mainstream
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxr2o2fz42t0p6r7ozqh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxr2o2fz42t0p6r7ozqh.jpg" alt="Escape" width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;If many people believe something, does it make it true? &lt;sup id="fnref83"&gt;83&lt;/sup&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;There are common issues with all technologies that are not mainstream. When they are not mainstream, it is hard to promote them, especially if decision-makers use the fallacious “appeal to popularity” argument. Something that goes along the lines of "The technology X is better than Y because it has more stars in GitHub".&lt;sup id="fnref84"&gt;84&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;We believe that arguments should be considered case by case. Sometimes not being mainstream does have related implications (see Reinventing the wheel); other times is more nuanced than it seems (see Hiring); most of the time, not being mainstream is unrelated to good qualities.&lt;sup id="fnref85"&gt;85&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;If you still need to be reassured, consider that, regardless of the popularity of Elm, many companies are using it, including several large companies like Microsoft, IBM, eBay, Ford, Amazon, Zalando, and Thoughtbot.&lt;sup id="fnref86"&gt;86&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Lack of Googleable resources
&lt;/h2&gt;

&lt;p&gt;Asking an Elm question in Google does not always yield good results.&lt;/p&gt;

&lt;p&gt;Most of the Elm public conversation happens in the Elm Slack channel&lt;sup id="fnref87"&gt;87&lt;/sup&gt; that is not visible to the Google bots.&lt;/p&gt;

&lt;p&gt;Also, another consequence is that the quantity of materials on the Stack Overflow website is limited. This fact is not always as bad as it seems.&lt;/p&gt;

&lt;p&gt;Stack Overflow sometimes suffers from having information that is not updated or still "old school," making it useless and occasionally even harmful.&lt;/p&gt;

&lt;p&gt;In the Elm Slack channel, information is always fresh, and the community is very supportive. It is just not visible, so it requires extra effort to join the Slack channel.&lt;/p&gt;

&lt;p&gt;Other times, resources are scattered and are not published with good SEO. Take, for example, this &lt;a href="https://github.com/elm/compiler/blob/master/hints/" rel="noopener noreferrer"&gt;valuable list of hints&lt;/a&gt; that seldom appear in Google results.&lt;sup id="fnref88"&gt;88&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Reinventing the wheel
&lt;/h2&gt;

&lt;p&gt;Because Elm is not a mainstream language, it is sometimes necessary to reinvent something that could otherwise have been acquired by adopting a different technology. For example, we wrote a library inspired by &lt;em&gt;react-jsonschema-form&lt;/em&gt; to create HTML forms.&lt;sup id="fnref89"&gt;89&lt;/sup&gt; &lt;/p&gt;

&lt;p&gt;This issue was more significant in the past because nowadays the number of Elm packages covers a wide spectrum of subjects.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Mindset shift
&lt;/h2&gt;

&lt;p&gt;Purely functional programming could be mind-bending and intimidating for a developer that has programmed only in an object-oriented style. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Faced with the choice between changing one’s mind and proving that there is no need to do so, almost everyone gets busy on the proof.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- John Kenneth Galbraith&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some consider this to be a benefit as it brings you out of your comfort zone and makes you think differently about programming.&lt;/p&gt;

&lt;p&gt;But for someone else is a burden and could discourage a team from adopting Elm. &lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Some JavaScript and CSS are still necessary
&lt;/h2&gt;

&lt;p&gt;Ideally, we could build an application by just writing in the Elm language. But if you need to use a third-party library not converted to Elm, we still need to use JavaScript. Doing so means entering again into the realm of possible runtime errors.&lt;/p&gt;

&lt;p&gt;Elm provides three ways to interact with external libraries: Flags, Ports, and Custom Elements.&lt;sup id="fnref90"&gt;90&lt;/sup&gt; All of them require you to write some JavaScript.&lt;/p&gt;

&lt;p&gt;In our case, for example, we must use a JavaScript library for handling payments.&lt;/p&gt;

&lt;p&gt;The required CSS, while using the library &lt;em&gt;Elm-UI&lt;/em&gt;, is limited. In our applications, we have small snippets of CSS that are mainly tricks to support IE11.&lt;/p&gt;

&lt;p&gt;Related to this, Elm is probably not a good fit for short projects that require lots of integration with third-party JavaScript libraries.&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;We mentioned some of the benefits of coding with Elm, or with a purely functional language for that matter. We also talked about the main issues.&lt;/p&gt;

&lt;p&gt;For us the benefits are overwhelming, compared to the issues, and this is why we are happy with the choice we made.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Then I came to Functional Programming … and programming was fun again!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Rúnar Bjarnason&lt;sup id="fnref91"&gt;91&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A consequence of these technical benefits is the great feeling of relaxation, not being left alone, and not being afraid of breaking things.&lt;/p&gt;

&lt;p&gt;Compared to the pre-Elm experience, coding is now more enjoyable, more productive, and without runtime errors! 🎉&lt;/p&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h1&gt;
  
  
  Other testimonies
&lt;/h1&gt;

&lt;p&gt;It is always good to hear a different opinion on every argument. Here you can find other testimonies of Elm being adopted in different companies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://exploring-better-ways.bellroy.com/our-technology-stack-and-how-we-got-here.html" rel="noopener noreferrer"&gt;Elm at Bellroy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://juliu.is/elm-at-noredink/" rel="noopener noreferrer"&gt;Elm at NoRedInk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=gT9Xu-ctNqI" rel="noopener noreferrer"&gt;Elm at Brilliant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.humio.com/whats-new/blog/why-we-chose-elm-for-humio-s-web-ui" rel="noopener noreferrer"&gt;Elm at Humio&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://elmtown.simplecast.com/episodes/it-just-goes-on-and-on-x_tpWljQ" rel="noopener noreferrer"&gt;Elm at Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=FgaoOgJ5CAU" rel="noopener noreferrer"&gt;Elm at Gizra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5WVXCy1Q88o" rel="noopener noreferrer"&gt;Elm at Ford&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=LZj_1qVURL0" rel="noopener noreferrer"&gt;Elm at Culture Amp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thoughtbot.com/blog/tags/elm" rel="noopener noreferrer"&gt;Elm at Thoughtbot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/diesdas-direct/making-browser-games-more-secure-with-elm-93fcda929543" rel="noopener noreferrer"&gt;Elm at Diesdas Digital&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/csaltos/elm-at-talenteca-289a"&gt;Elm at Talenteca&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jah2488/elm-companies#readme" rel="noopener noreferrer"&gt;Elm at other companies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Index | Top&lt;/p&gt;


&lt;h3&gt;
  
  
  Notes
&lt;/h3&gt;



&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;&lt;strong&gt;Elm&lt;/strong&gt; is a &lt;strong&gt;compiled, immutable, strongly statically typed, and purely functional&lt;/strong&gt; programming language that compiles to JavaScript. JavaScript is a &lt;strong&gt;just-in-time compiled, weakly dynamically typed, multi-paradigm&lt;/strong&gt; programming language. To know more about Elm, a good start is the &lt;a href="https://guide.elm-lang.org/" rel="noopener noreferrer"&gt;official guide&lt;/a&gt;. If you are familiar with JavaScript you can check &lt;a href="https://elm-lang.org/docs/from-javascript" rel="noopener noreferrer"&gt;From JavaScript?&lt;/a&gt; which is a short comparison between the syntax of the two languages. The Elm language, including the compiler and the core libraries, is designed and developed by Evan Czaplicki, with the support of a small core team of developers. Evan retains the final say in disputes or arguments. This setup, a common practice for the initial few years of many languages, guarantees a coherent vision and well-designed APIs. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Pure_function" rel="noopener noreferrer"&gt;Pure functions&lt;/a&gt; are those functions where the output only depends on the input and don’t have any side effects. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;The &lt;a href="https://css-tricks.com/introduction-elm-architecture-build-first-application/" rel="noopener noreferrer"&gt;Introduction to The Elm Architecture and How to Build our First Application&lt;/a&gt; by James Kolce was the second part of a three-part series published on the &lt;a href="https://css-tricks.com/" rel="noopener noreferrer"&gt;CSS-Tricks&lt;/a&gt; website in 2017. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;The &lt;a href="https://elm-lang.org/" rel="noopener noreferrer"&gt;Elm website&lt;/a&gt; is the main source of information and documentation to start with Elm. A quote about &lt;strong&gt;runtime errors&lt;/strong&gt; from the site: "&lt;em&gt;Elm uses type inference to detect corner cases and give friendly hints. NoRedInk switched to Elm about two years ago, and 250k+ lines later, they still have not had to scramble to fix a confusing runtime exception in production.&lt;/em&gt;"  ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;In the front-end, &lt;strong&gt;errors at runtime&lt;/strong&gt; are errors that happen in the browser. These errors can completely halt the functionality of the website and you, as the creator, may not even know about them because they are happening on other peoples' devices. Some tools allow you to get notified when these errors happen. These errors are usually JavaScript errors, for example, trying to access values that are null or undefined.  ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;Even if it is almost two years old now, some more details about the use of Elm at Rakuten can be found in my talk &lt;a href="https://youtu.be/yH6o322S8XQ" rel="noopener noreferrer"&gt;Elm at large (companies)&lt;/a&gt; given at the &lt;strong&gt;Oslo Elm Day 2019&lt;/strong&gt; conference. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn7"&gt;
&lt;p&gt;In this &lt;a href="https://guide.elm-lang.org/interop/limits.html" rel="noopener noreferrer"&gt;section of the Elm guide&lt;/a&gt;, Evan Czaplicki explains what are the tradeoffs of Elm guarantees. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn8"&gt;
&lt;p&gt;A quote from an in-depth piece by &lt;strong&gt;John Carmack&lt;/strong&gt; that looks at &lt;a href="https://www.gamasutra.com/view/news/169296/Indepth_Functional_programming_in_C.php" rel="noopener noreferrer"&gt;the value of using functional-style programming with C++&lt;/a&gt;. John Carmack is an independent AI researcher, consultant CTO at &lt;strong&gt;Oculus VR&lt;/strong&gt;, and founder of &lt;strong&gt;Armadillo Aerospace&lt;/strong&gt; and &lt;strong&gt;Id Software&lt;/strong&gt;, where he was the lead programmer of the games &lt;strong&gt;Commander Keen&lt;/strong&gt;, &lt;strong&gt;Wolfenstein 3D&lt;/strong&gt;, &lt;strong&gt;Doom&lt;/strong&gt;, and &lt;strong&gt;Quake&lt;/strong&gt;. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn9"&gt;
&lt;p&gt;The &lt;a href="https://guide.elm-lang.org/effects/" rel="noopener noreferrer"&gt;Elm runtime system&lt;/a&gt; is the part of the code in charge of directing the application. For example, it figures out how to render HTML, how to send an HTTP request, redirect users' clicks back into the Elm code, etc.   ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn10"&gt;
&lt;p&gt;The &lt;a href="https://wiki.c2.com/?PrincipleOfLeastAstonishment#:~:text=The%20Principle%20of%20Least%20Astonishment,the%20operation%20and%20other%20clues.&amp;amp;text=In%20addition%20to%20function%20naming,applies%20to%20user%20interface%20design." rel="noopener noreferrer"&gt;Principle of Least Astonishment&lt;/a&gt; states that the result of performing some operation should be &lt;strong&gt;obvious&lt;/strong&gt;, &lt;strong&gt;consistent&lt;/strong&gt;, and &lt;strong&gt;predictable&lt;/strong&gt;, based upon the name of the operation and other clues. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn11"&gt;
&lt;p&gt;The Elm Package Manager allows you to check differences (functions added/removed/modified) in any published Elm package simply by running the command &lt;code&gt;elm diff&lt;/code&gt; like in &lt;code&gt;elm diff elm/json 1.0.0 1.1.2&lt;/code&gt;. Evan Czaplicki gives a live example of this feature in the video &lt;a href="https://youtu.be/jl1tGiUiTtI" rel="noopener noreferrer"&gt;Convergent Evolution&lt;/a&gt;. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn12"&gt;
&lt;p&gt;There are several funny videos about this topic on YouTube. One of the most popular is probably &lt;a href="https://youtu.be/2pL28CcEijU" rel="noopener noreferrer"&gt;What the... JavaScript?&lt;/a&gt; by Kyle Simpsons ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn13"&gt;
&lt;p&gt;Note that Elm requires explicit conversion between &lt;em&gt;integers&lt;/em&gt; and &lt;em&gt;floating&lt;/em&gt; numbers. Someone find this cumbersome. This explicit conversion is necessary to make the Elm compiler faster. You can read more about this in the &lt;a href="https://github.com/elm/compiler/blob/master/hints/implicit-casts.md" rel="noopener noreferrer"&gt;Implicit Casts&lt;/a&gt; article. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn14"&gt;
&lt;p&gt;Type annotations in Elm are not required but are considered good practice to add them. It helps the compiler to provide more precise errors and also to detect bugs, like in the case of &lt;a href="https://github.com/elm/compiler/blob/master/hints/infinite-type.md" rel="noopener noreferrer"&gt;Infinite Types&lt;/a&gt;. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn15"&gt;
&lt;p&gt;The article &lt;a href="https://incrementalelm.com/tips/typescript-blind-spots/" rel="noopener noreferrer"&gt;TypeScript's Blind Spots&lt;/a&gt; by Dillon Kearns illustrates several weak points of TypeScript. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn16"&gt;
&lt;p&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html" rel="noopener noreferrer"&gt;Type guards&lt;/a&gt; are TypeScript expressions that perform a runtime check to discriminate between &lt;em&gt;custom types&lt;/em&gt;. For example:&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;

&lt;p&gt;After that is possible to write code like:&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
&lt;br&gt;
  &lt;br&gt;
&lt;/div&gt;

In Elm &lt;em&gt;type guards&lt;/em&gt; are not needed, it is possible to just directly use a &lt;a href="https://guide.elm-lang.org/types/pattern_matching.html" rel="noopener noreferrer"&gt;case .. of&lt;/a&gt; construct&lt;div class="ltag_gist-liquid-tag"&gt;
&lt;br&gt;
  &lt;br&gt;
&lt;/div&gt;

The &lt;strong&gt;case .. of&lt;/strong&gt; construct also guarantees that we are considering all possible custom types. ↩
&lt;/li&gt;


&lt;li id="fn17"&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Penrose_triangle" rel="noopener noreferrer"&gt;Penrose Triangle&lt;/a&gt; is a triangular impossible object. Illustration made with Elm and &lt;a href="https://package.elm-lang.org/packages/evancz/elm-playground/latest/" rel="noopener noreferrer"&gt;Elm-Playground&lt;/a&gt;, &lt;a href="https://ellie-app.com/bZVgZf8GJvja1" rel="noopener noreferrer"&gt;here the source code&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn18"&gt;

&lt;p&gt;The concept of &lt;strong&gt;making impossible states impossible&lt;/strong&gt; is well explained by &lt;a href="https://youtu.be/IcgmSRJHu_8" rel="noopener noreferrer"&gt;Richard Feldman in his homonymous talk at Elm-conf 2016&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn19"&gt;

&lt;p&gt;These &lt;a href="https://sporto.github.io/elm-patterns/index.html" rel="noopener noreferrer"&gt;coding patterns in Elm&lt;/a&gt; are considered good practice. &lt;a href="https://sporto.github.io/elm-patterns/basic/impossible-states.html" rel="noopener noreferrer"&gt;Making impossible states impossible&lt;/a&gt; is one of them. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn20"&gt;

&lt;p&gt;A &lt;a href="https://guide.elm-lang.org/types/type_aliases.html" rel="noopener noreferrer"&gt;&lt;code&gt;type alias&lt;/code&gt;&lt;/a&gt; is a shorter name for a type. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn21"&gt;

&lt;p&gt;The type &lt;a href="https://guide.elm-lang.org/error_handling/maybe.html" rel="noopener noreferrer"&gt;&lt;code&gt;Maybe&lt;/code&gt;&lt;/a&gt; is how Elm handles missing values because &lt;strong&gt;null&lt;/strong&gt; or &lt;strong&gt;undefined&lt;/strong&gt; don't exist. Maybe is defined as &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 The Elm compiler will refuse to compile until you handle all the cases where a value may be missing in your code. ↩


&lt;/li&gt;


&lt;li id="fn22"&gt;

&lt;p&gt;As Evan Czaplicki put it, “&lt;a href="https://guide.elm-lang.org/types/custom_types.html" rel="noopener noreferrer"&gt;Custom types are the most important feature in Elm&lt;/a&gt;”. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn23"&gt;

&lt;p&gt;This principle is also mentioned in the &lt;a href="https://en.wikipedia.org/wiki/Zen_of_Python" rel="noopener noreferrer"&gt;Zen of Python&lt;/a&gt;: "There should be one — and preferably only one — obvious way to do it." ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn24"&gt;

&lt;p&gt;The &lt;a href="https://2ality.com/2014/12/one-javascript.html" rel="noopener noreferrer"&gt;One JavaScript&lt;/a&gt; principle is about removing versioning and being always back-compatible. This fact, combined with ten days of design and 25 years of back compatibility, inevitably accumulated a large number of different ways of doing things. For example, defining a function can be done in &lt;a href="https://dmitripavlutin.com/6-ways-to-declare-javascript-functions/" rel="noopener noreferrer"&gt;several different ways&lt;/a&gt;.  ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn25"&gt;

&lt;p&gt;The latest large change was the &lt;a href="https://elm-lang.org/news/farewell-to-frp" rel="noopener noreferrer"&gt;Farewell to Functional Reactive Programming&lt;/a&gt; in May 2016. Here a &lt;a href="https://elm-lang.org/news" rel="noopener noreferrer"&gt;high-level picture of the updates&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn26"&gt;

&lt;p&gt;&lt;a href="https://github.com/elm/compiler/blob/master/roadmap.md" rel="noopener noreferrer"&gt;Evan Czaplicki's ideas about the future of Elm&lt;/a&gt;.     ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn27"&gt;

&lt;p&gt;The infix operator has been removed because it was leading to unreadable code due to the creation of fancy non-standard operators. This is a longer explanation of &lt;a href="https://gist.github.com/evancz/769bba8abb9ddc3bf81d69fa80cc76b1" rel="noopener noreferrer"&gt;why the infix operators were removed&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn28"&gt;

&lt;p&gt;The feed that shows all the &lt;a href="https://elm-greenwood.com/" rel="noopener noreferrer"&gt;updates done on Elm packages&lt;/a&gt; is a good way to measure the activity that is happening on Elm libraries. Again, this activity should not be confused with the adoption of the language. Stable libraries tend not to be updated often. You will seldom see a core library in the feed. Sometimes there are complaints about lack of transparency about the work done on the compiler and core modules. &lt;a href="https://github.com/elm/expectations" rel="noopener noreferrer"&gt;Elm does not follow the standard "open source" culture in certain ways&lt;/a&gt; and most of the core work is done on a private repository. If you are interested in supporting the language, the best way is by &lt;a href="https://discourse.elm-lang.org/t/what-is-constructive-input/977" rel="noopener noreferrer"&gt;getting involved in its community and contributing to the ecosystem&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn29"&gt;

&lt;p&gt;The &lt;a href="https://elm-lang.org/news/small-assets-without-the-headache" rel="noopener noreferrer"&gt;update from version 0.18 to version 0.19&lt;/a&gt; was mainly about the optimization of the compiler. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn30"&gt;

&lt;p&gt;&lt;a href="https://github.com/elm/http/releases/tag/2.0.0" rel="noopener noreferrer"&gt;The update of the HTTP library&lt;/a&gt; is probably the latest large update within the core modules. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn31"&gt;

&lt;p&gt;&lt;strong&gt;Functional programming&lt;/strong&gt; is a programming paradigm where programs are constructed by applying and composing functions. It is a &lt;strong&gt;declarative&lt;/strong&gt; programming paradigm based on a sequence of functions that only depend on each other in terms of arguments and return values. It looks something like this:&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
By contrast, the &lt;strong&gt;procedural paradigm&lt;/strong&gt; is based on a sequence of &lt;strong&gt;imperative&lt;/strong&gt; commands that may implicitly alter the shared state. It looks something like this:&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 ↩


&lt;/li&gt;


&lt;li id="fn32"&gt;

&lt;p&gt;&lt;a href="https://youtu.be/6YbK8o9rZfI?t=67" rel="noopener noreferrer"&gt;From Object Orient to Functional Programming&lt;/a&gt;, talk by Richard Feldman about paradigm shifts. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn33"&gt;

&lt;p&gt;&lt;a href="https://www.gamasutra.com/view/news/169296/Indepth_Functional_programming_in_C.php" rel="noopener noreferrer"&gt;In-depth: Functional programming in C++&lt;/a&gt; by John Carmack. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn34"&gt;

&lt;p&gt;Out of curiosity, the closest equivalent in JavaScript of the Elm function &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 that also supports currying, is &lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 That is mostly syntactic sugar for &lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 To learn more about how &lt;em&gt;currying&lt;/em&gt; and how functions are defined in Elm, I recommend reading &lt;a href="https://gist.github.com/mauroc8/fdb9ac1e46639348549d1286215ee793" rel="noopener noreferrer"&gt;Functions in Elm&lt;/a&gt;. ↩


&lt;/li&gt;


&lt;li id="fn35"&gt;

&lt;p&gt;Passing a smaller number of arguments to a function, like in &lt;code&gt;add 10&lt;/code&gt;, is called &lt;strong&gt;partial application&lt;/strong&gt; and it opens the door to interesting coding techniques. If you squint, it is like &lt;em&gt;dependency injection&lt;/em&gt; where the &lt;code&gt;10&lt;/code&gt; is the injected part. Scott Wlaschin explains this and other patterns in his talk &lt;a href="https://youtu.be/srQt1NAHYC0?t=2077" rel="noopener noreferrer"&gt;Functional Design Patterns&lt;/a&gt;.  ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn36"&gt;

&lt;p&gt;John Carmack during his &lt;a href="https://youtu.be/Uooh0Y9fC_M?t=5488" rel="noopener noreferrer"&gt;Keynote&lt;/a&gt; at QuakeCon 2013  ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn37"&gt;

&lt;p&gt;A loophole that allowed using JavaScript in libraries was &lt;a href="https://discourse.elm-lang.org/t/native-code-in-0-19/826" rel="noopener noreferrer"&gt;closed in version 0.19&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn38"&gt;

&lt;p&gt;For example &lt;em&gt;sandbox&lt;/em&gt;, &lt;em&gt;element&lt;/em&gt;, &lt;em&gt;document&lt;/em&gt;, and &lt;em&gt;application&lt;/em&gt; in &lt;a href="https://package.elm-lang.org/packages/elm/browser/latest/Browser" rel="noopener noreferrer"&gt;Elm-Browser&lt;/a&gt;; &lt;em&gt;get&lt;/em&gt;, &lt;em&gt;post&lt;/em&gt;, and &lt;em&gt;request&lt;/em&gt; in &lt;a href="https://package.elm-lang.org/packages/elm/http/latest/Http" rel="noopener noreferrer"&gt;Elm-HTTP&lt;/a&gt;; &lt;em&gt;picture&lt;/em&gt;, &lt;em&gt;animation&lt;/em&gt;, and &lt;em&gt;game&lt;/em&gt; in &lt;a href="https://package.elm-lang.org/packages/evancz/elm-playground/latest/Playground" rel="noopener noreferrer"&gt;Elm-Playground&lt;/a&gt;; etc. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn39"&gt;

&lt;p&gt;Chris Krycho talks about it in the article &lt;a href="https://v5.chriskrycho.com/journal/progressive-disclosure-of-complexity-and-typed-fp-languages/" rel="noopener noreferrer"&gt;Progressive Disclosure of Complexity and Typed FP Languages&lt;/a&gt;  while Evan Czaplicki explains this concept in the talk &lt;a href="https://youtu.be/oYk8CKH7OhE" rel="noopener noreferrer"&gt;Let's be mainstream&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn40"&gt;

&lt;p&gt;Other features are simply not added as the design of Elm languages was focused on users. For example type classes. As Evan Czaplicki explains in &lt;a href="https://youtu.be/oYk8CKH7OhE?t=2310" rel="noopener noreferrer"&gt;Let's be mainstream! User-focused design in Elm&lt;/a&gt;, "If you are going to give away simplicity, you better be doing it for a very good reason". ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn41"&gt;

&lt;p&gt;You can start experimenting with Elm using &lt;a href="https://elmprogramming.com/elm-reactor.html" rel="noopener noreferrer"&gt;elm reactor&lt;/a&gt;, a web server built-in the Elm compiler that automatically re-compiles your code every time you refresh the browser. For more advanced coding there is &lt;a href="https://github.com/wking-io/elm-live" rel="noopener noreferrer"&gt;Elm-Live&lt;/a&gt;, a web server that supports custom HTML and hot reload. &lt;code&gt;Elm-Live&lt;/code&gt; is what we use for our team. You can also use the usual suspects, like Webpack or Parcel. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn42"&gt;

&lt;p&gt;The idea of the &lt;a href="https://elm-lang.org/news/compilers-as-assistants" rel="noopener noreferrer"&gt;Compiler as Assistant&lt;/a&gt; was born together with Elm itself. In this article, Evan Czaplicki explains the further improvement in this direction done for version 0.16. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn43"&gt;

&lt;p&gt;&lt;a href="https://medium.com/@dillonkearns/moving-faster-with-tiny-steps-in-elm-2e6a269e4efc" rel="noopener noreferrer"&gt;Moving Faster with Tiny Steps in Elm&lt;/a&gt; by Dillon Kearns ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn44"&gt;

&lt;p&gt;Kevin Yank explains what is Compiler Driven Development &lt;a href="https://youtu.be/kuOCx0QeQ5c?t=1402" rel="noopener noreferrer"&gt;in this video&lt;/a&gt;. Louis Pilfold explains &lt;a href="https://youtu.be/ceynSTa1dV4?t=987" rel="noopener noreferrer"&gt;how a compiler can be an assistant during software development&lt;/a&gt;, referring to BEAM, a language inspired by Elm. And this is yet &lt;a href="https://youtu.be/jl1tGiUiTtI?t=1219" rel="noopener noreferrer"&gt;another sample of Compiler Driven Development&lt;/a&gt; during one of the talks of Evan Czaplicki. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn45"&gt;

&lt;p&gt;&lt;a href="https://www.idris-lang.org/" rel="noopener noreferrer"&gt;Idris&lt;/a&gt; is probably the fittest language for Type Drive Development. Idris has the feature of &lt;em&gt;&lt;a href="http://docs.idris-lang.org/en/latest/elaboratorReflection/holes.html" rel="noopener noreferrer"&gt;holes&lt;/a&gt;&lt;/em&gt;, while Elm can use &lt;em&gt;&lt;a href="https://package.elm-lang.org/packages/elm/core/latest/Debug#todo" rel="noopener noreferrer"&gt;Debug.todo&lt;/a&gt;&lt;/em&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn46"&gt;

&lt;p&gt;This way of saying probably &lt;a href="https://wiki.haskell.org/Why_Haskell_just_works" rel="noopener noreferrer"&gt;originated in Haskell&lt;/a&gt; but it applies to Elm too. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn47"&gt;

&lt;p&gt;An example of &lt;strong&gt;Elm making “best practices” the default&lt;/strong&gt;, is about &lt;strong&gt;variable shadowing&lt;/strong&gt; (same variable name defined twice in an ambiguous way). While most linters produce warnings in case of variable shadowing, the Elm compiler generates an error and stops the compilation, until the variable shadowing issue is removed. More on this in the &lt;a href="https://github.com/elm/compiler/blob/master/hints/shadowing.md" rel="noopener noreferrer"&gt;Variable Shadowing&lt;/a&gt; article. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn48"&gt;

&lt;p&gt;To push the static analysis further, other tools can be used, like &lt;a href="https://package.elm-lang.org/packages/jfmengels/elm-review/latest/" rel="noopener noreferrer"&gt;Elm-Review&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn49"&gt;

&lt;p&gt;"&lt;a href="https://twitter.com/id_aa_carmack/status/735197548034412546" rel="noopener noreferrer"&gt;This should be an inspiration for every error message&lt;/a&gt;", John Carmack commenting on Elm error messages ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn50"&gt;

&lt;p&gt;The &lt;a href="https://redux.js.org/understanding/history-and-design/prior-art" rel="noopener noreferrer"&gt;Prior Art&lt;/a&gt; document of &lt;strong&gt;Redux&lt;/strong&gt; explains the Elm influence in detail. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn51"&gt;

&lt;p&gt;Joe Groff, one of the designers of the Swift language, mentions that &lt;a href="https://twitter.com/jckarter/status/1135666944273571840" rel="noopener noreferrer"&gt;SwiftUI was inspired by Elm and React&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn52"&gt;

&lt;p&gt;&lt;a href="https://clojurescript.org/" rel="noopener noreferrer"&gt;ClojureScript&lt;/a&gt;, &lt;a href="https://rescript-lang.org/" rel="noopener noreferrer"&gt;ReScript&lt;/a&gt;, and &lt;a href="https://www.purescript.org/" rel="noopener noreferrer"&gt;PureScript&lt;/a&gt; are three languages that have a similar concept to Elm. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn53"&gt;

&lt;p&gt;Details about The Elm Architecture can be found in the &lt;a href="https://guide.elm-lang.org/architecture/" rel="noopener noreferrer"&gt;official Elm Guide&lt;/a&gt;. The Elm Architecture is the predominant way to build applications in Elm. Different variants are also possible. &lt;a href="https://www.elm-spa.dev/guide" rel="noopener noreferrer"&gt;Elm-spa&lt;/a&gt; by Ryan Haskell-Glatz is a tool that helps to create single-page applications and create extra abstraction above The Elm Architecture. Rémi Lefèvre built the &lt;a href="https://github.com/gothinkster/realworld" rel="noopener noreferrer"&gt;RealWorld example app&lt;/a&gt; using the &lt;a href="https://discourse.elm-lang.org/t/realworld-example-app-architected-with-the-effect-pattern/5753" rel="noopener noreferrer"&gt;Effect pattern&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn54"&gt;

&lt;p&gt;The Elm Architecture is based on &lt;a href="https://youtu.be/jl1tGiUiTtI?t=470" rel="noopener noreferrer"&gt;&lt;strong&gt;unidirectional data flow&lt;/strong&gt;&lt;/a&gt; (a.k.a. &lt;strong&gt;one-way data binding&lt;/strong&gt;) like React, in contrast to the &lt;strong&gt;bidirectional data flow&lt;/strong&gt; (a.k.a. &lt;strong&gt;two-way data binding&lt;/strong&gt;) of frameworks like Angular, Vue, and Svelte (&lt;a href="https://github.com/sveltejs/svelte/issues/54" rel="noopener noreferrer"&gt;in Svelte two-way binding can be disabled&lt;/a&gt;). There have been issues with two-way data binding. For example, the many-to-many dependencies between the view and the model can create an infinite loop of cascading updates. Another issue is the lack of control of the change detection mechanism. It is an implicit behavior that is not easy to control. Unidirectional data flow tends to be more predictable. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn55"&gt;

&lt;p&gt;The illustration &lt;strong&gt;A simple representation of the Elm Architecture&lt;/strong&gt; is from the &lt;a href="https://guide.elm-lang.org/architecture/" rel="noopener noreferrer"&gt;Elm Guide&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn56"&gt;

&lt;p&gt;When we write Elm code, 100% of our code is pure so there are no side effects. But without side effects, our application would just be a boring silent empty screen. The &lt;strong&gt;Elm runtime system&lt;/strong&gt; is the part of the code that is in charge of the side effects. In our code, we just request these side effects to be done and we wait for the outcomes. Examples of side effects are HTTP requests or DOM modifications. How do we do side effects while remaining pure? In Elm, there are two ways. For things like HTTP requests, for example, there are commands (&lt;code&gt;Cmd&lt;/code&gt;), that are instructions, in the form of data, that we send as requests to the Elm runtime system. For changing the DOM, the way to do side effects is to take the entire state of the world as an argument and return a new version of it. So we can change the world (side effects) by remaining pure. The world in our case is the &lt;strong&gt;Model&lt;/strong&gt; and the function that does that is the &lt;strong&gt;update&lt;/strong&gt; function: &lt;code&gt;update: Msg -&amp;gt; Model -&amp;gt; (Model, Cmd msg)&lt;/code&gt; (see The Elm Architecture for more details). The video &lt;a href="https://youtu.be/fCoQb-zqYDI?t=42" rel="noopener noreferrer"&gt;What is IO monad?&lt;/a&gt; by Alexey Kutepov explains this concept in general terms. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn57"&gt;

&lt;p&gt;If you are familiar with game development you can find similarities between &lt;strong&gt;The Elm Architecture&lt;/strong&gt; and &lt;strong&gt;The Game Loop&lt;/strong&gt;. The main difference is that usually games don't wait for something to happen, but the loop keeps running all the time. When we develop games in Elm, we do the same using &lt;a href="https://package.elm-lang.org/packages/elm/browser/latest/Browser-Events#onAnimationFrame" rel="noopener noreferrer"&gt;onAnimationFrame&lt;/a&gt; so that the loop keeps running with a usual speed of 60 times per second. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn58"&gt;

&lt;p&gt;More about the &lt;strong&gt;Elm debugger&lt;/strong&gt; in &lt;a href="https://elm-lang.org/news/the-perfect-bug-report" rel="noopener noreferrer"&gt;The Perfect Bug Report&lt;/a&gt; ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn59"&gt;

&lt;p&gt;The &lt;strong&gt;Elm debugger&lt;/strong&gt; is usually disabled for applications that are released in production, but you can find an example of it in &lt;a href="https://elmjapan.org/" rel="noopener noreferrer"&gt;elmjapan.org&lt;/a&gt; where it has been kept active for educational purposes. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn60"&gt;

&lt;p&gt;&lt;a href="https://lucamug.github.io/mario/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; and &lt;a href="https://github.com/lucamug/mario/blob/master/src/Main.elm" rel="noopener noreferrer"&gt;source code&lt;/a&gt; of the application used to demonstrate the Elm Debugger.  ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn61"&gt;

&lt;p&gt;Bret Victor is an interface designer, computer scientist, and electrical engineer known for his talks on the future of technology. In his talk, &lt;a href="https://youtu.be/PUv66718DII?t=762" rel="noopener noreferrer"&gt;Inventing on Principle&lt;/a&gt;, Victor showed his vision about fixing the fundamentally broken way we make software. The vision, in short, is that "Creators need an immediate connection to what they’re creating." More about this in &lt;a href="https://www.theatlantic.com/technology/archive/2017/09/saving-the-world-from-code/540393/" rel="noopener noreferrer"&gt;The Coming Software Apocalypse&lt;/a&gt; by James Somers. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn62"&gt;

&lt;p&gt;&lt;strong&gt;Elm-UI&lt;/strong&gt; is developed by Matthew Griffith. More information about &lt;strong&gt;Elm-UI&lt;/strong&gt; in &lt;a href="https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/" rel="noopener noreferrer"&gt;the module documentation&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn63"&gt;

&lt;p&gt;This &lt;a href="https://elm.dmy.fr/" rel="noopener noreferrer"&gt;enhanced mirror of the Elm Package Manager&lt;/a&gt; list packages in order of popularity. If we exclude the core library, the top 5 packages are &lt;a href="https://elm.dmy.fr/packages/mdgriffith/elm-ui/latest/" rel="noopener noreferrer"&gt;Elm-UI&lt;/a&gt; | &lt;a href="https://elm.dmy.fr/packages/NoRedInk/elm-json-decode-pipeline/latest/" rel="noopener noreferrer"&gt;Elm-JSON-Decode-Pipeline&lt;/a&gt; | &lt;a href="https://elm.dmy.fr/packages/rtfeldman/elm-css/latest/" rel="noopener noreferrer"&gt;Elm-CSS&lt;/a&gt; | &lt;a href="https://elm.dmy.fr/packages/avh4/elm-color/latest/" rel="noopener noreferrer"&gt;elm-color&lt;/a&gt; | &lt;a href="https://elm.dmy.fr/packages/krisajenkins/remotedata/latest/" rel="noopener noreferrer"&gt;Remotedata&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn64"&gt;

&lt;p&gt;There are at least &lt;a href="https://css-tricks.com/centering-css-complete-guide/" rel="noopener noreferrer"&gt;three different ways to center an element using CSS&lt;/a&gt;, probably more. You can use &lt;code&gt;Pre-Flexbox&lt;/code&gt; style (example at &lt;a href="https://codepen.io/lucamug/pen/GRjwVqd?editors=1100" rel="noopener noreferrer"&gt;Codepen&lt;/a&gt;), &lt;code&gt;Flexbox&lt;/code&gt; (example at &lt;a href="https://codepen.io/lucamug/pen/dypQxpV?editors=1100" rel="noopener noreferrer"&gt;Codepen&lt;/a&gt;), or &lt;code&gt;Grid&lt;/code&gt; (example at &lt;a href="https://codepen.io/lucamug/pen/KKgbqNo?editors=1100" rel="noopener noreferrer"&gt;Codepen&lt;/a&gt;). The version using &lt;em&gt;flexbox&lt;/em&gt; is probably simpler. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn65"&gt;

&lt;p&gt;Code example at &lt;a href="https://ellie-app.com/c6DfSCMYSJ6a1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn66"&gt;

&lt;p&gt;Evan Czaplicki mentions that &lt;strong&gt;the templating language for Elm is Elm&lt;/strong&gt; in the video &lt;a href="https://youtu.be/jl1tGiUiTtI?t=371" rel="noopener noreferrer"&gt;Convergent Evolution&lt;/a&gt; that compares Elm to React.     ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn67"&gt;

&lt;p&gt;Note that &lt;code&gt;div&lt;/code&gt; is a function that accepts two lists, one for attributes and one for children elements. &lt;code&gt;text&lt;/code&gt; is also a function. It may help to see the type signature of these functions to understand better: &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 ↩


&lt;/li&gt;


&lt;li id="fn68"&gt;

&lt;p&gt;You can check the entire outcome of &lt;strong&gt;Elm-UI&lt;/strong&gt; in this &lt;a href="https://ellie-app.com/c6DfSCMYSJ6a1" rel="noopener noreferrer"&gt;live example&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn69"&gt;

&lt;p&gt;The benefits of &lt;strong&gt;Elm-UI&lt;/strong&gt; are more relevant in complex layouts than in this is a trivial example. Moreover, &lt;strong&gt;Elm-UI&lt;/strong&gt; ensures that our HTML is valid and accessible. For example, forcing us to add a description to the image and blocking us from adding children to the HTML &lt;code&gt;img&lt;/code&gt; element. The &lt;code&gt;img&lt;/code&gt; function, with the standard HTML Elm library, is defined as &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 The second list is the one that allows creating children elements, producing invalid HTML. Using &lt;strong&gt;Elm-UI&lt;/strong&gt;, we cannot add children to the HTML element &lt;code&gt;img&lt;/code&gt; due to the definition of the &lt;code&gt;image&lt;/code&gt; function itself: &lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 The function &lt;code&gt;image&lt;/code&gt; doesn't accept a list of children, but just an argument containing &lt;code&gt;src&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt;. ↩


&lt;/li&gt;


&lt;li id="fn70"&gt;

&lt;p&gt;&lt;a href="https://youtu.be/bt1TzVngOqY" rel="noopener noreferrer"&gt;CSS as Bytecode&lt;/a&gt; is also the title of one of the talks of Richard Feldman. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn71"&gt;

&lt;p&gt;Before moving to &lt;strong&gt;Elm-UI&lt;/strong&gt; we were avid consumers of &lt;a href="https://css-tricks.com/" rel="noopener noreferrer"&gt;css-tricks.com&lt;/a&gt;, an excellent source of CSS tricks and information related to web development. Ironically it was also the place where we learned the existence of Elm that led us to use &lt;strong&gt;Elm-UI&lt;/strong&gt; and eventually made &lt;strong&gt;css-tricks.com&lt;/strong&gt; way less relevant. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn72"&gt;

&lt;p&gt;Evan Czaplicki explains the decision of using the ML-style syntax throughout the video &lt;a href="https://youtu.be/jl1tGiUiTtI?t=384" rel="noopener noreferrer"&gt;Convergent Evolution&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn73"&gt;

&lt;p&gt;Rich Hickey mentions the idea that &lt;em&gt;familiarity hides complexity&lt;/em&gt; in his talk &lt;a href="https://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey/" rel="noopener noreferrer"&gt;Are we there yet?&lt;/a&gt; (11th minute) where he advocated for the reexamination of the basic principles of OOP. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn74"&gt;

&lt;p&gt;The &lt;a href="https://github.com/tc39/proposal-pipeline-operator" rel="noopener noreferrer"&gt;pipeline proposal&lt;/a&gt; is currently at stage 1 of the &lt;a href="https://tc39.es/process-document/" rel="noopener noreferrer"&gt;TC39 proposal process&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn75"&gt;

&lt;p&gt;Read more about the benefits of the &lt;strong&gt;comma-leading lists&lt;/strong&gt; approach in &lt;a href="https://dev.to/tao/the-case-for-comma-leading-lists-3n49"&gt;The Case for Comma-Leading Lists&lt;/a&gt;. This approach applies to any list separator. For example, in CSS we could write: &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 ↩


&lt;/li&gt;


&lt;li id="fn76"&gt;

&lt;p&gt;Elm also doesn't have &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Hoisting" rel="noopener noreferrer"&gt;hoisting&lt;/a&gt;, the JavaScript mechanism where variable and function declarations are put into memory during the compile phase giving the impression that they are moved to the top of their scope before code execution. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn77"&gt;

&lt;p&gt;&lt;a href="https://ellie-app.com/bS3bK8gnW8na1" rel="noopener noreferrer"&gt;The Elm code example is available here&lt;/a&gt;. Another situation where the order matter is when mutability is in action, for example&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
These constructs don't compile in Elm because all data is immutable. By the way, have you ever noted that with mutability, the &lt;code&gt;=&lt;/code&gt; sign loses its mathematical meaning? &lt;code&gt;a = a + 2&lt;/code&gt; is an impossible construct in mathematics. With immutability, it is still holding because you can only write &lt;code&gt;newA = a + 2&lt;/code&gt;. More about this in the &lt;a href="https://github.com/elm/compiler/blob/master/hints/bad-recursion.md" rel="noopener noreferrer"&gt;Hints for Bad Recursion&lt;/a&gt; article. ↩


&lt;/li&gt;


&lt;li id="fn78"&gt;

&lt;p&gt;&lt;a href="https://jsfiddle.net/xsbhLm9z/" rel="noopener noreferrer"&gt;Live example in JavaScript&lt;/a&gt; ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn79"&gt;

&lt;p&gt;Elm and Svelte performances are &lt;a href="https://twitter.com/sveltejs/status/1138094066867089408" rel="noopener noreferrer"&gt;neck and neck&lt;/a&gt; as it can be verified from the &lt;a href="https://github.com/krausest/js-framework-benchmark" rel="noopener noreferrer"&gt;JavaScript framework benchmark&lt;/a&gt;. &lt;a href="https://discourse.elm-lang.org/t/can-the-compiler-skip-virtual-dom/6300" rel="noopener noreferrer"&gt;This thread&lt;/a&gt; has an interesting conversation about web frameworks' performances. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn80"&gt;

&lt;p&gt;The equivalent of &lt;strong&gt;dead code elimination&lt;/strong&gt;, in JavaScript, is called &lt;a href="https://webpack.js.org/guides/tree-shaking/" rel="noopener noreferrer"&gt;tree shaking&lt;/a&gt; and it usually works at the granularity of modules instead of single functions. &lt;a href="https://elm-lang.org/news/small-assets-without-the-headache" rel="noopener noreferrer"&gt;Other optimizations contribute to the small assets of Elm&lt;/a&gt;. Our largest application of ~66,500 lines of Elm code is 188kb zipped, including the SVG assets, the extra JavaScript, and translations in several languages. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn81"&gt;

&lt;p&gt;These numbers are calculated &lt;a href="https://discourse.elm-lang.org/t/help-gather-data-on-build-times/4624" rel="noopener noreferrer"&gt;using this method&lt;/a&gt; on a MacBook Pro 2.3GHz Quad-Core i7. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn82"&gt;

&lt;p&gt;These are the most common tools to generate static sites in Elm: &lt;a href="https://package.elm-lang.org/packages/dillonkearns/elm-pages/latest/" rel="noopener noreferrer"&gt;Elm-Pages&lt;/a&gt; | &lt;a href="https://github.com/alexkorban/elmstatic" rel="noopener noreferrer"&gt;ElmStatic&lt;/a&gt; | &lt;a href="https://github.com/lucamug/elm-starter" rel="noopener noreferrer"&gt;Elm-Starter&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn83"&gt;

&lt;p&gt;Appeal to popularity, or &lt;a href="https://en.wikipedia.org/wiki/Argumentum_ad_populum" rel="noopener noreferrer"&gt;Argumentum ad populum&lt;/a&gt;, is a fallacious argument that concludes that something must be true because many or most people believe it. Illustration made with Elm and &lt;a href="https://package.elm-lang.org/packages/evancz/elm-playground/latest/" rel="noopener noreferrer"&gt;Elm-Playground&lt;/a&gt;, &lt;a href="https://ellie-app.com/bY2R6xF5mWda1" rel="noopener noreferrer"&gt;here the source code&lt;/a&gt;. On a fun note, Elm was recently featured in a &lt;a href="https://twitter.com/stabbylambda/status/1419073832627802112" rel="noopener noreferrer"&gt;New York Times crossword puzzle&lt;/a&gt;. Does this make Elm a mainstream programming language now? ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn84"&gt;

&lt;p&gt;Evan Czaplicki in the talk &lt;a href="https://youtu.be/uGlzRt-FYto?t=261" rel="noopener noreferrer"&gt;What is Success?&lt;/a&gt; discusses this topic. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn85"&gt;

&lt;p&gt;For example, did the object-oriented paradigm become mainstream for its inherently good qualities and its ability to deal with complex problems? Was it by chance? (As Richard Feldman suggests in his video, &lt;a href="https://youtu.be/QyJZzq0v7Z4?t=2069" rel="noopener noreferrer"&gt;Why Isn't Functional Programming the Norm?&lt;/a&gt;) Was it because it is an inferior paradigm (as Brian Will highlights in &lt;a href="https://youtu.be/QM1iUe6IofM" rel="noopener noreferrer"&gt;Object-Oriented Programming is Bad&lt;/a&gt;) but Microsoft and the &lt;a href="http://harmful.cat-v.org/software/OO_programming/why_oo_sucks" rel="noopener noreferrer"&gt;industry that created&lt;/a&gt;, promoted it? ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn86"&gt;

&lt;p&gt;Some of these companies are mentioned by Richard Feldman in the video &lt;a href="https://youtu.be/sKxEwjKQ5zg?t=303" rel="noopener noreferrer"&gt;Building UIs in the Dark (aka Elm Programming)&lt;/a&gt; and the list &lt;a href="https://github.com/jah2488/elm-companies" rel="noopener noreferrer"&gt;Elm companies&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn87"&gt;

&lt;p&gt;The &lt;a href="https://elmlang.herokuapp.com/" rel="noopener noreferrer"&gt;Elm Slack channel&lt;/a&gt; counts around 20,000 members. Another platform used by the Elm community is &lt;a href="https://discourse.elm-lang.org/" rel="noopener noreferrer"&gt;discourse.elm-lang.org&lt;/a&gt;. There is also a channel on the &lt;a href="https://www.reddit.com/r/elm/" rel="noopener noreferrer"&gt;Reddit website&lt;/a&gt; that tends to be unpleasant so not many Elm developers usually comment there. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn88"&gt;

&lt;p&gt;There is no lack of good resources to learn Elm. A good aggregator for these resources is the &lt;a href="https://github.com/sporto/awesome-elm/blob/master/README.md" rel="noopener noreferrer"&gt;Awesome-Elm&lt;/a&gt;.  ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn89"&gt;

&lt;p&gt;The library that we wrote is now &lt;a href="https://package.elm-lang.org/packages/rakutentech/r10/latest/R10-Form" rel="noopener noreferrer"&gt;open source&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn90"&gt;

&lt;p&gt;Elm provides several methodologies to communicate with JavaScript. Here is &lt;a href="https://guide.elm-lang.org/interop/" rel="noopener noreferrer"&gt;an introduction to JavaScript interoperability&lt;/a&gt; with some &lt;a href="https://github.com/elm-community/js-integration-examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt;. ↩&lt;/p&gt;


&lt;/li&gt;


&lt;li id="fn91"&gt;

&lt;p&gt;&lt;strong&gt;Rúnar Bjarnason&lt;/strong&gt; is an advocate of functional programming. He is the co-author of the Scala “Red book” and the creator of the programming language Unison. Unison, &lt;a href="https://www.unisonweb.org/" rel="noopener noreferrer"&gt;&lt;em&gt;“A friendly programming language from the future.”&lt;/em&gt;&lt;/a&gt;, has similarities to Elm as they are both inspired by Haskell, as explained in the video &lt;a href="https://youtu.be/rp_Eild1aq8?t=248" rel="noopener noreferrer"&gt;Introduction to the Unison programming language&lt;/a&gt;.     ↩&lt;/p&gt;


&lt;/li&gt;


&lt;/ol&gt;

</description>
      <category>elm</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>3D Graphics in the Browser with Elm</title>
      <dc:creator>lucamug</dc:creator>
      <pubDate>Mon, 12 Oct 2020 00:40:36 +0000</pubDate>
      <link>https://dev.to/lucamug/3d-graphics-in-the-browser-with-elm-4oh3</link>
      <guid>https://dev.to/lucamug/3d-graphics-in-the-browser-with-elm-4oh3</guid>
      <description>&lt;p&gt;This is a collection of cool 3D stuff made 100% in Elm.&lt;/p&gt;

&lt;p&gt;Get inspired to play with these tools, build stuff and contribute to public libraries!&lt;/p&gt;

&lt;p&gt;If you think that something is missing, you spotted a mistake or you have some feedback, send me a message or - even better - open an issue or send a pull request in &lt;a href="https://github.com/lucamug/3D_Graphics_in_the_Browser_with_Elm" rel="noopener noreferrer"&gt;this repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to learn more about 3D Graphics in Elm, you can start reading the documentation of these libraries and joining the channels #webgl and #gamedev in the &lt;a href="https://elmlang.herokuapp.com/" rel="noopener noreferrer"&gt;Elm Slack&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Enjoy! 🎉&lt;/p&gt;

&lt;h1&gt;
  
  
  Content
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Demos&lt;/li&gt;
&lt;li&gt;Videos&lt;/li&gt;
&lt;li&gt;Libraries&lt;/li&gt;
&lt;li&gt;Posts&lt;/li&gt;
&lt;li&gt;People&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Demos
&lt;/h1&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Balls and Blocks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/elm-3d-scene/physics/physics.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lucamug/3D_Graphics_in_the_Browser_with_Elm/blob/master/examples/elm-3d-scene/physics/Physics.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fcubes-and-spheres.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloth
&lt;/h3&gt;

&lt;p&gt;Cloth simulation built using many particle bodies and distance constraints between adjacent points.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/cloth/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/tree/master/examples/Cloth.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fcloth.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Duckling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/elm-3d-scene/duckling/Duckling.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/cfdff607dc867b6751386cd94d1068967f3773a0/testing/Duckling.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fduck.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Overlay
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/overlay.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/master/examples/Overlay.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ellie-app.com/bdkzqjBxCtQa1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Foverlay.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lack
&lt;/h3&gt;

&lt;p&gt;This demo allows dragging objects with mouse, try flipping the table!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/lack/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/blob/master/examples/Lack.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/slides/2019-12-07-how-to-flip-a-table-with-elm" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Flack.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Duckling
&lt;/h3&gt;

&lt;p&gt;This demo loads a convex shape and a mesh from the same OBJ file&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/duckling/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/blob/master/examples/Duckling.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fducks-320px.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Circuit Breaker
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: MartinSStewart
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinsstewart.gitlab.io/hackman/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gitlab.com/MartinSStewart/hackman" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/martinsstewart/what-is-elm-and-a-game-i-m-making-with-it-3di1"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fbreaker.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Floating City
&lt;/h3&gt;

&lt;p&gt;A three dimensional representation of Tokyo rendered in SVG, used for the Elm Japan Conference website&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Luca Mugnaini
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lucamug/elm-japan" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elmjapan.org/" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Felmjapan.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3D Vector Animations
&lt;/h3&gt;

&lt;p&gt;Implementing 3D vector visualizations in Elm, rendered as pure SVGs&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Marco Sehrer
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elm-vector-demo-1.herokuapp.com/index.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ninjaconcept/elm-vector-demo-1" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/ninjaconcept/3d-vector-animations-in-elm-58703993d144" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fvector-demo.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Car
&lt;/h3&gt;

&lt;p&gt;This shows how hinge constrains can be used to assemble a car. Use the arrow keys to steer and speed!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/car/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/tree/master/examples/Car.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fcar.gif" title="Demo" alt="Demo" width="319" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Boxes
&lt;/h3&gt;

&lt;p&gt;This demo is used to test performance. It drops 5×5×5 boxes. Try changing &lt;code&gt;boxesPerDimension&lt;/code&gt; to drop even more!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/boxes/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/blob/master/examples/Boxes.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fboxes.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Teapot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/elm-3d-camera/teapot.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ianmackenzie/elm-3d-camera/blob/3.1.0/examples/Teapot.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fteapot-blue.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Slimy Broccoli with Perlin Noise
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Aaron VonderHaar
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/avh4/smoke/index.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/avh4/codevember-2016/tree/master/Day10" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=oc9ib2v9I4s&amp;amp;list=PLDA4wlOlLJvXAEsJDje4hdLazsihZiQNf&amp;amp;index=12%22%3Ehttps://www.youtube.com/watch?v=oc9ib2v9I4s&amp;amp;list=PLDA4wlOlLJvXAEsJDje4hdLazsihZiQNf&amp;amp;index=12" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fsmoke.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Randomize
&lt;/h3&gt;

&lt;p&gt;This demo drops random bodies. It also shows how to make a compound body out of multiple shapes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/randomize/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/tree/master/examples/Randomize.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Frandomize.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Procedural Landscape
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Brian J Ball
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/procedural-landscape/ProceduralLandscape.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lucamug/3D_Graphics_in_the_Browser_with_Elm/blob/master/examples/procedural-landscape/ProceduralLandscape.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fprocedural-landscape.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dice
&lt;/h3&gt;

&lt;p&gt;Physically simulated dice roller!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.itch.io/dice" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-dice" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fdice.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewer
&lt;/h3&gt;

&lt;p&gt;This example demonstrates how to load a mesh from a file. It can also be used to test the parser.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-obj-file/examples/viewer/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-obj-file/blob/master/examples/src/Viewer.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/unsoundscapes/status/1290351995786792961" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fpreview-OBJ-files.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pod
&lt;/h3&gt;

&lt;p&gt;This example demonstrates how to extract multiple meshes with shadows from an OBJ file and render with elm-3d-scene.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-obj-file/examples/pod/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-obj-file/blob/master/examples/src/Pod.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fpod3.png" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quicklook Shelf Configurator
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Thomas Kumlehn
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/quicklook-shelf-configurator/examples/IvarConfig.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/PixelPartner/quicklook-shelf-configurator/blob/master/examples/IvarConfig.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fshelf.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Table and Chairs 🪑🪑
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/Table%20and%20chairs/index.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/d1a802aaf6a0adc659c2a006b5194396bb225b18/examples/Demo.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Ftable.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3D Game of Life
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Mika Jauhonen
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/mikaxyz/3d-game-of-life/index.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mikaxyz/elm-game-of-life" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/mikajauhonen/status/1203088763754369024" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fgame-of-life.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Copter 3D 🚁
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://unsoundscapes.com/elm-webgl-playground/copter3d.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-webgl-playground/blob/master/Copter3D.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Feli.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Morph
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Francis De Brabandere
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/francisdb-glmorph/index.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/francisdb/glmorph" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fcube.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cubik
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.itch.io/cubik" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-cubik" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://discourse.elm-lang.org/t/open-sourcing-the-rubiks-cube-game/746" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fcubik.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bumping Car 🚗
&lt;/h3&gt;

&lt;p&gt;A modified version of &lt;a href="https://github.com/w0rm/elm-physics/blob/raycast-vehicle/examples/RaycastCar.elm" rel="noopener noreferrer"&gt;RaycastCar&lt;/a&gt; written by Andrey Kuzmin.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Luca Mugnaini
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://elm-physics-example.guupa.com/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lucamug/elm-physics-example" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/luca_mug/status/1292948585068335105" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fphysics.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quake Arena
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrea Peltrin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://lab.passiomatic.com/quake3/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/passiomatic/elm-quake3-renderer" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://discourse.elm-lang.org/t/render-quake-3-arena-maps-with-elm-and-webgl/3820" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fquake3.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hannover
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Alexander Foremny
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hannover-elm.github.io/website/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hannover-elm/website/blob/master/src/Logo.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fhannover2.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 10 - First person perspective
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Nacho Martín
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://localhost:8000/nacmartin-webgl-lessons/lesson-10-room.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nacmartin/elm-webgl-lessons/blob/master/lessons/Lesson10.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nacmartin/elm-webgl-lessons" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Froom.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 14 - Teapot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Nacho Martín
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nacmartin.github.io/elm-webgl-lessons/out/lesson14.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nacmartin/elm-webgl-lessons/blob/master/lessons/Lesson14.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nacmartin/elm-webgl-lessons" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fteapot.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 15 - Earth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Nacho Martín
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nacmartin.github.io/elm-webgl-lessons/out/lesson15.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nacmartin/elm-webgl-lessons/blob/master/lessons/Lesson15.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nacmartin/elm-webgl-lessons" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fworld.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Terrain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Dave Jeffrey
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://lepoetemaudit.github.io/elm-terrain/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lepoetemaudit/elm-terrain" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fterrain.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3D Tetris
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Tobias Wentzlaff
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tobiaswen.github.io/3DelmTRIS/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TobiasWen/3DelmTRIS" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2F3dtetris.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Planet 3D
&lt;/h3&gt;

&lt;p&gt;Generates a planet with randomized surface.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://unsoundscapes.com/elm-webgl-playground/planet3d.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-webgl-playground/blob/master/Planet3D.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fearth2.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Live MIDI dancer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Kofi Gumbs
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rc.kofi.sexy/visualizer/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hkgumbs/rc" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kofi.sexy/blog/rc-2019" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fman.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Exposure and Tone Mapping
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/exposure-and-tone-mapping.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/master/examples/ExposureAndToneMapping.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ellie-app.com/9g2NQtQNxXpa1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fexposure.png" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dominoes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-physics/examples/dominoes/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-physics/tree/master/examples/Dominoes.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fdominoes.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Shadows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/multiple-shadows.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/master/examples/MultipleShadows.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ellie-app.com/9g2PQxgqk49a1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fmultiple-shadow.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Oslo Elm Day
&lt;/h3&gt;

&lt;p&gt;A demo similar to Oslo Elm Day 2019, but implemented in Elm instead of Three.js.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://unsoundscapes.com/elm-webgl-playground/osloelmday.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-webgl-playground/blob/master/OsloElmDay.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Foslo.gif" title="Demo" alt="Demo" width="320" height="320"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Shadertoy
&lt;/h3&gt;

&lt;p&gt;Renders the shader code from &lt;a href="https://www.shadertoy.com/view/Ms2SD1" rel="noopener noreferrer"&gt;https://www.shadertoy.com/view/Ms2SD1&lt;/a&gt; using Elm WebGL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/elm-webgl-playground/shadertoy.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w0rm/elm-webgl-playground/blob/master/Shadertoy.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flucamug.github.io%2F3D_Graphics_in_the_Browser_with_Elm%2Fgifs%2Fshadertoy.gif" title="Demo" alt="Demo" width="320" height="321"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Other demos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Quicklook RAL Configurator&lt;/strong&gt; by Thomas Kumlehn.  &lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/pixel-partner/RALConfig.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/PixelPartner/quicklook-RAL-configurator" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Julia Set&lt;/strong&gt; by Marco Sehrer.  &lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/ninjaconcept-elm-julia-set/index.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/ninjaconcept/elm-julia-set-visualization" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈ &lt;a href="https://medium.com/@fh_95229/julia-set-visualization-with-webgl-for-elm-765e5da88626#.kbcjf8cfi" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Textured Sphere&lt;/strong&gt; by Ian Mackenzie.  &lt;a href="https://ianmackenzie.github.io/elm-3d-scene/examples/1.0.0/textured-sphere.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/master/examples/TexturedSphere.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈ &lt;a href="https://ellie-app.com/9g2R9VDG6NHa1" rel="noopener noreferrer"&gt;Ellie&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Landscape (terrain)&lt;/strong&gt; by Mika Jauhonen.  &lt;a href="https://mika.xyz/elm-webgl-experiments/landscape.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/mikaxyz/elm-webgl-examples" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Animated Light&lt;/strong&gt; by Ian Mackenzie.  &lt;a href="https://lucamug.github.io/3D_Graphics_in_the_Browser_with_Elm/examples/elm-3d-scene/animated.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href=""&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Tangram&lt;/strong&gt; by Andrey Kuzmin. Elm tangram pieces in 3D, composing different logos of Elm-related projects. &lt;a href="http://unsoundscapes.com/elm-webgl-playground/tangram.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/w0rm/elm-webgl-playground/tree/master/Tangram" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Drag&lt;/strong&gt; by Andrey Kuzmin.  &lt;a href="https://unsoundscapes.com/elm-physics/examples/drag/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/w0rm/elm-physics/tree/master/examples/Drag.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Countdown&lt;/strong&gt; by Patrik Sandahl.  &lt;a href="https://www.youtube.com/watch?v=DhSXR7EaJ5E" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/psandahl/count-down" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Dream Buggy&lt;/strong&gt; by Conrad Parker.  &lt;a href="http://kfish.github.io/dreambuggy/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/kfish/dreambuggy" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Shadow Volume&lt;/strong&gt; by Andrey Kuzmin. Real-time shadows using the shadow volume technique. &lt;a href="https://unsoundscapes.com/elm-webgl-playground/shadowvolume.html" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/w0rm/elm-webgl-playground/blob/master/ShadowVolume.elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈ &lt;a href="https://discourse.elm-lang.org/t/rendering-real-time-shadows-in-webgl-using-shadow-volumes/4029" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;First Person&lt;/strong&gt; by Jeff Cole.  &lt;a href="http://jeff-cole.com/first-person-elm/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/jeffcole/first-person-elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Sun Path&lt;/strong&gt; by Karl Dray.  &lt;a href="https://karldray.com/sunpath/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/karldray/sunpath" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Glelm&lt;/strong&gt; by Ben Postlethwaite.  &lt;a href="https://thebookofshaders.com/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/bpostlethwaite/glelm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;First Person 3D Navigation in Elm&lt;/strong&gt; by Evan Czaplicki.  &lt;a href="http://evancz.github.io/first-person-elm/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/evancz/first-person-elm" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;strong&gt;Webgl Depth Map&lt;/strong&gt; by Matthieu Pizenberg. Visualizations of depth maps in the browser. &lt;a href="https://mpizenberg.github.io/elm-webgl-depthmap/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;⬈ &lt;a href="https://github.com/mpizenberg/elm-webgl-depthmap" rel="noopener noreferrer"&gt;Code&lt;/a&gt;⬈ &lt;a href="https://discourse.elm-lang.org/t/using-elm-and-webgl-for-depth-maps-3d-visualizations/6406" rel="noopener noreferrer"&gt;Post&lt;/a&gt;⬈&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Videos
&lt;/h1&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A 3D Rendering Engine for Elm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Htqc64s5qYU"&gt;
&lt;/iframe&gt;

&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Delightful WebGL in Elm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: John P Mayer, Jr
&lt;iframe src="https://player.vimeo.com/video/97408205" width="710" height="399"&gt;
&lt;/iframe&gt;

&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Now you're thinking in functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Ian Mackenzie
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/F4fuVJNnQoo"&gt;
&lt;/iframe&gt;

&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rendering text with WebGL
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Andrey Kuzmin
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/qasFxsOCfpA"&gt;
&lt;/iframe&gt;

&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Evan Czaplicki, Andrey Kuzmin - API Design Sessions - Part 2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Evan Czaplicki
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vQFGaGPPz2Q"&gt;
&lt;/iframe&gt;

&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Evan Czaplicki, Andrey Kuzmin - API Design Sessions - Part 1
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Evan Czaplicki
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/qaTy_F98Moo"&gt;
&lt;/iframe&gt;

&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ElmLive - Codevember Day 10 (2016) - Part 2 - Slimy broccoli with perlin noise
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Author: Aaron VonderHaar
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/oc9ib2v9I4s"&gt;
&lt;/iframe&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Posts
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://medium.com/@voorkanter/clicking-a-3d-mesh-in-elm-webgl-faadfdf703a0" rel="noopener noreferrer"&gt;&lt;strong&gt;Clicking a 3D mesh in elm-webgl&lt;/strong&gt;&lt;/a&gt;⬈ by Michel van der Hulst.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://medium.com/@voorkanter/a-low-poly-water-shader-in-elm-webgl-7a7a131e2733" rel="noopener noreferrer"&gt;&lt;strong&gt;A low poly water shader in Elm WebGL&lt;/strong&gt;&lt;/a&gt;⬈ by Michel van der Hulst.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/3d-physics-engine-pt-5/6423" rel="noopener noreferrer"&gt;&lt;strong&gt;3D Physics Engine Pt. 5&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/3d-physics-engine-pt-4/4895" rel="noopener noreferrer"&gt;&lt;strong&gt;3D Physics Engine Pt. 4&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/3d-physics-engine-pt-3/3663" rel="noopener noreferrer"&gt;&lt;strong&gt;3D Physics Engine Pt. 3&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/3d-physics-engine-pt-2/1887" rel="noopener noreferrer"&gt;&lt;strong&gt;3D Physics Engine Pt. 2&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/3d-physics-engine/1206" rel="noopener noreferrer"&gt;&lt;strong&gt;3D Physics Engine Pt. 1&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/rendering-real-time-shadows-in-webgl-using-shadow-volumes/4029" rel="noopener noreferrer"&gt;&lt;strong&gt;Rendering Real-Time Shadows in WebGL Using Shadow Volumes&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://discourse.elm-lang.org/t/a-3d-rendering-engine-for-elm-elm-3d-scene-1-0-is-now-out/5972" rel="noopener noreferrer"&gt;&lt;strong&gt;A 3D rendering engine for Elm: elm-3d-scene 1.0 is now out!&lt;/strong&gt;&lt;/a&gt;⬈ by Ian Mackenzie.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/blob/master/TUTORIAL.md" rel="noopener noreferrer"&gt;&lt;strong&gt;Elm 3D Scene Tutorial&lt;/strong&gt;&lt;/a&gt;⬈ by Ian Mackenzie.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://twitter.com/MacCSOutreach/status/1288157248095649797" rel="noopener noreferrer"&gt;&lt;strong&gt;3D Bee Game&lt;/strong&gt;&lt;/a&gt;⬈ by McMaster Start Coding.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/kfish/quaternion" rel="noopener noreferrer"&gt;&lt;strong&gt;Quaternion&lt;/strong&gt;&lt;/a&gt;⬈ by Conrad Parker.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/kfish/elm-shadertoy" rel="noopener noreferrer"&gt;&lt;strong&gt;Shader Toy&lt;/strong&gt;&lt;/a&gt;⬈ by Conrad Parker.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/w0rm/elm-webgl-playground" rel="noopener noreferrer"&gt;&lt;strong&gt;Webgl Playground&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://unsoundscapes.com/slides/2018-02-20-bringing-the-fun-to-graphics-programming" rel="noopener noreferrer"&gt;&lt;strong&gt;Slides: Bringing the fun to Graphics Programming&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://unsoundscapes.com/slides/2016-06-06-introduction-to-elm-webgl" rel="noopener noreferrer"&gt;&lt;strong&gt;Slides: Introduction to Elm Webgl&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://unsoundscapes.com/slides/2019-12-07-how-to-flip-a-table-with-elm" rel="noopener noreferrer"&gt;&lt;strong&gt;Slides: How to flip a table with Elm&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://unsoundscapes.com/slides/2018-07-05-rendering-text-with-webgl" rel="noopener noreferrer"&gt;&lt;strong&gt;Slides: Rendering text with Webgl&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/tree/master/examples" rel="noopener noreferrer"&gt;&lt;strong&gt;A collection of examples for &lt;code&gt;elm-3d-scene&lt;/code&gt; ordered by complexity.&lt;/strong&gt;&lt;/a&gt;⬈ by Ian Mackenzie.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/ianmackenzie/elm-3d-scene/tree/master/examples" rel="noopener noreferrer"&gt;&lt;strong&gt;Learn Webgl in 15 lessons. A collection of examples written with &lt;code&gt;elm-explorations/webgl&lt;/code&gt;.&lt;/strong&gt;&lt;/a&gt;⬈ by Nacho Martín.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Libraries
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://package.elm-lang.org/packages/ianmackenzie/elm-3d-scene/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;elm-3d-scene&lt;/strong&gt;&lt;/a&gt;⬈ by Ian Mackenzie. This is a high-level Elm package for producing 3D Graphics, with support for lighting, shadows and realistic materials.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://package.elm-lang.org/packages/w0rm/elm-physics/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;elm-physics&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin. Experimental toy physics engine.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://package.elm-lang.org/packages/elm-explorations/webgl/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;webgl&lt;/strong&gt;&lt;/a&gt;⬈ by Elm Explorations. A simple API for rendering with WebGL. This is useful for both 2D and 3D rendering because it lets you take advantage of hardware acceleration with the GPU, meaning you can render things more quickly. This library was created by Evan Czaplicki and John P Mayer, Jr. Andrey Kuzmin is now the main maintainer.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://package.elm-lang.org/packages/ianmackenzie/elm-geometry/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;elm-geometry&lt;/strong&gt;&lt;/a&gt;⬈ by Ian Mackenzie. This package provides a wide variety of geometric data types such as points, vectors, arcs, spline curves and coordinate frames, along with functions for transforming and combining them in many different ways.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://package.elm-lang.org/packages/ianmackenzie/elm-3d-camera/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;elm-3d-camera&lt;/strong&gt;&lt;/a&gt;⬈ by Ian Mackenzie. This package provides convenient ways to define and use perspective and orthographic cameras in 3D.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://package.elm-lang.org/packages/w0rm/elm-obj-file/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;elm-obj-file&lt;/strong&gt;&lt;/a&gt;⬈ by Andrey Kuzmin. An Elm package to decode 3D models from the OBJ file format. Helpful to create objects in Blender and render them with elm-3d-scene.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;/a&gt;&lt;a href="https://github.com/lucamug/elm-playground-3d" rel="noopener noreferrer"&gt;&lt;strong&gt;elm-playground-3d&lt;/strong&gt;&lt;/a&gt;⬈ by Luca Mugnaini. A package to draw simple three-dimensional objects in SVG.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  People
&lt;/h1&gt;

&lt;p&gt;List of people mentioned in this post.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Andrey Kuzmin
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/w0rm" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/unsoundscapes" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈ &lt;a href="https://discourse.elm-lang.org/u/unsoundscapes" rel="noopener noreferrer"&gt;Discourse&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F26506215%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F26506215%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Library elm-obj-file
&lt;/li&gt;
&lt;li&gt;Library elm-physics
&lt;/li&gt;
&lt;li&gt;Video Rendering text with WebGL
&lt;/li&gt;
&lt;li&gt;Post Slides: Rendering text with Webgl
&lt;/li&gt;
&lt;li&gt;Post Slides: How to flip a table with Elm
&lt;/li&gt;
&lt;li&gt;Post Slides: Introduction to Elm Webgl
&lt;/li&gt;
&lt;li&gt;Post Slides: Bringing the fun to Graphics Programming
&lt;/li&gt;
&lt;li&gt;Post Webgl Playground
&lt;/li&gt;
&lt;li&gt;Post Rendering Real-Time Shadows in WebGL Using Shadow Volumes
&lt;/li&gt;
&lt;li&gt;Post 3D Physics Engine Pt. 1
&lt;/li&gt;
&lt;li&gt;Post 3D Physics Engine Pt. 2
&lt;/li&gt;
&lt;li&gt;Post 3D Physics Engine Pt. 3
&lt;/li&gt;
&lt;li&gt;Post 3D Physics Engine Pt. 4
&lt;/li&gt;
&lt;li&gt;Post 3D Physics Engine Pt. 5
&lt;/li&gt;
&lt;li&gt;Demo Shadow Volume
&lt;/li&gt;
&lt;li&gt;Demo Shadertoy
&lt;/li&gt;
&lt;li&gt;Demo Drag
&lt;/li&gt;
&lt;li&gt;Demo Tangram
&lt;/li&gt;
&lt;li&gt;Demo Oslo Elm Day
&lt;/li&gt;
&lt;li&gt;Demo Dominoes
&lt;/li&gt;
&lt;li&gt;Demo Planet 3D
&lt;/li&gt;
&lt;li&gt;Demo Cubik
&lt;/li&gt;
&lt;li&gt;Demo Copter 3D 🚁
&lt;/li&gt;
&lt;li&gt;Demo Table and Chairs 🪑🪑
&lt;/li&gt;
&lt;li&gt;Demo Pod
&lt;/li&gt;
&lt;li&gt;Demo Viewer
&lt;/li&gt;
&lt;li&gt;Demo Dice
&lt;/li&gt;
&lt;li&gt;Demo Randomize
&lt;/li&gt;
&lt;li&gt;Demo Boxes
&lt;/li&gt;
&lt;li&gt;Demo Car
&lt;/li&gt;
&lt;li&gt;Demo Duckling
&lt;/li&gt;
&lt;li&gt;Demo Lack
&lt;/li&gt;
&lt;li&gt;Demo Cloth
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Ian Mackenzie
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ianmackenzie" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/ianemackenzie" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈ &lt;a href="https://discourse.elm-lang.org/u/ianmackenzie" rel="noopener noreferrer"&gt;Discourse&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F1576199%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F1576199%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Library elm-3d-camera
&lt;/li&gt;
&lt;li&gt;Library elm-geometry
&lt;/li&gt;
&lt;li&gt;Library elm-3d-scene
&lt;/li&gt;
&lt;li&gt;Video Now you're thinking in functions
&lt;/li&gt;
&lt;li&gt;Video A 3D Rendering Engine for Elm
&lt;/li&gt;
&lt;li&gt;Post A collection of examples for &lt;code&gt;elm-3d-scene&lt;/code&gt; ordered by complexity.
&lt;/li&gt;
&lt;li&gt;Post Elm 3D Scene Tutorial
&lt;/li&gt;
&lt;li&gt;Post A 3D rendering engine for Elm: elm-3d-scene 1.0 is now out!
&lt;/li&gt;
&lt;li&gt;Demo Animated Light
&lt;/li&gt;
&lt;li&gt;Demo Textured Sphere
&lt;/li&gt;
&lt;li&gt;Demo Multiple Shadows
&lt;/li&gt;
&lt;li&gt;Demo Exposure and Tone Mapping
&lt;/li&gt;
&lt;li&gt;Demo Teapot
&lt;/li&gt;
&lt;li&gt;Demo Overlay
&lt;/li&gt;
&lt;li&gt;Demo Duckling
&lt;/li&gt;
&lt;li&gt;Demo Balls and Blocks
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Nacho Martín
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nacmartin" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/nacmartin" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F154258%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F154258%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post Learn Webgl in 15 lessons. A collection of examples written with &lt;code&gt;elm-explorations/webgl&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Demo Lesson 15 - Earth
&lt;/li&gt;
&lt;li&gt;Demo Lesson 14 - Teapot
&lt;/li&gt;
&lt;li&gt;Demo Lesson 10 - First person perspective
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Luca Mugnaini
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/lucamug" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/luca_mug" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈ &lt;a href="https://medium.com/@l.mugnaini" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F5551094%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F5551094%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Library elm-playground-3d
&lt;/li&gt;
&lt;li&gt;Demo Bumping Car 🚗
&lt;/li&gt;
&lt;li&gt;Demo Floating City
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Evan Czaplicki
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/evancz" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/evancz" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F1658058%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F1658058%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video Evan Czaplicki, Andrey Kuzmin - API Design Sessions - Part 1
&lt;/li&gt;
&lt;li&gt;Video Evan Czaplicki, Andrey Kuzmin - API Design Sessions - Part 2
&lt;/li&gt;
&lt;li&gt;Demo First Person 3D Navigation in Elm
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Conrad Parker
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/kfish" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F38847%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F38847%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post Shader Toy
&lt;/li&gt;
&lt;li&gt;Post Quaternion
&lt;/li&gt;
&lt;li&gt;Demo Dream Buggy
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Thomas Kumlehn
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/PixelPartner" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/PixelPartner" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F73567%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F73567%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Quicklook RAL Configurator
&lt;/li&gt;
&lt;li&gt;Demo Quicklook Shelf Configurator
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Mika Jauhonen
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mikaxyz" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/mikajauhonen" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F373858%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F373858%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Landscape (terrain)
&lt;/li&gt;
&lt;li&gt;Demo 3D Game of Life
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Michel van der Hulst
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mahulst" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://medium.com/@voorkanter" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F4232644%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F4232644%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post A low poly water shader in Elm WebGL
&lt;/li&gt;
&lt;li&gt;Post Clicking a 3D mesh in elm-webgl
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Marco Sehrer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/pixelvitamina" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://medium.com/@sushi2kk" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F11566%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F11566%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Julia Set
&lt;/li&gt;
&lt;li&gt;Demo 3D Vector Animations
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Aaron VonderHaar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/avh4" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/avh4" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F1222%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F1222%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video ElmLive - Codevember Day 10 (2016) - Part 2 - Slimy broccoli with perlin noise
&lt;/li&gt;
&lt;li&gt;Demo Slimy Broccoli with Perlin Noise
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Tobias Wentzlaff
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/TobiasWen" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F13774204%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F13774204%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo 3D Tetris
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Patrik Sandahl
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/psandahl" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fvia.placeholder.com%2F60x60%3Ftext%3D%3F" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fvia.placeholder.com%2F60x60%3Ftext%3D%3F" alt="Photo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Countdown
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  McMaster Start Coding
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/MacCSOutreach" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fvia.placeholder.com%2F60x60%3Ftext%3D%3F" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fvia.placeholder.com%2F60x60%3Ftext%3D%3F" alt="Photo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post 3D Bee Game
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Matthieu Pizenberg
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mpizenberg" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/mattpiz" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈ &lt;a href="https://discourse.elm-lang.org/u/mattpiz" rel="noopener noreferrer"&gt;Discourse&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fvia.placeholder.com%2F60x60%3Ftext%3D%3F" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fvia.placeholder.com%2F60x60%3Ftext%3D%3F" alt="Photo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Webgl Depth Map
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  MartinSStewart
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/MartinSStewart" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F5068391%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F5068391%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Circuit Breaker
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Kofi Gumbs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/hkgumbs" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/hkgumbs" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F72497265%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F72497265%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Live MIDI dancer
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Karl Dray
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/karldray" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F1121686%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars1.githubusercontent.com%2Fu%2F1121686%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Sun Path
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  John P Mayer, Jr
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/johnpmayer" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F941215%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F941215%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video Delightful WebGL in Elm
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Jeff Cole
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/jeffcole" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F1175290%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F1175290%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo First Person
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Francis De Brabandere
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/francisdb" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/somatik" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F161305%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F161305%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Morph
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Elm Explorations
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/elm-explorations" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F26491321%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars0.githubusercontent.com%2Fu%2F26491321%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Library webgl
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Dave Jeffrey
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/lepoetemaudit" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F10742921%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F10742921%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Terrain
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Brian J Ball
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Ball" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/Myotherpants" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F20161%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F20161%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Procedural Landscape
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Ben Postlethwaite
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/bpostlethwaite" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F1176674%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars2.githubusercontent.com%2Fu%2F1176674%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Glelm
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Andrea Peltrin
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/passiomatic" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈ &lt;a href="https://twitter.com/passiomatic" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;⬈ &lt;a href="https://discourse.elm-lang.org/u/passiomatic" rel="noopener noreferrer"&gt;Discourse&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F56371%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F56371%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Quake Arena
&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h3&gt;
  
  
  Alexander Foremny
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/aforemny" rel="noopener noreferrer"&gt;Github&lt;/a&gt;⬈&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F610962%3Fs%3D60%26v%3D4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F610962%3Fs%3D60%26v%3D4" alt="Photo" width="60" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo Hannover
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elm</category>
      <category>webgl</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
