Tune in to the tools and techniques in the Elm ecosystem.
The podcast Elm Radio is created by Dillon Kearns, Jeroen Engels. The podcast and the artwork on this page are embedded on this page using the public podcast feed (RSS).
img
tag lazy
attributedillonkearns/elm-bcp47-language-tag
jfmengels/elm-review-unused
use
tag lets you do SVG sprite sheetsmatheus23/elmjs-inspect
elm-open-api
(NPM package) (Elm package)dillonkearns/elm-form
dillonkearns/elm-graphql
elm-units
packageelm-open-api
Real World exampleelm-concurrent-task
lobanov/elm-taskport
elm-pages
v3's BackendTask APIelm-review-simplify
0ui/elm-task-parallel
packageelm/core
Task APIlamdera-program-test
elm-pkg-js
- A standard for shipping simple JS with Elm Packageselm-concurrent-task
pipeline worker exampleelm-visualization
elm-visualization
's Scale APIelm-vega
and elm-vega-lite
elm-visualization
's example gallerygampleman/elm-example-publisher
elm-community/typed-svg
folkertdev/one-true-path-experiment
elm-visualization
2.4.0 release notesgampleman/elm-rosetree
elmweekly.wolfgang <at> gmail.com
to suggest links for the newsletterelm-land
elm-pkg-js
specelm-codegen
jfmengels/elm-review-license
preventExtract
functiontree-grepper
jfmengels/elm-review-cognitive-complexity
elm-coverage
elmi-to-json
Review.Test.expectDataExtract
dillonkearns/elm-form
dillonkearns/elm-form
)elm-form
elm-app-url
dillonkearns/elm-package-starter
elm-gql
episodeDillon's Frame Then Fill In blog post describes a similar method to the GPT prompt
lydell/elm-app-url
esbuild
vite-plugin-elm
vite-elm-template
elm-watch
Elm Radio episodeelm-pages
docs sitevite-node
awesome-vite
repoDataSource
s are called BackendTask
s in v3elm/core
Task
(andThen
, map
, mapError
)Script.log
wolfadex/elm-ink
BackendTask.Custom
mdgriffith/elm-codegen
FatalError
BackendTask.allowFatal
dillonkearns/elm-cli-options-parser
(Elm package for parsing command-line flags and showing help text)#elm-pages
Slack channelelm-widgets
elm-theme
elm-theme
Tailwind pluginelm-sortable-table
philosophy in readmetesk9/elm-accessible-html
tesk9/palette
elm-theme
showcase site using Elm Bookelm-theme
theme generatordetails
HTML elementdialog
HTML element:has()
pseudo-classlukewestby/elm-http-builder
elm-codegen
elm-gql
elm-watch
elm-book
L*a*b
color spaceelm-watch
episodeelm-tailwind-modules
color parameterization PRKey Principles of Deliberate Practice
Isolation
Appropriate level of challenge
Introspection
TDD is a core tenant of katas
Martin Janiczek fuzz testing (and elm-test v2) episode
Dillon's elm-katas
starter repo
Dillon and Corey Haines pairing using TCR on the Gilded Rose kata in Elm
vendrinc/elm-gql
dillonkearns/elm-graphql
elm-codegen
remotedata
packageelm-graphql
episodeharmboschloo/graphql-to-elm
dtwrks/elm-book
method_missing
elm-spa
elm-spa-realworld
exampleelm-codegen
elm-codegen
elm-syntax
elm-syntax-dsl
elm-ui
Elm.Type.Type
from elm/project-metadata-utils
represents all possible Elm typeselm-codegen
announcement post on Discourseelm-codegen
repoklazuka/elm-hot
Sponsor: CareRev
CareRev is looking for Senior Frontend Elm engineers (job listing).
elm-review-simplify
elm-snapshot-test
prototype repoelm-coverage
elm-instrument
elm-coverage
sparksp/elm-review-imports
either new feature, or separate project to give suggestions to make all inconsistent imports in a project consistentelm-review
code actionselm-review
collection mechanism to gather data from an ASTelm-graphql
but with factory-style API for mocking out data that is compliant to the graph schema, for use with things like elm-program-test
Browser.application
wrapper that provides some common initial flags like start time, initial window dimensions etcHttpError
type defined in elm-graphql
)elm-color
packageelm-format
in Elmelm diff
, but it gives you more detailed information about code changes even if they don't change the APIelm-review
elm-http-fusion
to gather better type incormation about an APIelm-http-fusion
embeddable in the elm-pages dev server so you can interactively fix decoder errors, etc.elm-codegen
for elm-pages scaffolding for user-customizable templateselm-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 overheadelm-review
fixes in a hidden temp directoryelm/parser
debugger to see the state machine of what has been consumedCmd
s in the debugger, or similar idea for debugging elm-pages
DataSources to see why a failure happened and what the breadcrumbs areink
, but for Elmawesome-elm-sponsorship
repoarray-callback-return
ESLint ruleelm-test
episodeFuzz.andThen
and Fuzz.filter
(existed in 0.18 but were removed because they didn't shrink well)#testing
channel on the Elm Slacketaque/elm-form
elm-codec
elm-fetch
packageRemoteData
packageelm-program-test
is useful for integration testing data loadingelm-suspense
proof-of-concept repodataRequests
elm-book
elm-book
)elm-verify-examples
elm-charts
siteelm-widgets
(alpha package docs)elm-admin
(alpha package docs)elm-ui-explorer
(alternative Elm storybook style framework - comes with knobs)dmy
's githubelm-graphql
selection set docs page (reads like a tutorial top to bottom)<input>
tagsBuilt-in quality (from Lean principles)
Tiny commits
Kent Beck's book TDD by example
Close open loops
Capturing
Processing
elm-review template flag (preview folder)
Self-documenting code
Self-documenting code tweet and blog post
Releasing vs. shipping
Naming as a Process article by Arlo Belshee
elm-review-unused
elm-review
ruleelm-review-simplify
elm-review-unused
with elm-review --template jfmengels/elm-review-unused/example
List.concatMap
is the same pattern as andThen
under a different nameandThen identity
can be used to flatten somethingelm-list-cartesian
package gives two valid map2
implementions for List
elm-review-simplify
packageMore of Joël's distillation of category theory ideas:
ianmackenzie/elm-units
packageavh4/elm-program-test
elm-community/js-integration-examples
elm-optimize-level-2
Html.Lazy
APIProcess.elm
comment about the potential for parallelizing workJson.Decode.maybe
is almost never what you intendelm-review
interestingUseful error messages
elm-pages
, Lamdera, elm-spa
)elm-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 assumptionsGuest: Andrey Kuzmin (github) (twitter)
elm-explorations/webgl
elm-explorations/linear-algebra/latest
elm-3d-scene
exampleselm-webgl-playground
examplesany
typeany
vs. Elm's Debug.todo
TypeScript's any
essentially "turns off" type checking in areas that any passes through.
In Elm:
Debug.todo
, but you can't build your app with --optimize
if it has Debug.todo's in itThis Ellie example (with compiler error as expected) and this TypeScript playground example (with no error) show the difference.
any
can not be used in places that take never
any
vs unknown
JSON.parse
returns any
, as do many core and published typingsio-ts
lets you validate JSON similar to JSON decoders in ElmnoImplicitAny
+
object, '' + {} === '[object Object]'
)any
regardless of implementation if they aren't given an explicit typenumber
values instead of literal typeselm-ts-interop
dillonkearns/elm-markdown
1
interrupt paragrpahs, starting with other numbers don'tdillonkearns/elm-markdown
's Core Tools for ExtensibilityHtml handlers (example)
Transforming parsed Markdown Blocks (AST)
incrementalelm.com code for getting back references from parsed markdown
Extracting table of contents example
Discussion to formalize HTML parsing and error handling spec in dillonkearns/elm-markdown
Example of unintuitive raw HTML tag handling in markdown: <span>
closed by whitespace (ignores closing tag)
Wikilinks
Matthew Griffith's elm-markup
package
Matt's Oslo talk on fault tolerant parsing A Markup for the Statically Typed
Render to a function (example)
Markdown announcement blog post Extensible Markdown Parsing in Pure Elm
#markdown
channel in The Elm Slack
Example of extracting title and description from parsed markdown
Submit a talk proposal to the Elm Online Call for Speakers form
Phantom types (happens at compile time, not runtime)
Helps avoid things like adding centimeters and inches
Joël Quenneville's phantom types talk from Elm in the Spring A Number by Any Other Name
Extensible records
Builder pattern
elm-graphql
SelectionSet
scope type variable
Brian Hicks' builder pattern talk Robot Buttons from Mars
with
functions
Phantom builder is a state machine for your types
elm-review
Rule API uses phantom builder
Phantom types discourse post on time package Simon Herteby
Snapshot test in Elm review for expected error messages
terezka/elm-charts
line-charts
and elm-plot
gampleman/elm-visualization
elm-vega
Lamdera is about removing non-essential complexity - 6 concepts
elm-pkg-js
specelm-webapp
elm-review-performance
Html.Lazy
List.map
will return a list with a new reference, for example.bcp-47-language-tag
packageelm-optimize-level-2
elm-explorations/benchmark
gatherWith
isInfixOf
elm-pages
v2!elm-pages
has a build stepDataSource.File
DataSource.fail
DataSource.Glob
DataSource.distillCodec
elm-graphql
DataSource
example from incrementalelm.comelm-spa
V5 Docselm-spa
v5 episodeProvide/redirect protected custom type
Eject workflow
Can Eject not found page
Eject workflow stops generating files when they're ejected
Inspired by Nuxt
Page builder API (like browser sandbox)
No more int or string in url
elm-pages
2.0 routing and splat routes
UI namespace in elm-spa docs repo has a shared page helper function for building the shared header/footer
elm-spa 6 has fewer ignored arguments compared to v5 - now wired through in page top level function and you can wire to update, init, etc.
Effect pattern - elm-spa
v6 has an ejectable Effect
module
elm-real-world
SPA example (elm-spa-example
using elm-spa
framework)
#elm-spa-users
channel on the Elm Slack
prefers-reduced-motion
media querytesk9/accessible-html
list-style-image
in CSSelm-css
- tesk9/accessible-html-with-css
map2
Maybe.map2
Some common metaphors for Elm's Universal Pattern (Applicative Pattern).
Mapping
Combining
Lifting
Wrapping and unwrapping boxes
Blog post on Two ways of looking at map functions
Separate branching code from doing code (discussed in-depth in Joël's blog post Problem Solving with Maybe)
Stay at one level of abstraction
Json decoders as combining functions
Scott Wlaschin Railway Oriented Programming
Dillon's blog post Combinators - Inverting Top-Down Transforms
The JSON structure and Elm type don't have to mirror each other - start with your ideal type and work backwards
Applicative pattern
Applicative needs 1) way to construct, 2) map2
or andMap
Json.Decode.Pipeline.required
function
map2
doesn't take a type, it takes a function -NoRedInk/elm-json-decode-pipeline
is a useful reference for implementing this kind of api on your ownelm/parser
episodeSome more blog posts by Joël that related to Elm's Universal Pattern:
Joël's journey to building a parser combinator:
What's the source of truth?
Teach the Elm compiler about external things like schemas
Macros in other languages
Vanilla code generation can be inspected and debugged like plain handwritten code
Gitignore gen code so you know you didn't forget to generate it on the build server
Rerun code gen when the source of truth changes ideally
The Design of Everyday Things by Donald Norman
Affordances
Mappings
elm-review init
, new-rule
, and new-package
elm-spa new
elm-graphql
's snapshot testing scriptelm-verify-examples
Debug.todo
node --inspect
elm-test-rs
Debug.log
in unit testsTest.only
for running just one test
or describe
Debug.log
s in each path of an if or case expressiondillonkearns/elm-review-html-to-elm
(elm-review version of html-to-elm.com)
Elm review cli new rule command
Review context
elm-review
's context is like Model
, elm-syntax Node
is like a Msg
, Review Error
s are Cmd
s, visitors are like update
elm-review
's new configuration errors API
Import aliases feature: ModuleNameLookupTable
elm-review
Fixes API
Jeroen's Safe Unsafe Operations blog post
Some repos to look at for inspiration
The elm-review
package docs are very through and worth reading
elm-program-test
episodeon
events (schedule
, workflow_dispatch
, pull_request
, etc.)elm-review new-package
npm-run-all test:*
, but don't know the order it will run inmatheus23
(github) (twitter)matheus23/elm-tailwind-modules
elm-reduce
(Philipp's Bachelor's thesis)elm-ui
monty5811/postcss-elm-tailwind
paved the path for Philipp's libraryjustinrassier/postcss-elm-css-tailwind
rtfeldman/elm-css
(it's a drop-in replacement for elm/html
)miyamoen/elm-origami
matheus23/elm-default-tailwind-modules
is the best way to start (it's the generated elm-tailwind-modules
code for the default TailwindCSS configuration)elm-tailwind-modules
currently requires you to order your breakpoints from high to low (see docs)tesk9/accessible-html
github.com/dillonkearns/elm-pages-starter
elm-pages-tailwind-starter
elm-ui
episodeminiBill/elm-ui-with-context
elm-ts-interop
landing page (built with elm-tailwind-modules
)dillonkearns/elm-review-html-to-elm
elm-css
's fromUnstyled
and toUnstyled
are helpful for incremental adoption (start refactoring from the leaves)elm-language-server
elm-format
's abstract syntax tree output is in the brainstorming phaseelm-typescript-interop
(the old approach)elm-ts-interop
Elm Radio episodeelm-ts-interop
elm-typescript-interop
elm-typescript-interop
relied on Elm's automatic JSON serialization flags/ports. elm-ts-interop
passes Json.Decode.Value
's which is what the guide recommends.elm-ts-json
Elm pacakgegraphql-js
- schema-first GraphQLelm-ts-json
Encode docsTwo articles about the redesign of elm-ts-interop
(originally published in Bekk's Functional Christmas posts)
elm-format
episodeelm-program-test
elm-test
elm-test
episodeensure
vs. expect
functionselm-program-test
example using a generalized Effect typeelm-program-test
Guidebookelm-test
HTML querying API#testing
channel in Elm Slackelm-format
prettier
gofmt
, the built-in Go formatting toolelm-format
editor integrations tableelm-tooling
elm-tooling
Elm Radio episodeelm-format
tips tweetNoExposingEverything
ruleJ
in vim, also available with intellij keybindings)elm-tooling-cli
elm-json
npx
elm-publish-action
scripts
sectionpostinstall
scriptsnpm config set ignore-scripts true
, which can cause issues because it also skips the postinstall
from your package.json
elm-tooling-cli
docs websiteelm-tooling
npm run --silent
(or -s
) to reduce noise (more ways to do it in this StackOverflow answer)npm test
and npm start
to run start
and test
from your package.json
scriptselm-tooling
quick start pagenpx
command runs NPM binaries from your shellSome tricks to easily try elm-review
with no setup:
npx elm-review --template jfmengels/elm-review-unused/example
Init with a given template:
npx elm-review init --template jfmengels/elm-review-unused/example
ignoreErrorsForFiles
ignoreErrorsForDirectories
--fix
, --fix-all
, and --watch
flags (see how to run elm-review)Review rule for Documentation.ReadmeLinksPointToCurrentVersion
Safe unsafe operations in Elm blog post
Getting started with elm-review episode
Incremental Steps episode
<head>
Elm optimization instructions for using Terser, the --opimize
flag, and elm-optimize-level-2
Dev tools performance tab
Ju Liu's article, Performant Elm, on analyze Elm performance using Chrome Dev Tools
Here's an in-depth conference talk on different script tag techniques. Ishows the differences between different ways to load script tags, including using async
, defer
, and in HTML <head>
vs. <body>
miniBill/elm-codec
- JSON codec libraryMartinSStewart/elm-codec-bytes
elm-codec's FAQ section on backwards compatability
Mario Rogic's talk on Elm Evergreen
Mario Rogic's talk on Lamdera
Elm codec API - string, Bool, object
MartinSStewart/elm-serialize/latest/
, encodes in a format that is optimized for compactnessdillonkearns/elm-graphql
elm-graphql
's FAQ document
Article about simple design in ElmSelectionSet.nonNullOrFail
SelectionSet.mapOrFail
Juniper for Rust
Hasura (database-schema based API)
Postgraphile (database-schema based API)
Discourse thread on differences between all the Elm graphql libraries
harmboschloo/graphql-to-elm
- library for generating Elm functions to make queries from GraphQL strings
Evan Czaplicki's talk The Life of a File.
Richard Feldman's Frontend Masters Elm courses
Explore many different data modeling options
Wait until you feel the pain vs create abstractions before you need them
Does the code quality metric of line count apply in Elm since there's no spooky action at a distance
Aim for loose coupling, high cohesion
Localized reasoning
Core mechanics of Elm modules
You can think of the update function as a delegator - get things to the right place rather than doing the work itself
Protecting invariants
Hiding internals
Decoupling
TDD helps drive module design.
Experiment, but review your experiments before they become deeply ingrained.
Pain in code is for sending a message.
Technical debt isn't about "clean code". It's abstractions that serve what the code is doing. Abstractions are inherently expensive and a type of tech debt if they don't serve a purpose for your specific needs.
Be proactive - immediately as soon as there is a clear way to make code better (not perfect, small improvement) - do it
Testing is helpful for identifying modules - see keystone testing habit blog post
Property based testing is a sign that something is a module - it has a clear property, which means you want to protect the internals
It's okay to get it wrong, just don't get it all wrong up front with premature abstractions.
Tereza's line-charts
package
Tereza's elm Europe talk
Snapshot testing (also called Approval Tests)
Jeremy Fairbank's Boolean Blindness talk
elm-spa
elm-spa-example
GitHub repoBrowser.application
Url.Parser
- URL parsing in Elm for routing single-page appselm-shared-state
pattern (formerly called elm-taco
)Next.js
and NuxtJS
elm-spa
#elm-spa-users channel on the official Elm slack
elm-spa-realworld (Ryan's version of elm-spa-example
using his elm-spa
framework)
Exploring elm-spa example - Richard's conference talk walking through codebase
Richard's Frontend Masters courses focus heavily on his elm-spa-example
repo
the difference between validation and parsing lies almost entirely in how information is preserved
Shotgun parsing is a programming antipattern whereby parsing and input-validating code is mixed with and spread across processing code—throwing a cloud of checks at the input, and hoping, without any systematic justification, that one or another would catch all the “bad” cases.
a parser is just a function that consumes less-structured input and produces more-structured output [...] some values in the domain do not correspond to any value in the range—so all parsers must have some notion of failure
Maybe.withDefault
might indicate an opportunity to parseTwo ways to use this technique:
Weaken return type
Strengthen input type
Elm Radio JSON decoders episode
elm-test
Basicselm-explorations/test
Elm packageelm-test init
commandelm-test
finds exposed values of type Test
Also known as Property-Based Testing
Martin Janiczek's elm-minithesis
project
elm-test
's view testing API includes Test.Html.Query
, Test.Html.Selector
, and Test.Html.Event
View objects
Mocking and stubbing are not needed or possible in Elm
Order dependent test helper in Ruby: i_suck_and_my_tests_are_order_dependent
elm-program-test
Martin Janiczek's elm Europe talk on testing Msg's with ArchitectureTest
test-update
packageelm-ui
packageElement.padding
(no concept of margin)There used to be a notion of a single type defining all possible styles
Latest elm-ui
simplifies that by using only inline styles. You build your own abstractions with vanilla Elm functions/modules etc.
Element
type is the equivalent of the Html
type from elm/html
Element.html
works at leaf nodes, but elm-ui
in general doesn’t mix with plain html
Element.htmlAttribute
Refactoring is a huge asset for a team, so much easier than css refactoring
Doesn’t expose all the css tricks directly, sometimes you need escape hatches to access those
elm-pages
classifyDevice
is an optional helper for responsivenessElement.row
, column
, el
Element.Region
module.Element.paragraph
uses text wrappingem
/rem
elm-ui
doesn't expose access to rem
and em
units to simplify the mental model and reduce overlapping ways to express somethingLucas Payr's elm-ui-widgets
Alex Korban's elm-ui
patterns
)
elm-ui
viewsElement.explain
gives you highlights around nested elementselm-ui
, but elm-ui
is much more traceable because it doesn't have layout cascading like CSSelm-ui
announcement talk at Elm Europe (was about elm-style-elements
, but still worth a watch)elm-ui
conference talkelm-ui
concepts)Codegen
Macros
Wrapper elm apps
Can emulate effect managers
Platform.worker
Introspection
Ports and flags
Web Components
Code transformation
Elm asset loader webpack
Hacking JS to get FFI
Depending on internal details could end up with broken code
elm-hot and elm-hot-webpack-loader
Codegen
Macros
Provide a platform with extensions in mind when you build tools so you don’t require users to hack
When you build a tool, think about the mental model for uses, let that guide you. Avoid leaky abstractions
Be opinionated about the core things, and unopionated about what’s not essential to the tool
[elm-spa](https://github.com/ryannhg/elm-spa)
elm/parser
chompIf
and chompWhile
Parser.oneOf
elm-explorations/benchmark
Parser.succeed
Indications that you might be better off with parser
elm/parser
Step
type (Loop
and Done
)elm-test
!There's likely a specification doc if you're parsing a language or formal syntax
Look at examples of parser projects
dillonkearns/elm-markdown
elm-in-elm
parsermdgriffith/elm-markup
- good reference for parsing, fault-tolerant parsing, and giving nice error messagesLook at elm/parser docs and resources
list-extra
packagedict-extra
packageelm install author/package-name
) can be useful in some cases to remove a dependency from your packageMajor version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.
Start by asking "What problem are you solving? Who are you solving it for?"
Scratch your own itch
servant-elm
(for Haskell servant)
Keep yourself honest about solving problems by starting with an examples/
folder
Early elm-graphql
commits started with examples before anything else
Write meaningful test cases with elm-test
Have a clear vision
Ask people for feedback
Let ease of explanation guide you to refine core concepts
elm-review
live stream videoelm-http-builder
packageelm-spa-example
's custom http request builder moduledate-format
packageelm make --docs docs.json
will tell you if you're missing docs or if there are documentation validation errorselm-doc-preview
dillonkearns/elm-markdown
packageelm-publish-action
GitHub Action will publish package versions when you increment the version in your elm.json
- nice because it runs CI checks before finalizing a new package releaseelm publish
will walk you through the steps you need before publishing the first version of your Elm package#packages
channel on the Elm slack shows a feed of packages as they're published#api-design
channel on the Elm slack is a good place to ask for feedback on your API design and package ideaShare your package ideas with us @elmradiopodcast on Twitter!
elm/json
package docsHere's an Ellie example that shows the error when you have an implicit type that your flags decode to and it's incorrect.
Sorry Dillon... Jeroen won the trivia challenge this time 😉 It turns out that ports will throw exceptions when they are given a bad value from JavaScript, but it doesn't bring down your Elm app. Elm continues to run with an unhandled exception. Here's an Ellie example.
Flags and ports will never throw a runtime exception in your Elm app if you always use Json.Decode.Value
s and Json.Encode.Value
s for them and handle unexpected cases. Flags and ports are the one place that Elm lets you make unsafe assumptions about JSON data.
elm-iso8601 package
elm/time package
Json.Decode.succeed
is helpful for stubbing out dataJson.Decode.fail
lets you validate data and fail your whole decoder if there’s a problemelm-cli-options-parser
packageJson.Decode.maybe
docsNote about Decode.maybe
. It can be unsafe to use this function because it can cover up failures.
Json.Decode.maybe
will cover up some cases that you may not have intended to. For example, if an API returns a float we would suddenly get Nothing
back, but we probably want a decoding failure here:
import Json.Decode as Decode
""" {"temperatureInF": 86} """ |> Decode.decodeString (Decode.maybe (Decode.field "temperatureInF" Decode.int))
--> Ok (Just 86)
""" {"temperatureInF": 86.14} """ |> Decode.decodeString (Decode.maybe (Decode.field "temperatureInF" Decode.int))
--> Ok Nothing
Json.Decode.Extra.optionalNullableField
might have more intuitive and desirable behavior for these cases.
Thank you to lydell for the tip! See the discussion in this discourse thread.
elm-graphql
packageelm-pages
elm-pages
StaticHttp
API docsintellij-elm
JSON decoder generatorJson.Decode.map
type alias Album = { ... }
Submit your question to Elm Radio!
Some patterns
Example - the Element type in elm-ui.
Definition of the Element type alias
elm-ui's elm.json file does not expose the internal module where the real Element type is defined.
Example from elm-graphql codebase - CamelCaseName opaque type
elm-pages hydrates into a full Elm app. It solves similar problems to what GatsbyJS solves in the ReactJS ecosystem.
https://korban.net/elm/elmstatic/
https://jekyllrb.com/
Eleventy
Github issue discussing using the Unix Toolchain Philosophy in the context of keeping elm-pages focused on primitive assets for elm apps
Compared to extending the Gatsby webpack config
SOLID Open-Closed Principle
Chandu's art showcase (built with elm-pages) - https://tennety.art/
https://www.sanity.io/
contentful.com
https://airtable.com/
netlifycms.org
CDN hosting provider Netlify
https://jekyllrb.com/ - static site builder in Ruby - perhaps the first static site generator?
Eleventy - spritual successor to Jekyll - but more flexible
More info on what exactly is the JAMstack?
StaticHttp Docs (there's a description of when and why you would use this compared to elm/http)
elm-pages.com blog post A is for API - talks about StaticHttp and its lifecycle, including some example code.
Incremental Elm Live - Twitch streaming series
En liten tjänst av I'm With Friends. Finns även på engelska.