Tune in to the tools and techniques in the Elm ecosystem.
The cost of JavaScript in 2019 (discusses the cost of JSON parsing strings vs. JS JSON literals in this section)img tag lazy attributedillonkearns/elm-bcp47-language-tagjfmengels/elm-review-unusedMario Rogic's gist on the reasons code splitting can't be done right now with Elm's compiler internalsBreaking up with SVG-in-JS blog postHTML use tag lets you do SVG sprite sheetsElm Radio Code Generation episodematheus23/elmjs-inspectProjects We Wish We Had Time For episodeWhy We're Breaking Up with CSS-in-JSdillonkearns/elm-css-transpiler-demoSimon Lydell's discourse post What I've learned about minifying Elm code
Wolfgang Schuster (github) (twitter)elm-open-api (NPM package) (Elm package)Akita (now part of postman)JSON Schemadillonkearns/elm-formWolfgang's Effortless SDKs blog postGraphQL Custom Scalar Codecs feature in dillonkearns/elm-graphqlelm-units packageOpen API Generatorswagger-elmelm-open-api Real World example
Andrew MacMurray (github) (site)elm-concurrent-tasklobanov/elm-taskportelm-pages v3's BackendTask APIelm-review-simplify0ui/elm-task-parallel packageelm/core Task APIlamdera-program-testelm-pkg-js - A standard for shipping simple JS with Elm Packageselm-concurrent-task pipeline worker example
Jakub Hampl (github) (site)elm-visualizationelm-visualization intro guideelm-visualization's Scale APID3 selectionselm-vega and elm-vega-liteelm-visualization's example gallerygampleman/elm-example-publisherWGS84 specavh4/elm-colorelm-community/typed-svgfolkertdev/one-true-path-experimentelm-visualization 2.4.0 release notesWeather radial examplegampleman/elm-rosetree
Wolfgang Schuster (github) (twitter)Elm WeeklyElm CampsegakcapElm Online MeetupElmcraftElm LandElm at a Billion Dollar Company episodeElm 2022 Year in Review postThe Elm DiscourseCasper Schipper's audio/visual art pieceEmail elmweekly.wolfgang gmail.com to suggest links for the newsletter
Katja Mordaunt (github) (website)Code Reading ClubCode Reading Club's GitHubFelienne HermansThe Inner Game of Tennis Felienne's book The Programmer's BrainScaling Elm Apps Elm Radio episode
Ryan Haskell-Glatz (twitter) (youtube) (github) (sponsor)elm-landElm Radio elm-spa episodeEvan's talk Let's be mainstream!"Take responsibility for user experiences" (from the Elm philosophy)Ryan's live stream video
Elm Radio episode Funding Open Source with Evan CzaplickiNonviolent CommunicationDavid Marquet TED Talk How Great Leaders Serve OthersElm Radio episode Developer Productivity
elm-review-unusedSafe dead code removal in a pure functional languageElm Town 60 with Wolfgang Schuster - Productivity and the culture of moving a little bit slower
Mario Rogic (GitHub) (Twitter)LamderaMario's Elm Europe talk Evergreen ElmLamdera 1.1.0 release notes (automatic migration generator)elm-pkg-js spec
elm-pages scripts episodeOptimizedDecoder in elm-pages v2Netlify's DPR (Distributed Persistent Rendering)elm-pages v3 Express community adapterelm-pages v3 Session APIWriting Great Docs episodedillonkearns/elm-form episodeelm-pages v3 announcement post
Ruby Enumerable moduleRuby Shovel OperatorJeroen's Elmcraft post ESLint Equivalents in ElmLamderaelm-uielm-tailwind-moduleselm-formatlamdera/program-test
Evan's Elm philosophy tweetelm-review docselm-doc-previewelm-review-documentationelm-verify-examplessparksp/elm-review-forbidden-wordselm-package-starterIdiomatic Elm Package Guideelm-bookElm Radio episode How (And When) to Publish a PackageDocs for Developers book
elm-review Data Extractorselm-codegenelm-pages Scriptsjfmengels/elm-review-licenseNoDeprecated Ruleelm-review preventExtract functionBrian Hicks' tree-grepperelm-review ModuleNameLookupTablejfmengels/elm-review-cognitive-complexityelm-coverageelmi-to-jsonReview.Test.expectDataExtractJeroen's blog post Gaining insight into your codebase with elm-review
Flavio Corpa (github)Flavio's blog post series Giving Names to StuffRunning Out of Maps blog postElm Radio Category Theory episodeFunctorsApplicativeMonadQuick check haskellcherry-coreNRI preludeScaling elm apps episodelexi-lambda comment about laziness in HaskellEffectful Haskell libraryundefined in HaskellStrange Loop conference talk Point-Free or Die: Tacit Programming in Haskell and BeyondElm 0.18 functions curry, uncurry, and flipElm in ActionHaskell Programming From First Principles book
dillonkearns/elm-formExploring a New Form API Design episode (discussion of some ideas that became dillonkearns/elm-form)Ellie example of elm-formMeetdown code that does additional checks to ensure that opaque type are trusted (sending unparsed data in Lamdera sendToBackend avoids this pattern)Lamdera example with elm-formelm-app-urldillonkearns/elm-package-starter
ChatGPTGitHub Co-PilotTweet showing intermediary questions prompt engineering techniqueelm-gql episodeDillon's prompt engineering type puzzle examplesDecode mapping solution (correct on first try)Markdown solution with 2 corrections from compiler feedbackDillon's Frame Then Fill In blog post describes a similar method to the GPT prompt
elm-codegen episodeElm Code Generation episodeScaffold API in elm-pages v3 betaExploring a New Form API Design episodeDHH Building a Rails blog in 15 minuteselm-pages Scripts episodeExample of elm-pages AddRoute scriptelm-pairelm-review-html-to-elmalexkorban/elm-review-json-to-elm
Philipp Krüger, aka matheus23 (github) (twitter)matheus23/elm-tailwind-modulesmatheus23/elm-default-tailwind-modulesTailwindCSSIntroduction to elm-tailwind-modules Elm Radio episodeTailwind UIhtml-to-elm.comelm-review-html-to-elm packagematheus23/elm-tailwind-modules-base
Simon Lydell (github)lydell/elm-app-urlShort YouTube walkthrough Introducing elm-app-urlJohn Kelly's blog post explaining the URL parser types understanding the design of elm/urlRichard Feldman's conference talk explaining early elm-css syntax design ideas and changes over time The Design Evolution of elm-css and elm-testURLSearchParams in JavaScriptWHATWG URL StandardArlo Belshee post on WET (Write Explicit Tests)
Lindsay Wardell (github)ViteESM (native JS module import statement)esbuildRollupVitestTurbopackVite SSR mode (for framework authors)vite-plugin-elmDocs on configuring ViteLindsay's vite-elm-templateWeb Workers APILindsay's blog post Utilizing Elm in a Web Workerelm-watch Elm Radio episodeArticle about finding Google Fonts embeds to be in violation of GDPRGoogle fonts download plugin setup in the elm-pages docs sitevite-nodeawesome-vite repoLindsay's ViteConf 2022 talk Functional Programming in Vite with ElmViteConf 2022 talks
elm-pages v3 (still in pre-release)elm-pages v2 DataSources are called BackendTasks in v3Feels similar to elm/core Task (andThen, map, mapError)Script.logMinimal setup repo for running scriptswolfadex/elm-inkBackendTask.Custommdgriffith/elm-codegenFatalErrorBackendTask.allowFatalZoddillonkearns/elm-cli-options-parser (Elm package for parsing command-line flags and showing help text)Other Elm tools for running scriptselm-posixelm-scriptelm-pages V3 starter (still pre-release)elm-pages V3 beta package#elm-pages Slack channel
Georges Boris (twitter) (github) (Uncover)elm-widgetsTwitter Bootstrapelm-themeelm-theme Tailwind pluginelm-sortable-table philosophy in readmeConfidenceman02/elm-select/latest/tesk9/elm-accessible-htmltesk9/paletteelm-theme showcase site using Elm Bookelm-theme theme generatorWhy Breaking Up with CSS-in-JS blog postLoading widgetsModal widgetsdetails HTML elementdialog HTML elementTooltipsCSS :has() pseudo-classJS tool for theming Theme UI
Bobby Tables XKCD comicSQL injectionsDDoS attacksXSS (Cross-Site Scripting) attack prevention cheatsheetJeroen's blog post Fixing vulnerabilities in Elm's virtual DOMHTTP cross origin cookie policy optionsRichard's Oslo Elm Day keynote where he discusses rolling your own tools for security reasonslukewestby/elm-http-builderOutput Encoding articleElm's Virtual DOM implementationFeross' CS 253 Stanford Web Security course on YouTubeWeb Security course notes and slidesFeross' blog post What's Really Going On Inside Your node_modules Folder?
GuestsMario Rogic (twitter) (github)Matthew Griffith (twitter) (github)LinksElmcraft.orgJeroen's Elmcraft article ESLint equivalents in ElmMartin Janiczek's Elmcraft article on Let PolymorphismElmcraft project on GitHubElmcraft discordelm-codegenelm-gqlMatt's Strange Loop talk CodeGen with Types, for Humans, by HumansTail recursion modulo cons elm optimize level 2 prelm-review extractors featureelm-pages-v3-betaelm-pages Script (v3 feature)OpenAI whisper project on GitHubelm-watchelm-bookelm-widgetsL*a*b color spaceelm.develm-watch episodeelm-tailwind-modules color parameterization PR
Practice makes permanentFlow book by Mihaly CsikszentmihalyiKey Principles of Deliberate PracticeIsolationAppropriate level of challengeIntrospectionCode katasFuzz buzzTennis kataRoman Numerals KataGilded roseConstraint gamesTDD is a core tenant of katasExercismMartin Janiczek fuzz testing (and elm-test v2) episodeAdvent of CodeDillon's elm-katas starter repoElm Gilded Rose starter repoTCR (test commit revert)Dillon and Corey Haines pairing using TCR on the Gilded Rose kata in ElmDillon's example TCR script for snapshot testing workflow
vendrinc/elm-gqldillonkearns/elm-graphqlelm-codegenThe Insomnia API client has a graphql toolGraphQL variablesWrap early, unwrap lateGraphQL Union TypesGraphQL Enum typesDillon's Types Without Borders elm-conf talkGraphQL fragmentsRichard Feldman's talk Immutable Relational DataElm Store Pattern episoderemotedata packageElm Radio elm-graphql episodeVendr is hiringDillon's Types Without Borders Isn't Enough blog postelm-ts-interop episodeGraphQL approach for sending allow listed hashed query to serverGraphQL field aliasesMatthew's Strange Loop talk CodeGen with Types, for Humans, by Humansharmboschloo/graphql-to-elmDeprecated jahewson/elm-graphql toolelm-gql repo guideelm-gql GitHub API example repo
Is TDD Dead? (TDD is Dead and associated video discussions with TDD experts)Roc-lang's tagged unionsXP (Extreme Programming)80-20 rule (i.e. Pareto Principle)Amanda Laucher's ScalaDays talk Types vs TestsKent Beck's book TDD by Exampledtwrks/elm-bookMartin Janiczek's Elm Online talk on Storybook-driven developmentTalk with demo of program synthesisRelentless Tiny HabitsCode Katas
Getting Things Done methodologyElm Radio Developer Productivity episodeElm Radio Parse, Don't Validate episodeScaling Elm apps Elm Radio episodeRuby's method_missingRuby's Enumerble API methodsJoël Quenneville's recommendation to write functions at a single level of abstractionelm-pages v3 API makes HttpOnly cookies opt-out instead of opt-inLlewellyn Falco and Woody Zuill's video Practical Refactoring ("Understand the code so we can change it" vs. "change the code so we can understand it")Elm Radio Incremental Steps episodeElm Radio Opaque Types episode
Aaron White (github) (twitter)Vendr (github)Vendr, Software Procurement Startup, Raises $150 Million at Unicorn Valuation - BloombergMake Impossible States ImpossibleLuke Westby's talk on Web ComponentsRichard Feldman's 2016 meetup talk on Web Componentselm-spa-exampleelm-spaelm-spa-realworld exampleEvan's elm-sortable-table repoActor framework or taco or Msg translator (nested TEA) didn't work out wellelm-codegenPlop templating toolStorybookEvan's vision for data interchangeVendr is hiring
Matthew Griffith (twitter) (github)elm-codegenelm-syntaxelm-syntax-dslelm-uiElm.Type.Type from elm/project-metadata-utils represents all possible Elm typeselm-codegen announcement post on DiscourseGuides from the elm-codegen repo
Simon Lydell (twitter) (github)elm-watchParcel build toolBuilding Trustworthy Tools Elm Radio episodeViteklazuka/elm-hotelm-tooling episodeelm-watch run-pty example folderSimon's run-pty tool for running commands in parallel
Sponsor: CareRevCareRev is looking for Senior Frontend Elm engineers (job listing).elm-review-simplifyElm Radio Root Cause of False Positives episodeDillon's pairing session using snapshot testing prototype with Corey Haineselm-snapshot-test prototype repoApproval testingelm-coverageelm-instrumentLlewellyn Falco Gilded Rose kata videoIdea: intellij integration for elm-coverageIdea: code actions for safe refactoringsIdea: elm-review integration in intellijIdea: sparksp/elm-review-imports either new feature, or separate project to give suggestions to make all inconsistent imports in a project consistentIdea: elm-review code actionsIdea: elm-review collection mechanism to gather data from an ASTPairwise testing (or all pairs)Idea: pairwise permutation API that minimizes the number of permutations to go through to get complete coverageIdea: mutation testing tool for Elm (is Phillip's tool relevant here?)Idea: generated API for elm-graphql but with factory-style API for mocking out data that is compliant to the graph schema, for use with things like elm-program-testIdea: Browser.application wrapper that provides some common initial flags like start time, initial window dimensions etcIdea: HTTP Error type to get bad status payload that can be shared between libraries to reuse the same type (similar to the HttpError type defined in elm-graphql)Aaron's community-standard elm-color packageIdea: tool to automatically vendor or un-vendor Elm packagesIdea: elm-format in ElmIdea: elm diff, but it gives you more detailed information about code changes even if they don't change the APIIdea: Phantom Builder analyzer that generates a state diagram from Elm codeIdea: suggest types based on what's possible in your current editor contextIdea: type inference and value inference in elm-reviewelm-http-fusionIdea: use a collection of HTTP requests to an endpoint in elm-http-fusion to gather better type incormation about an APIIdea: make tools like elm-http-fusion embeddable in the elm-pages dev server so you can interactively fix decoder errors, etc.Idea: elm-pages dev server code actions from the UI, like scaffolding new routeselm-codegenIdea: use elm-codegen for elm-pages scaffolding for user-customizable templatesOfficial Elm blog post The Syntax CliffIdea: show ANSI color code error messages embedded in blog postsTalk about the Hedy language: What every programmer should know about cognition by Felienne HermansElm Guide translated into FrenchIdea: translatable error messages and language keywords for ElmIdea: elm-css tool to make inline styles into static CSS files and replace the styles with a reference to the generated class. Goal: reduce bundle size and performance overheadIdea: codemod tool to post-process Elm code using elm-review fixes in a hidden temp directoryIdea: Elm step debuggerIdea: elm/parser debugger to see the state machine of what has been consumedIdea: Elm debugger improvements like filtering Msg types, customizable inspecting for certain typesIdea: inspectable Cmds in the debugger, or similar idea for debugging elm-pages DataSources to see why a failure happened and what the breadcrumbs areIdea: React ink, but for Elmawesome-elm-sponsorship repo
Jeroen's tweet on the root cause of false positivesEpistemologyIsabelle and TLA+ (proof systems)Precautionary principlearray-callback-return ESLint ruleelm-review's ModuleNameLookupTableJeroen's Safe unsafe operations in Elm blog postJeroen's Lambda Days 2022 talk (video not yet published)
Martin Janiczek (github) (twitter) (youtube)elm-test episodeFuzzing is also known as Property-Based TestingParameterized testsMartin's pure Elm text editor includes some fuzz testsMartin's pull request for the elm-test v2 changesIntegrated shrinking vs the value-based (AKA type-based) approachFuzz.andThen and Fuzz.filter (existed in 0.18 but were removed because they didn't shrink well)elm-test v2 upgrade guide and change notesPassing in random generators in elm-test v2 doesn't do shrinking so best to avoid that escape hatch and instead implement an equivalent fuzzerScott Wlaschin's post Choosing properties for property-based testingDiscourse post on call for testing help and how to install the beta releaseMartin's video series on designing the new fuzz testing API#testing channel on the Elm SlackHypothesis libraryHypothesis project's blogA paper about the Hypothesis reduction approach: Test-Case Reduction via Test-Case Generation: Insights From the Hypothesis Reducer
Parse, Don't Validateetaque/elm-formCodecs episodeSome similarities in the design for how you build up Custom Type codecs with elm-codec
Error messages should give three pieces of infoThe problemWhy it's a problemHow to go forwardNeeding to do magic incantations to get things into a good state adds cognitive load and makes debugging harderMake tools more predictableClear mental model (avoid inconsistencies and leaky abstractions)Doing an operation through different means should consistently arrive at the same resultGive contextAvoid caveatsTweet about layering platforms properlyExtensible web manifestoAvoid boy who cried wolf (becoming blind to noise from errors or warnings or other feedback)Halo Effect
Primitive Obsession episodeParse, Don't Validate episodeDillon's Entry Gatekeepers and Exit Gatekeepers blog postsDillon's talk on semantic types
Martin Janiczek (github) (twitter) (youtube)Martin's Store Pattern talkStore Pattern example GitHub repoGizra fetch pattern blog post elm-fetch, and Easier HTTP Requests to Reason withGizra elm-fetch packageRemoteData packageRemoteData blog post How Elm Slays a UI Antipatternelm-program-test is useful for integration testing data loadingelm-suspense proof-of-concept repoOkay to use Store pattern for mutations, just kick them off outside of dataRequestsDefunctionalizationWrap early, unwrap lateDerive from source of truth instead of storing derived data
Martin Stewart (github)State of Elm 2022 GitHub RepoBrian Hicks' State of Elm talk from Elm EuropeBrian's State of Elm 2018 blog postGitHub issues for state of Elm repoelm-pages showcase pageMartin's upcoming Goto conference talk - Hobby Scale: Making Web Apps with Minimal FussEvan's talk What is SuccessWhat's Working for Elm episodeMartin's Elm Online talk (including a preview of lamdera-test framework)
Georges Boris (twitter) (github)elm-bookElixir's Hex docsLeaf lang docs site (built with elm-book)elm-verify-exampleselm-book in elm-book guideelm-visualization examples siteelm-charts siteelm-widgets (alpha package docs)elm-admin (alpha package docs)elm-ui-explorer (alternative Elm storybook style framework - comes with knobs)dmy's Elm package repo sitedmy's githubelm-graphql selection set docs page (reads like a tutorial top to bottom)uncover.co
Alex Russell's post Platform Adjacency TheoryVoiceOver rotor utilityUse semantic HTML to improve screen reader experiencesForms - use onsubmit with a form to get nice keyboard handling and screen reader accessibilitydatetime-local tagsMDN docs for sending form dataHTMHell (examples of non-standard HTML from the wild and why it matters)Dillon's Use the Platform blog post
Incremental Steps episodeBuilt-in quality (from Lean principles)Tiny commitsKent Beck's book TDD by exampleDead Code episodeClose open loopsGetting Things Done (GTD) methodologyCapturingProcessingPomodoro Methodrainymood.comCentered AppTrunk-based developmentelm-review template flag (preview folder)sparksp/elm-review-no-forbidden-wordsSelf-documenting codeSelf-documenting code tweet and blog postelm-verify-examplesAPI Design Lessons episodeHammock-Driven DevelopmentReleasing vs. shippingContinuous DeliveryNaming as a Process article by Arlo Belshee
Oxbow code (code that was once used but is no longer in use)Jeroen's elm-review-unused elm-review ruleJeroen's blog post Safe dead code removal in a pure functional language blog postelm-review-simplifyGetting Things Done (GTD) methodologyInbox ZeroJeroen's no-extraneous-dependencies ruleTry out elm-review-unused with elm-review --template jfmengels/elm-review-unused/exampleJeroen's You thought you had no dead code post
Joël Quenneville (Twitter)Elm's Universal Pattern episodeList.concatMap is the same pattern as andThen under a different nameandThen identity can be used to flatten somethingDillon's Combinators articleMartin Janiczek's elm-list-cartesian package gives two valid map2 implementions for ListMonoid - need a way of having something empty, and way to combine two things - for example addition for numbers starting with 0Jeroen's elm-review-simplify packageMore of Joël's distillation of category theory ideas:Running out of maps (applicatives)The Mechanics of Maybe (taking maybe apart and putting it back together)Two ways of looking at map functions (functors)Elm's universal pattern (applicatives)Inverting a binary tree (folding, catamorphisms)Joël's directory of blog posts on the ThoughtBot blog
Solving the Boolean Identity Crisis (Elm Conf talk by Jeremy Fairbank)If It Compiles, It Works episodeOpaque Types episodeLife of a File talk by Evan CzaplickiRoc languageianmackenzie/elm-units packageParse, Don't Validate episodeUsing Semantic Types to Squash Bugs - Dillon's talk where he walks through the mechnical steps to safely introduce a wrapper typeDillon's Entry Gatekeepers blog post
Ju Liu (twitter) (github)Elm at NoRedInkJu's blognoredink-ui is NoRedInk's internal UI kit (live demo page)avh4/elm-program-testelm-sortable-table APIImplementing Elm Podcast season 1cultureamp/react-elm-components (React library for embedding Elm as a Web Component)elm-community/js-integration-examplesNoRedInk is hiring Elm and Haskell devsJu Liu's blog
Robin Hansen (twitter) (github)elm-optimize-level-2Html.Lazy APIOutperforming Imperative with Pure Functional Languages - talk about Roc by Richard FeldmanTail call optimizationSuccesses, and failures, in optimizing Elm's runtime performance - Robin's blog post series on his elm-optimize-level-2 optimizationsWASMMaybe you don't need Rust and WASM to speed up your JSBrian Carroll's blog posts on an Elm WASM prototypeRobin's Stabel language - a stack oriented language that compiles to WASMWhat's Working for Elm Elm Radio episodeProcess.elm comment about the potential for parallelizing work
Dillon's blog posts If It Compiles It Works and When It Compiles But Doesn't WorkWiringRefactoringRunning code paths to check it works vs checking assumptions at the gateDillon's talk Types Without BordersShotgun surgery - Parse, Don't Validate episodeOrder independentYou can trust your testsKeeping what you depend on to a minimum helps make things trustworthySemantics can make it harder to predict (like parser)Json.Decode.maybe is almost never what you intendScaling Elm Apps talk by Richard FeldmanGary Bernhardt's Wat videoElm Radio Opaque types episode
Woody Zuill on Turn Up the GoodMob ProgrammingWhere Could We Turn Up the Good?Pure FPElm 0.19 removing side effectsPurity is what makes elm-review interestingJeroen's post Safe dead code removal in a pure functional languageNo runtime exceptionsUseful Error MessagesUseful error messagesEvan's 2017 Deconstructconf talk Evan Czaplicki On StorytellingEvan's talk What is Success?Having a single language flavorIsomorphic codeMeta frameworks (elm-pages, Lamdera, elm-spa)Decoupled toolsThe community can iterate quickly and experiment with new changeselm-optimize-level-2 and elm-format are great exampleselm-optimize-level-2 can make their way upstream and don't break Elm's guarantees or assumptionsRobin Hansen's blog post series Successes, and failures, in optimizing Elm's runtime performanceExtensible Web ManifestoPlatform should provide building blocks, not solve every specific use caseStable CoreStable data layer, architecture allows ecosystem to evolve around it with less churnCommunity Members Working on What They're Passionate AboutPeople passionate about a problem working on it in the ecosystemPerformanceLeveraging Elm's unique characteristics for performance (immutability, static language, known types, etc.)Elm compiler performance - compiler speed mattersContent and ConferencesElm community content and conferencesElm Online meetdownThe Elm PhilosophyEvan's Elm philosophy tweetPhilosophy has influenced package design in the ecosystemElm Slack #api-design channel
Our special guestsRyan Haskell-Glatz (twitter) (github)Brian Hicks (twitter) (github)Robin Heggelund Hansen (twitter) (github)