spotifyovercastrssapple-podcasts

2022 Holiday Special

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.
December 19, 2022
#72

Transcript

[00:00:00]
Hello, Jeroen.
[00:00:01]
Hello, Dillon.
[00:00:02]
And, well, it's feeling a little bit of holiday spirit in the air today, wouldn't you say?
[00:00:09]
No, I would just say it's feeling very cold here.
[00:00:12]
I've got three sweaters on me and I'm just cold.
[00:00:17]
But yeah, there's also a little bit of Christmas feeling.
[00:00:20]
Maybe it's not a holiday spirit, maybe it's a phantom type.
[00:00:24]
Oh, I wish we had the three phantom types here for Christmas.
[00:00:31]
The phantom type of Elm, Past, Present and Future?
[00:00:35]
That would be very interesting.
[00:00:37]
Well, let's find out.
[00:00:39]
We've got a couple of guests here to ring in the new year with us.
[00:00:43]
Our good friend Matt Griffith is here.
[00:00:45]
Welcome, Matt.
[00:00:46]
Thanks for having me.
[00:00:47]
Good to be here.
[00:00:48]
Thanks for being back.
[00:00:49]
And of course, the one and only Mario Rojek is with us.
[00:00:52]
Hello, Mario.
[00:00:53]
Hello, hello.
[00:00:54]
Thanks so much for being here.
[00:00:56]
Great to have you too.
[00:00:57]
Yeah, good to be here.
[00:00:58]
It's good.
[00:00:59]
It's a good time.
[00:01:02]
It's a good time to be alive.
[00:01:04]
So yeah, let's get into it.
[00:01:06]
So today we're just kind of ringing in the new year, reflecting a little bit on this
[00:01:12]
year in Elm and looking forward to the next year.
[00:01:15]
So let's start out.
[00:01:17]
What were some projects that you all worked on this year?
[00:01:21]
Does anybody want to start anything that they shipped or were working on that they're really
[00:01:25]
excited about?
[00:01:26]
I shipped nothing this year.
[00:01:27]
It's a year of lack of shipping.
[00:01:30]
A year of preparation.
[00:01:33]
Maybe that's not true.
[00:01:35]
I can't remember when I...
[00:01:36]
Did I release Elmcraft this year?
[00:01:38]
I might have.
[00:01:39]
I can't even remember.
[00:01:40]
It feels like it.
[00:01:41]
It feels like it's been...
[00:01:42]
No, I did.
[00:01:43]
Technically I did.
[00:01:44]
You did announce Elmcraft.
[00:01:45]
You absolutely announced Elmcraft this year.
[00:01:46]
Yeah, February 20th.
[00:01:47]
There we go.
[00:01:48]
I released the thing.
[00:01:50]
For people who don't know, I think you should pitch Elmcraft.
[00:01:53]
Yes.
[00:01:54]
For people who don't know.
[00:01:55]
Well, you know what?
[00:01:56]
I now no longer know.
[00:01:59]
So I'm going to get rid of it.
[00:02:03]
So I'm going to just read the about page from Elmcraft.
[00:02:05]
So yeah, Elmcraft is an unofficial endeavor curated by a bunch of people who love and
[00:02:10]
use Elm.
[00:02:11]
So our goal is for Elmcraft to be the official, unofficial place for all things Elm.
[00:02:16]
So yeah, it's pretty much me thinking that or feeling that there was a wealth of kind
[00:02:20]
of knowledge, projects, initiatives, and people in the Elm community.
[00:02:25]
And Elmcraft is kind of like a map to help you find your way amongst all those things.
[00:02:30]
Is that Elmcraft.com?
[00:02:33]
It's Elmcraft.com, Elmcraft.org, where it'll redirect to, but both domains are there.
[00:02:38]
Oh, wow.
[00:02:39]
Okay.
[00:02:40]
Yeah.
[00:02:41]
So yeah, that's a thing.
[00:02:42]
That's great.
[00:02:43]
That's a pretty cool post on the Elmcraft site, like a pretty interactive post, as I
[00:02:48]
recall.
[00:02:49]
That is true.
[00:02:50]
Oh yeah.
[00:02:51]
Jeroen released on Elmcraft as well.
[00:02:53]
Yes.
[00:02:54]
How could I forget?
[00:02:55]
Even I forgot about that.
[00:02:59]
Now relabeling this podcast, things we forgot we released in 2020.
[00:03:03]
Exactly.
[00:03:04]
We're not very good at self-promotion, are we?
[00:03:06]
Yeah, right.
[00:03:07]
It's been a very, very long 2020.
[00:03:12]
Something or other.
[00:03:13]
Maybe.
[00:03:14]
2020 and the 2020.2 release.
[00:03:19]
Yeah.
[00:03:20]
I wrote a blog post on Elmcraft about all the rules in ESLint, which is a lint of JavaScript,
[00:03:27]
which didn't make sense for Elm.
[00:03:30]
And basically that's like 90% of them don't make sense.
[00:03:34]
So 87% more.
[00:03:35]
87%?
[00:03:36]
Yeah.
[00:03:37]
So that's a big, big chunk of Elm.
[00:03:40]
Oh, actually.
[00:03:41]
You were right.
[00:03:44]
It's 87% of all the rules, but if you only narrow it to the recommended ESLint rules,
[00:03:49]
then it jumps up to 92%.
[00:03:51]
Not necessary in Elm.
[00:03:54]
So yeah, I thought that would be a good pitch for Elm.
[00:03:57]
I don't know if it worked, but it's a good statistic to add to Elm talks.
[00:04:04]
Yeah.
[00:04:05]
So I think the idea was for all that kind of stuff to pile up over time on Elmcraft,
[00:04:11]
like a lot of the conversations that we kind of end up having in Slack and Discord that
[00:04:15]
sometimes just seem really, really valuable.
[00:04:19]
It became a trope this year because Martin Janicek, I'm not sure if I pronounced his
[00:04:24]
surname right, but yeah, I pitched the idea of Elmcraft to him because I noticed he was
[00:04:28]
answering so many questions and then he just kept answering questions.
[00:04:32]
So I had to just keep DMing him being like, stop answering questions because we can't
[00:04:36]
write Elmcraft articles as quickly as you're creating new knowledge.
[00:04:40]
But yeah, he also has contributed a few things, so that's been cool.
[00:04:44]
So yeah, next year I think I've got to figure out how to make the visibility of some of
[00:04:48]
those kind of blog posts or knowledge things a bit more evident because right now they're
[00:04:51]
not listed in the index, but they are accumulating slowly.
[00:04:55]
So while we're talking about Elmcraft, how do people submit stories or articles or blog
[00:05:02]
posts to Elmcraft?
[00:05:03]
Yes, I suppose that's another thing that I forgot to announce is that Elmcraft is now
[00:05:08]
open source on GitHub.
[00:05:10]
It wasn't before when I released it, but now it is.
[00:05:12]
But yeah, I think there's a discuss page on Elmcraft that basically just says, just join
[00:05:18]
the Elmcraft discord and come have a chat about what your idea is.
[00:05:22]
But yeah, I suppose you could do the same on the Elmcraft GitHub now.
[00:05:26]
So yeah, I should probably definitely announce that.
[00:05:28]
I'm going to announce that at some point.
[00:05:30]
I think you just did.
[00:05:32]
I think it's an ad.
[00:05:34]
The more the merrier.
[00:05:35]
Yeah, temporarily forgot I'm on a podcast recording.
[00:05:38]
I still think you should announce it in a few places like discourse, Reddit, Twitter,
[00:05:47]
Aston.
[00:05:48]
Well, now I have to, right?
[00:05:49]
Now it's on the podcast.
[00:05:50]
The different discords.
[00:05:53]
Which ones did I miss?
[00:05:55]
So many places, lobsters, orange websites.
[00:06:00]
Maybe like Elm News Federation, another project idea for next year.
[00:06:06]
I have to admit, I have not seen these Martin Janicek articles being publicized on Elmcraft.
[00:06:13]
I was not aware of them and they sound intriguing.
[00:06:15]
I would really like to take a look.
[00:06:17]
So we will definitely share some links in the show notes.
[00:06:21]
Matt, what about you?
[00:06:22]
What did you release this year?
[00:06:24]
Yeah.
[00:06:25]
Oh man, two things, I guess.
[00:06:27]
So the first one was Elm CodeGen.
[00:06:32]
So the idea there was that could we have CodeGen without having like, you know, Elm doesn't
[00:06:39]
have macros, right?
[00:06:41]
And I don't think we want macros, but like we still would like to benefit from some code
[00:06:46]
generation.
[00:06:47]
And what does that look like if you don't have like language support?
[00:06:51]
So this is just a library and a little CLI tool to help you run stuff if you want, but
[00:06:56]
these can be used sort of separately.
[00:06:58]
And could you write a CodeGen library that was very intuitive and with, you know, that
[00:07:07]
that was able to be sort of abstracted over that would allow a whole other class of tools
[00:07:12]
for Elm that I sort of saw was kind of missing.
[00:07:15]
Or if they were implemented like CodeGen tools, it was sort of like everybody had their own
[00:07:19]
system and it was kind of harder.
[00:07:23]
That ultimately, like the reason why I did that project was motivated because I had another
[00:07:28]
project which is Elm GQL.
[00:07:30]
And what Elm GQL was is we definitely wanted, we at Vendor, which is we use at Vendor just
[00:07:38]
to pitch it a little bit, we have 600,000 lines of Elm code.
[00:07:43]
And so the entire front end is Elm and we use a lot of GraphQL.
[00:07:48]
And we were looking at tools to work with GraphQL.
[00:07:52]
And one of the biggest challenging things with writing a tool like that is the code
[00:07:56]
generation.
[00:07:58]
So if you try to do just some sort of string template thing, you'll quickly like kind of
[00:08:03]
run into some challenges.
[00:08:06]
Like I know Dillon is probably intimately familiar with all of these challenges because he also
[00:08:12]
has a GraphQL tool.
[00:08:14]
And so yeah, so I wanted the Elm GQL to be out there and to pitch Elm GQL a little bit.
[00:08:20]
It's a takes your GraphQL queries or mutations, parses them, checks them against your schema
[00:08:26]
and generates some nice concise Elm code for you to use them or compose them together or
[00:08:33]
whatever.
[00:08:34]
And so yeah, those were the two main projects that were actually released.
[00:08:40]
They are out there.
[00:08:41]
You can use them now.
[00:08:43]
Go check them out.
[00:08:44]
And the other thing which unifies the two kind of is I gave a talk at Strange Loop called
[00:08:50]
Code Gen with Types.
[00:08:52]
And it was not only about the Code Gen tool, but it was about also how, what other things
[00:08:56]
you could do with it.
[00:08:57]
Yeah.
[00:08:58]
That's my, that's my summary for the year.
[00:09:00]
Actually you're really good about it.
[00:09:02]
I'm really happy.
[00:09:03]
It's been a big year for you, Matt.
[00:09:05]
Yeah.
[00:09:06]
And I will also note I've been since, since we recorded our Elm Code Gen episode, I've
[00:09:11]
been using it quite a bit and it's been a joy.
[00:09:14]
And I'm currently generating quite a lot of Elm pages V3 code in the V3 beta using Elm
[00:09:22]
Code Gen.
[00:09:23]
And it's, it's awesome.
[00:09:24]
It's a, it's really better than Spring Template it in TypeScript was.
[00:09:30]
So thank you.
[00:09:31]
Well, thank you.
[00:09:32]
I'm, I'm, I'm glad there've been a number.
[00:09:34]
My hope with Elm Code Gen was that, you know, it's a tool for tool makers, right?
[00:09:39]
So the hope is that there would be sort of a, a small set of very useful tools that would
[00:09:44]
kind of leverage it.
[00:09:46]
So I could see Elm pages using that.
[00:09:47]
I could see something like Ryan Haskell-Glatz's Elmland potentially using it, obviously Elm
[00:09:53]
GQL.
[00:09:54]
And honestly, projects that I'm hoping to do this coming year.
[00:09:58]
And this is why I was like, okay, I'm going to take time to do this Code Gen thing is
[00:10:00]
because I'm like, there are a lot of things that I think I would like to generate specifically
[00:10:05]
regarding like Elm UI stuff, like layout, CSS, whatever that I think would be very powerful.
[00:10:12]
And it's cool to see people sort of pop up and write their own little tool in Elm Code
[00:10:16]
Gen and generally have a pretty good experience.
[00:10:19]
Code generation is hard as a concept.
[00:10:21]
Like it's like just going into arbitrary code generation is challenging.
[00:10:26]
So seeing people jump in and, oh yeah, I wrote this little tool to generate this thing and
[00:10:29]
it took me 20 minutes.
[00:10:30]
I'm like, oh my God, that's amazing.
[00:10:32]
Yeah, it really is.
[00:10:34]
Yeah.
[00:10:35]
Having the right like set of primitives for, for generating code makes a huge difference.
[00:10:39]
And it feels like so much more high level with Elm Code Gen.
[00:10:43]
Yeah, I've, yeah, I agree, but I can't like my opinion only kind of matters, right?
[00:10:48]
Yeah, I'm really excited to see it used in Elm Review rules as well.
[00:10:55]
Yeah.
[00:10:56]
I'm really curious to see how that looks.
[00:10:58]
That should be really cool.
[00:11:00]
Because you can do this review code, Jay, or is it, is there?
[00:11:04]
So in Elm Review, you can have rules report errors and those errors provide a fix.
[00:11:09]
And that fix is basically just a string, like insert a string, remove some texts.
[00:11:16]
And as long as you can transform some Elm code to a string, which you can do with Elm
[00:11:20]
Code Gen, right?
[00:11:21]
Okay.
[00:11:22]
Because it's just a library.
[00:11:23]
You can use Elm Code Gen in Elm Review.
[00:11:25]
Yeah.
[00:11:26]
Very cool.
[00:11:27]
That's, that's great.
[00:11:28]
And speaking of vendor, VENDR, the company, not the technique of vendoring packages, our
[00:11:37]
Elm at a billion dollar company, Elm Radio episode is like by far our most popular Elm
[00:11:43]
Radio episode we've done.
[00:11:45]
So thanks again to Aaron White for being an amazing guest and for VENDR for having like
[00:11:52]
an awesome story for, you know, social proof for using Elm in an awesome way and building
[00:12:00]
a successful company off of it.
[00:12:01]
It's been amazing.
[00:12:02]
It should be noted too, the Elm GQL library that I was able to write is like vendor inc
[00:12:08]
slash Elm GQL.
[00:12:09]
I did it basically entirely at VENDR and the Code Gen library as well, though it's under
[00:12:15]
my name.
[00:12:16]
So like the fact that they are, you know, pushing more resources to like give back to
[00:12:21]
the community and stuff is, is one of the reasons why I'm very excited about working
[00:12:25]
at VENDR just in general.
[00:12:27]
Right.
[00:12:28]
Yeah.
[00:12:29]
I think there's a lot of opportunity and I'm hoping that there'll be some more, some more
[00:12:32]
goodies in the future too.
[00:12:34]
So yeah, that's huge.
[00:12:36]
And so for people who want to know more about Elm GQL and Elm Code Gen, we also made a Elm
[00:12:41]
Radio podcasts episodes with you, Matt.
[00:12:44]
That's right.
[00:12:45]
I was there.
[00:12:46]
And they were all like, in the span of five episodes, we did three about things that were
[00:12:52]
done at VENDR, including the VENDR specific episode.
[00:12:57]
So I wouldn't say it's a busy year.
[00:13:00]
It was almost like a busy month for you.
[00:13:02]
Two months.
[00:13:05]
Yeah.
[00:13:07]
At least in terms of release cadences, because I'm guessing that the work has been lasting
[00:13:13]
longer than that.
[00:13:15]
Right.
[00:13:16]
Yeah.
[00:13:17]
There's still a lot of stuff that I want to get out.
[00:13:18]
There are a lot of projects that I'm trying to get into shape where I can ship them.
[00:13:22]
That's actually why Elm GQL and Elm Code Gen was, it was such a relief just because it's
[00:13:26]
like, there's a lot of other stuff that I'm very excited to work on, but I can't do until
[00:13:30]
those are shipped and using them.
[00:13:32]
And so I'm very relieved those projects are out and generally just work for people.
[00:13:38]
There's some improvements we want to bring.
[00:13:39]
I know Dillon and I spoke actually about some cool Code Gen stuff that he ran into to improve
[00:13:46]
the library.
[00:13:47]
And I'm excited to bring that out there, but it seems like these projects are out there.
[00:13:50]
People are using them and it's like, yeah, they work.
[00:13:53]
Yeah, they work.
[00:13:54]
Great.
[00:13:55]
And so I'm like, okay, cool.
[00:13:58]
They're in maintenance mode or at least like back burner a little bit where I can jump
[00:14:01]
in on a weekend and improve them, but I can put my main focus to the future.
[00:14:07]
Yeah.
[00:14:08]
It's such a weight off your shoulders when you get something out there and it's shipped.
[00:14:14]
You can always iterate, but it's shipped.
[00:14:16]
Yeah.
[00:14:17]
Jeroen, what have you shipped in 2022?
[00:14:20]
What have you been working on this year?
[00:14:22]
Something I started last year, at the end of last year, but I only got to, well, not
[00:14:27]
release because you will understand why it's not released.
[00:14:32]
I made a proposal called till recursion module cons for Elm Optimized Level 2.
[00:14:38]
So that is basically like a change in the Elm language or the compilation of the Elm
[00:14:44]
language where some functions that are not till recursive, meaning not very optimized,
[00:14:50]
which can crash the stack and are just slower, can become till optimized and much faster.
[00:14:58]
And that took a long time and I'm very excited because I think it works really well.
[00:15:04]
The reason why it's not released yet is because it's still in a pull request to Elm Optimized
[00:15:08]
Level 2.
[00:15:09]
So as soon as Matt, you will have some time.
[00:15:12]
I knew it.
[00:15:15]
I knew this was coming.
[00:15:18]
It's the whole point of this podcast really, just to have Jeroen to grant Matt on his time
[00:15:23]
allocation.
[00:15:24]
It's more of an intervention for my PR than a podcast really.
[00:15:29]
That's what I'm hearing.
[00:15:34]
Did you say PR?
[00:15:35]
Did you mean PRs plural?
[00:15:37]
Oh yeah.
[00:15:39]
No, sure.
[00:15:40]
Matt, this is actually not going live.
[00:15:44]
We are just faking a podcast.
[00:15:46]
It's not even recorded.
[00:15:47]
It's just, no, I get it.
[00:15:48]
Pressure you into-
[00:15:49]
Oddly enough, not the first time this has happened, but.
[00:15:55]
Yeah.
[00:15:57]
So it's not released, but it was a very fun exploration and I'm very happy with the results.
[00:16:02]
Other than that, plenty of new releases for Elm Review, improving performance, improving
[00:16:08]
things you can do with it, data that you can have and quality of life improvements.
[00:16:13]
I think you're also underselling the performance aspect of this.
[00:16:17]
You had a major speed up.
[00:16:19]
Yeah.
[00:16:20]
Yeah.
[00:16:21]
Yeah.
[00:16:22]
Especially for fixes.
[00:16:23]
Yeah.
[00:16:24]
So the main one that you're thinking of is making fixes a lot faster.
[00:16:28]
Some cases it's improved 13 times and I'm very happy because now at Vendor, where you
[00:16:36]
have a very large code base, you can finally start using it normally instead of your Zamboni
[00:16:42]
thing that ran every weekend or something.
[00:16:44]
Which probably requires some context with people.
[00:16:47]
So at Vendor, we have something called the Zamboni, which we love the Zamboni.
[00:16:52]
We don't need no Zamboni hate.
[00:16:54]
The Zamboni runs every weekend and opens a PR.
[00:16:58]
In case you don't know what a Zamboni is, it's the little machine that re-does the surface
[00:17:05]
of the ice for an ice rink.
[00:17:07]
I wouldn't call it a little machine, but-
[00:17:09]
It's a big machine.
[00:17:10]
Yeah.
[00:17:11]
A big machine.
[00:17:12]
It's a big machine when there are people out there or else you might run them over.
[00:17:17]
And mostly that was because we wanted rules that could be run that may take longer.
[00:17:23]
And yeah, it definitely cut down the time of the average run for that.
[00:17:27]
We haven't totally turned on Elm Review as far as something that would run in our build
[00:17:34]
process, like when we're editing stuff.
[00:17:37]
Build process meaning in dev, like when you're watching stuff.
[00:17:42]
But I know there are a few motivated individuals at Vendor who are kind of looking into that.
[00:17:48]
We did actually just write a new Elm Review rule that I need to actually review.
[00:17:52]
So that's exciting.
[00:17:54]
We did one for message naming conventions, just because as we grow, we realized that
[00:18:00]
we were getting more Elm developers and that we had written a document for a while ago,
[00:18:06]
and it's not a big document and it's fairly clear.
[00:18:09]
People who see it are like, oh yeah, that makes sense.
[00:18:11]
But you have no way to discover that.
[00:18:13]
So the Elm Review rule is honestly really good.
[00:18:18]
And Wolfgang put it together in like 15 minutes.
[00:18:21]
It was great.
[00:18:22]
Nice.
[00:18:23]
Another performance optimization that I'm working on right now is, so it's not released
[00:18:27]
yet, but I am working on it.
[00:18:29]
So it's still kind of as part of 2022 and maybe would be released soon, is adding caching
[00:18:36]
to Elm Review that would be persisted to the file system.
[00:18:41]
And so far it looks like on my work project, it speeds it up by two times.
[00:18:46]
So that's really nice.
[00:18:48]
What is it caching specifically?
[00:18:50]
Basically whenever you run Elm Review, it reports a lot of errors, right?
[00:18:54]
And those would be persisted to the file system.
[00:18:56]
So if you run it again and it noticed that a lot of these files haven't changed, then
[00:19:03]
it doesn't need to recompute a lot of things.
[00:19:05]
Got it.
[00:19:06]
That makes total sense.
[00:19:07]
Yeah.
[00:19:08]
And that was quite tricky.
[00:19:09]
So probably if I don't end up releasing it this year, it's because I'm running a very
[00:19:15]
large blog post explaining it.
[00:19:17]
Right.
[00:19:18]
Well, if you don't release it this year, we'll just hold another podcast intervention and
[00:19:21]
follow up.
[00:19:22]
Exactly.
[00:19:23]
Do you want to give the elevator pitch for extractors too?
[00:19:29]
I'm very excited about that feature.
[00:19:32]
Oh yeah.
[00:19:33]
So there's now Elm Review extract, which is a new sub command or flag for Elm Review,
[00:19:43]
where basically you can write rules which collect data about your project.
[00:19:49]
That's what they do.
[00:19:50]
And at the end, they report errors.
[00:19:52]
The additional thing that you can now do is to take all the data that you've collected
[00:19:56]
and transform into JSON that you can then pass to other projects, to scripts, or make
[00:20:04]
graphs or images or documentation from those.
[00:20:08]
So basically any data that you have in your Elm project, you can now collect and extract
[00:20:14]
and do whatever you want with it.
[00:20:16]
And I think that's very powerful.
[00:20:18]
I don't know what people will do with it yet, but-
[00:20:22]
I'm curious.
[00:20:23]
I mean-
[00:20:24]
Yeah.
[00:20:25]
I mean, I guess you could make a metrics dashboard for your code base, right?
[00:20:31]
Absolutely.
[00:20:32]
Yeah.
[00:20:33]
I'd be curious to see what you'd want to put in there.
[00:20:36]
But yeah, and it wouldn't be that involved to actually do.
[00:20:39]
Yeah.
[00:20:40]
You just have something, like have a CI deployment or whatever, where you calculate this stuff,
[00:20:45]
take out the JSON, put it to a little Elm app to display it.
[00:20:49]
Yeah.
[00:20:50]
A few things that you can already do with it is like compute the import module graph,
[00:20:57]
find a list of licenses that you have in your dependencies, small things like that.
[00:21:03]
Other things that I can imagine is people can write a rule that extracts the list of
[00:21:09]
use CSS classes, and then they give it to a CSS pruner or something, things that remove
[00:21:16]
all the unused CSS classes, things like that.
[00:21:19]
It's a very generic feature.
[00:21:23]
So how powerful it is, is related to what people do with it.
[00:21:28]
Yeah.
[00:21:29]
So many possibilities.
[00:21:30]
Somebody was asking something about optimizations for an Elm pages site, about pulling in translations
[00:21:38]
for a given page.
[00:21:40]
And I was thinking, like, wouldn't it be cool?
[00:21:42]
You've got this kind of JSON file of all these translations, and you have specific ones that
[00:21:50]
you need for specific pages.
[00:21:52]
And wouldn't it be cool if you just had a big data source in Elm pages of all the translations,
[00:21:57]
but then if you had an Elm review extractor that looked at which keys are used for a given
[00:22:04]
route and then massaged that data source to contain the subset.
[00:22:09]
So basically, as a developer, you're not paying the cost of micromanaging which translation
[00:22:15]
keys you're pulling in, doing some builder pattern to pull in only the translations you
[00:22:19]
need, but then you can, under the hood, optimize it in your build step using this fancy rule.
[00:22:25]
So there's just so many things I could imagine people building with it.
[00:22:29]
It'll be really cool to see what people do with it.
[00:22:31]
Yeah.
[00:22:32]
If you want to start translating your application as well, you can just look at all the strings
[00:22:37]
that are passed to HTML.txt, for instance, and then extract them and provide them to
[00:22:44]
your translators.
[00:22:45]
And they can now translate all those keys.
[00:22:48]
Hmm.
[00:22:49]
Brilliant.
[00:22:50]
What about you, Dillon?
[00:22:51]
What have you released this year?
[00:22:53]
So I was gonna say before Jeroen says anything, because yes, it has been a year for me of
[00:23:00]
a mega whale, not yet released stable Elm pages v3.
[00:23:06]
I was not going to say anything.
[00:23:09]
You were thinking.
[00:23:10]
But I'm glad he has a PR open.
[00:23:13]
I bet.
[00:23:14]
Or two.
[00:23:15]
So, yes, I do have a mega release.
[00:23:25]
It has been a real joy and privilege to get to really dedicate most of the year to building
[00:23:36]
this and no holds barred building exactly what I want in this.
[00:23:43]
So I will say I did release the beta.
[00:23:46]
That's out there.
[00:23:47]
And people can install and use it.
[00:23:48]
And they are.
[00:23:49]
So I did release that.
[00:23:50]
That's a release.
[00:23:51]
That's a release.
[00:23:52]
It's a beta release.
[00:23:53]
It's a pre-release.
[00:23:56]
And so, yeah, that's been amazing.
[00:23:59]
Mario, I had this on my radar of wouldn't it be cool if instead of this sort of optimized
[00:24:06]
decoder functionality that Elm pages v2 had, which was like one of the most complicated
[00:24:12]
features I've ever built that I was super proud of.
[00:24:15]
And then Mario's like, you know, it's pretty easy to just use Lambda to get the automatic
[00:24:20]
serialization from the compiler.
[00:24:22]
I'm like, really?
[00:24:23]
It's like, yeah, you just like call these secret functions and it automatically serializes
[00:24:27]
all your types.
[00:24:29]
And so, yeah, there goes all my like most brilliant things I've ever built out the window.
[00:24:35]
And now it's like a much better user experience, much more optimized byte data that's sent
[00:24:41]
over the wire.
[00:24:42]
So that's been amazing.
[00:24:44]
Stripping out all my meticulously crafted features and replacing it with just Lambda
[00:24:52]
serialization.
[00:24:53]
So that's been amazing.
[00:24:55]
I built a feature that I'm super excited about Elm pages script, which I think is so Matt
[00:25:02]
was talking about this Elm code.
[00:25:05]
What's the command in the CLI Elm code gen generate Elm code gen gen or run.
[00:25:09]
Okay, cool.
[00:25:10]
I'm coaching run.
[00:25:12]
So Elm pages run is actually something we talked about on the Elm code gen episode with
[00:25:18]
you.
[00:25:19]
I was saying, I want to build Elm pages code gen where you can basically run like so Elm
[00:25:26]
code gen run lets you run an Elm file where you can execute this Elm file.
[00:25:32]
It runs Elm code gen and generate some files for you, which is great.
[00:25:36]
But then maybe you need to pull in an environment variable.
[00:25:40]
Maybe you need to read some files and pass them in and Elm code gen run.
[00:25:46]
You can do that technically, but you have to maybe like strew together a few piped commands
[00:25:52]
on the CLI to pass in that data as a flag.
[00:25:56]
Right.
[00:25:57]
So that's basically how Elm code gen run, it's basically just a little TypeScript little
[00:26:02]
file that just sort of has a standard, you know, shape of an Elm app that it's expecting
[00:26:09]
and and it hands it some flags, some initial data.
[00:26:13]
And then it's expecting this Elm program to give sort of a list of files to generate.
[00:26:19]
And there's a little bit of like logic as to where it would actually write those.
[00:26:23]
But essentially all it can do is write files.
[00:26:25]
Right.
[00:26:26]
And yeah, so you it's very bare bones as far as supporting arbitrary CLI stuff.
[00:26:34]
So writing something more to basically gather more data or maybe, you know, like for an
[00:26:38]
example, Elm GQL does not use Elm code gen run.
[00:26:41]
It has its own sort of custom made TypeScript harness that's made for Elm, the Elm GQL thing
[00:26:47]
itself that does handle stuff a little differently.
[00:26:51]
Right, exactly.
[00:26:52]
So I think it's natural like Elm code gen, it's like if you try to build everything under
[00:27:00]
the sun, what if you want to pull an HTTP data?
[00:27:02]
What if you want to read environment variables?
[00:27:04]
What if instead of writing files, you want to make an HTTP request to post something
[00:27:10]
to an API or print it in the console or like it's a slippery slope and eventually you've
[00:27:16]
built like a general purpose scripting.
[00:27:18]
Yeah, right, right.
[00:27:19]
Exactly.
[00:27:20]
So basically like the Elm pages engine is a sort of general purpose way to bind to Node.js.
[00:27:30]
So already with Elm pages data sources, you can read files, you can write files, you can
[00:27:34]
read JSON files, you can read, you know, mark markdown content, you can do all these different
[00:27:39]
things.
[00:27:40]
But you can also create custom Node.js bindings with data source.port.
[00:27:45]
So you can write files and you can build arbitrary bindings where you write a JSON encoder to
[00:27:50]
send data into an async Node.js function.
[00:27:54]
And then you return JSON in that async function and you write an Elm decoder to decode that
[00:27:59]
response.
[00:28:00]
So Elm pages script, you do the Elm pages run command and it will run a module in your
[00:28:08]
script folder and execute that.
[00:28:11]
And you can use that to scaffold things.
[00:28:14]
So if you wanted to use Elm pages to scaffold a new route module for an Elm pages app, you
[00:28:20]
can do that using Elm CodeGen.
[00:28:22]
But you can also, like the sky's the limit because it's just an arbitrary scripting tool.
[00:28:27]
So you can do, so all you do is you write a module that exposes a top level value called
[00:28:34]
run and it's basically just a data source.
[00:28:37]
So if you, so you can do like data source.http to get HTTP data.
[00:28:43]
If that HTTP data fails, then your script just fails, which is fine.
[00:28:48]
Like your script just stops and says, oops, I couldn't hit that HTTP endpoint.
[00:28:52]
So I'm super excited about this.
[00:28:54]
You can pull in environment variables, you can do all these things and you can use it
[00:28:57]
with Elm CodeGen.
[00:28:58]
So I kind of like, I built this thing that I kind of somewhat jokingly talked about in
[00:29:03]
our Elm CodeGen episode of Elm pages CodeGen.
[00:29:07]
Now we just need to get Elm review in there so we can do that extractors in a context
[00:29:12]
where we have data sources.
[00:29:13]
So yeah, I'm very excited about that.
[00:29:16]
Excited to see what people do with it.
[00:29:18]
Another thing that I shipped this year that I'm really excited about was OpenAI Whisper
[00:29:24]
is this voice transcription service that works very well for Elm Radio.
[00:29:29]
I tried several paid and free transcription services and they were pretty bad.
[00:29:34]
Half a year ago, a year ago, even the paid ones, there were some things I'm like, I definitely
[00:29:38]
don't want to put that up in a public place because that's a very embarrassing typo in
[00:29:43]
the transcript.
[00:29:45]
And then I tried OpenAI Whisper, this recently released like MIT licensed transcription project.
[00:29:52]
And it's amazing.
[00:29:53]
The quality is so good.
[00:29:54]
So now Elm Radio, the ElmRadio.com website has transcripts powered by OpenAI Whisper.
[00:30:02]
They're great.
[00:30:03]
And you can, there's an audio player in there.
[00:30:05]
You can click to a timestamp.
[00:30:07]
You can share that timestamp.
[00:30:09]
So pretty excited about that.
[00:30:11]
That's really cool.
[00:30:12]
I've been curious about the transcription stuff.
[00:30:15]
Does Whisper do, does it track or is it able to distinguish like who's talking?
[00:30:22]
Not right now.
[00:30:23]
There are some, there are some experiments that try to build in that functionality.
[00:30:29]
So I think we could see, I mean, the fact that it's open source, I think we could see
[00:30:33]
some cool things emerging in the future for that.
[00:30:35]
But right now there's no stable way to do that.
[00:30:38]
I mean, this is evolving, just wait two weeks and it's there.
[00:30:43]
Yeah, yeah, yeah, sure.
[00:30:44]
Yeah, I think so.
[00:30:45]
It's like for me, once that hits, I have an app idea that I don't want to talk about right
[00:30:50]
now.
[00:30:51]
Ooh, intriguing.
[00:30:52]
We'll save that for 2023.
[00:30:53]
Yeah, yeah, we will.
[00:30:54]
It'll be good.
[00:30:55]
Yeah.
[00:30:56]
See, it's so good.
[00:30:58]
And it, little details in your transcripts that a human would catch, but most transcription
[00:31:04]
services won't, it nails.
[00:31:06]
For example, if you have a false start in a sentence, it removes the false start and
[00:31:13]
removes duplicate words and things like that and just figures it out.
[00:31:17]
It's pretty brilliant.
[00:31:18]
So interesting.
[00:31:19]
That's been, that's been a lot of fun to build.
[00:31:22]
Yeah.
[00:31:23]
I'll have to play with that.
[00:31:24]
That's great.
[00:31:25]
Yeah.
[00:31:26]
All right.
[00:31:27]
Well, did anybody have any, any trends that they noticed happening in Elm in 2022?
[00:31:33]
Any, any cool projects that they saw other people shipping?
[00:31:36]
Any trends in the way people are building things in 2022 in Elm?
[00:31:40]
I think if we, if we took a sample size of the Elm developers on this call, I'd say a
[00:31:45]
hundred percent of Elm developers are making Elm tooling.
[00:31:49]
That seems to be, I mean, if that's not the trend, then I'm not sure what is.
[00:31:54]
Right.
[00:31:55]
But yeah, no, I, I, I'm pretty, I'm pretty bullish on, on Elm tools, expanding the Elm
[00:32:03]
language surface area, which I think is what has kind of been happening.
[00:32:07]
And I'm not, I'm not sure it's like, I mean, I think it's, it feels to me like it's becoming
[00:32:13]
increasingly obvious that that is a really cool way to go and we can get so much out
[00:32:19]
of the Elm language.
[00:32:20]
I wonder if maybe it wasn't so obvious originally as a community, maybe we kind of thought originally
[00:32:27]
like, oh, it will, you know, Elm will evolve in really awesome ways once Evan does XYZ.
[00:32:35]
And I'm not sure I, I don't feel that as much anymore.
[00:32:38]
Like I think this year I've seen so many people kind of run with awesome tools that don't
[00:32:43]
conflict with the Elm language, but to kind of empower it.
[00:32:46]
I'm like, those really, really lovely primitives.
[00:32:48]
I feel like it's been a year of discovering the joy of Elm's primitives in, in, in other
[00:32:54]
contexts, at least for me.
[00:32:56]
Yeah, totally.
[00:32:57]
I mean, a decent number of my tools, or at least two of them that I can think of have
[00:33:01]
that sort of could have been a, I'm irritated that Elm doesn't have this conversation, but
[00:33:08]
turned into a like, oh, I made this project.
[00:33:10]
It just works.
[00:33:11]
You can have this benefit.
[00:33:12]
So the two, two tools that talking about is Elm Optimize Level 2, which was actually,
[00:33:16]
I believe last year.
[00:33:18]
So that will optimize Elm generated JS a bit further and actually get some surprising results.
[00:33:25]
This is the project that Yerun has something like 48 open PRs for.
[00:33:31]
And then there's the second one, which is Elm Code Gen.
[00:33:33]
Again, you'd be like, Elm doesn't have macros.
[00:33:35]
Elm doesn't have a thing.
[00:33:36]
It's like, oh, we could just have a library and like a little bit of node JS and like,
[00:33:41]
oh, we have a thing.
[00:33:43]
Actually turns out to be pretty nice.
[00:33:44]
Okay, cool.
[00:33:45]
We don't need a language change.
[00:33:47]
In fact, we might even, well, you never say never, like, you know, who knows, but, but
[00:33:52]
it's not obvious that having something like Code Gen built into the language would be
[00:33:56]
the way to go.
[00:33:57]
Yeah.
[00:33:58]
But yeah.
[00:33:59]
I've felt that way about this Elm pages script thing too.
[00:34:03]
I mean, to me, that's just a more clear illustration of this more general thing, which is like
[00:34:08]
Elm is a really good target for frameworks because you can define these effects as data
[00:34:16]
and then execute them however you want and swap out optimizations under the hood.
[00:34:21]
So it's very good for, for building frameworks and, and like, you don't need to wait for
[00:34:28]
Elm to have some binding to node JS because well, like if, if you have effects as data,
[00:34:36]
then you say, here's this, here's this type that represents an effect to do in node JS.
[00:34:43]
And that's it.
[00:34:44]
You don't need Elm to build it.
[00:34:45]
You just need to build some glue that does some code generation and has a framework to
[00:34:49]
abstract that away from the user.
[00:34:51]
But Elm is a language is completely capable of that.
[00:34:55]
Just like JavaScript as a language is capable of interfacing with C++ bindings through node
[00:35:03]
JS.
[00:35:04]
You don't need the JavaScript language.
[00:35:07]
You don't need V8 to have bindings to executing C++ code.
[00:35:12]
You just need a JavaScript language that has a way to, you know, run promises and, uh,
[00:35:18]
and hook into that.
[00:35:19]
So yeah, Elm, I like Mario's phrase that he's used in the past of Elm in unusual places.
[00:35:25]
And I'm, I'm also very bullish on this.
[00:35:26]
I think it's, I think we're, we're really seeing that come to fruition and I think there's
[00:35:31]
going to be more of it.
[00:35:32]
I think that for a long time, Elm developers were a bit scared of what would change in
[00:35:37]
Elm 0.20.
[00:35:39]
And as you said, Mark, Emmet, that we're waiting for Evan to do something.
[00:35:45]
And now we're all realizing, well, actually we, we are seeing a lot of tools being released
[00:35:49]
and they're very cool and they're very powerful.
[00:35:52]
And we are actually have the freedom to do so.
[00:35:55]
And we have the needs and we have, we have all those benefits from Elm, which allows
[00:36:01]
us to make great tools.
[00:36:03]
So let's do it.
[00:36:04]
And yeah, that's what I'm noticing is that we are making more and more of these tools
[00:36:09]
and the quality is amazing.
[00:36:13]
Every time almost.
[00:36:14]
One of them that I'm thinking of is Elm CodeGen, obviously, but also Elm Watch from Simon Leider.
[00:36:21]
Yes, totally.
[00:36:22]
That one is amazing.
[00:36:23]
Really fast.
[00:36:24]
And just because it's using Elm's primitives under the, or it's making use of all the promises
[00:36:31]
that Elm makes and to make it really fast.
[00:36:34]
Yeah.
[00:36:35]
This is something that I want to see more and more of.
[00:36:37]
I think we will.
[00:36:38]
Another trend that I saw happening in 2022 is that I feel like we're seeing more and
[00:36:44]
more tools to make applications.
[00:36:47]
Like we've had Elm SPA, we have Elm Pages, Elm Static, and Elm Lend is also new, which
[00:36:56]
hasn't been released.
[00:36:59]
It's still a beta, I think, at the moment.
[00:37:02]
And I feel like we're seeing more and more of these and it's starting to be like, huh,
[00:37:07]
we need to make choices when we start an Elm application right now.
[00:37:11]
And that worries me a little bit, but a little bit of computation is also quite nice and
[00:37:18]
useful.
[00:37:19]
Yeah.
[00:37:20]
And LambdaRay, of course.
[00:37:21]
And LambdaRay, obviously.
[00:37:22]
LambdaRay is underlying, right?
[00:37:23]
I'm not going to, I'm going to make this problem worse by releasing LambdaRay Elm Pages and
[00:37:29]
LambdaRay Elm SPA or LambdaRay Elm Land.
[00:37:33]
Yeah.
[00:37:34]
But it's like a nice type safe battle royale, you know?
[00:37:40]
Like whichever one wins is going to be lovely.
[00:37:43]
So yeah.
[00:37:47]
And similarly, I feel like we're seeing more and more UI frameworks as well.
[00:37:51]
We've got ElmUI, ElmCSS, ElmTailwind, ElmHTML, all those variants with context.
[00:37:58]
We've got accessibility packages and more, George Boris also came on the show to talk
[00:38:04]
about one of those, I think.
[00:38:06]
Elmbook.
[00:38:07]
Elmbook.
[00:38:08]
And he also released recently, but not, he didn't come on the show for this, ElmWidgets.
[00:38:17]
So there's a lot of these UI frameworks and components collections, which is both nice
[00:38:25]
and also like, again, like there's a little bit too much choice in my opinion, but that
[00:38:31]
can be very useful for adoption at least, I think.
[00:38:34]
And to get quick, quick started on a project.
[00:38:37]
Yeah.
[00:38:38]
And that leads into, I'm not sure if we want to transition to the future, but definitely
[00:38:42]
leans into one of the projects I'm excited about.
[00:38:44]
Go for it.
[00:38:45]
Yeah.
[00:38:46]
So one of the motivations for Elm CodeGen just in general was, had to do, so there's
[00:38:53]
the Elm UI library, which you may or may not be familiar with, but essentially is a way
[00:38:57]
to kind of write your layout and it turns into CSS, but I wanted a language or a library
[00:39:04]
where the layout itself was tighter than CSS, where there were fewer basically situations
[00:39:12]
where you just had no idea what was going on.
[00:39:15]
I wanted to make it as type safe as possible, essentially.
[00:39:18]
Like another way to think about this is if you could look at the code and know what it
[00:39:22]
looked like, know what your layout was.
[00:39:25]
For me, that's just insanely valuable.
[00:39:26]
If you're able to read the code and just in your mind, you're able to compose what is
[00:39:30]
actually visible.
[00:39:31]
That's just incredibly valuable as far as speed of development.
[00:39:36]
And I think that resonated with the community for sure, but it's missing a piece because
[00:39:42]
I was like, okay, why don't people use Elm UI or why wouldn't they?
[00:39:47]
I think there's a very valid argument of they want a design system and there's no design
[00:39:55]
system built into Elm UI.
[00:39:57]
Elm UI is sort of a replacement almost for CSS, right?
[00:40:00]
Where it's like you can think of style this way, but there's no design system on top of
[00:40:05]
it.
[00:40:06]
There's no set of presets.
[00:40:07]
And I've thought a lot and had a lot of experience at vendor building as we've gone through different
[00:40:12]
versions of design systems at vendor and what is a good design system look like with a system
[00:40:18]
that is roughly the shape of Elm UI.
[00:40:21]
It doesn't have to be Elm UI, but if it makes some fundamental choices that are similar.
[00:40:27]
And I was thinking like, okay, well I want a language for design, your design system,
[00:40:33]
like a higher level language.
[00:40:34]
And I think the challenge initially is that implementing that language in Elm code, like
[00:40:41]
that you're writing by hand is challenging for a number of reasons because you have to
[00:40:45]
basically, you have to be disciplined about what you're writing.
[00:40:48]
Where it's like, okay, here's my, you gather a set of values that work well together, but
[00:40:53]
you have to make all these like little tiny decisions that are kind of dumb.
[00:40:55]
It's kind of like, where do I put my colors?
[00:40:59]
Like how do I even organize my UI code?
[00:41:02]
I would like some widgets.
[00:41:04]
And even when I'm like looking at this design system, I would like to even be able to like
[00:41:08]
have a few widgets already made for me.
[00:41:11]
Nobody is going to create a button or module.
[00:41:14]
Everyone's going to create like probably a number of very common UI elements.
[00:41:19]
So I made Elm Code Gen with the idea, and this is basically still being formed, but
[00:41:26]
I think the project is one that I want to get out because I want to use it this year
[00:41:31]
is that you'd be able to sort of define what your design, like high level primitives for
[00:41:36]
your design.
[00:41:37]
And it would generate sort of a bunch of Elm Code, including possibly a handful of kind
[00:41:41]
of widgets that everybody's going to use.
[00:41:44]
And it would just be in like a really nice shape already and kind of ready to use.
[00:41:48]
And because the experience I want, I think about who the ideal customer for Elm is as
[00:41:54]
a language.
[00:41:55]
And one thing that I think about is somebody who doesn't want to deal with kind of the
[00:42:00]
mess of JavaScript and like the always iterating, you know, massive cognitive overhead of the
[00:42:07]
ecosystem of JavaScript.
[00:42:08]
They want something simple and they want to get something working very quickly.
[00:42:12]
I think there's a big challenge there.
[00:42:14]
If they don't have a widget library, they can boot up very quickly.
[00:42:18]
It's actually very hard.
[00:42:19]
It's actually like almost like a stopper where it's like someone's going to choose React
[00:42:23]
because guess what?
[00:42:24]
You can just pull down a design system easily.
[00:42:28]
And even though you may conceptually really love the idea of purity and everything, like
[00:42:33]
you really, your main focus may be on a backend implementation of something and you just need
[00:42:38]
a UI for it.
[00:42:39]
Anyway, so that's what I want to build.
[00:42:41]
I've been thinking about it for a long time.
[00:42:43]
I think I know what it looks like.
[00:42:44]
Yeah, it's very exciting.
[00:42:47]
And there are precedents out there for kind of design system palettes like Tailwind being
[00:42:52]
the obvious one.
[00:42:54]
That's not that complicated.
[00:42:56]
It's like, what colors do you have to work with?
[00:42:59]
What spacing units do you have to work with and generate some permutations of things?
[00:43:04]
Right.
[00:43:05]
I think the actual complexity of the project won't be, I think it'll be in the design decisions.
[00:43:10]
So like, but not in the actual implementation.
[00:43:13]
I think there are things to know about for each of those concepts that if you're aware
[00:43:18]
of them, it makes things a lot easier.
[00:43:19]
If you're not, then you're not.
[00:43:20]
So an example being you're choosing a color palette and this is if you're not getting
[00:43:24]
it from a designer who would have, hopefully, they would just know that have this on lockdown.
[00:43:31]
But if you're designing a color palette yourself, if you don't know about color spaces that
[00:43:36]
make it much easier to develop a palette, so this would be something based on what's
[00:43:40]
called Lab, L-A-B, then you're going to have a much harder time with colors.
[00:43:46]
If you don't know about it, well, if you do know about it, you'd probably start to use
[00:43:52]
it, but even then it can be a little confusing.
[00:43:54]
So an example of what Lab does that just so I'm not like throwing out terms and people
[00:43:59]
are like, what the heck?
[00:44:00]
You may be familiar with defining a color where it says like HSL, which is like hue,
[00:44:05]
saturation, and lightness, right?
[00:44:07]
The lightness parameter is actually, it's a lie.
[00:44:11]
It's not lightness.
[00:44:13]
Two colors that have the same lightness will be vastly different perceptual brightnesses.
[00:44:20]
And what this means is that when you're developing a color palette, it means that the color space,
[00:44:25]
the numbers you're using to define your colors, things that are numerically near each other
[00:44:30]
are not perceptually near each other.
[00:44:32]
And that means it's very frustrating to actually come to a higher level abstraction for anything.
[00:44:36]
I think there, so it's like, okay, well, that's really interesting.
[00:44:39]
Like one color space, again, that ultimately, because this is all mathematics, turns into
[00:44:44]
something called Lab is called HSL UV.
[00:44:48]
And that's where they basically adjust these things so that they are sort of numerical.
[00:44:53]
Numerical closeness means perceptual closeness.
[00:44:55]
But anyway, having insights like that, which are awesome.
[00:44:59]
I think there are also insights around typography, around spacing, around visual weight of things,
[00:45:05]
gradients, being able to construct nice gradients is a subtle thing that you could go spend
[00:45:11]
a few weeks learning, maybe not a few weeks, but definitely like surprisingly more involved
[00:45:16]
than it is immediately obvious.
[00:45:19]
So like gathering all that design knowledge into one code base that kind of knows what
[00:45:23]
the mental model should be, I think will be super valuable.
[00:45:26]
That's amazing.
[00:45:27]
I just want to say like, this is like one of my favorite things about Elm and the Elm
[00:45:34]
community and the Elm ecosystem, I think is this like, not settling for the status quo
[00:45:41]
and saying like, yeah, there are palettes out there for creating a design system and
[00:45:46]
laying out these colors.
[00:45:47]
It's like, well, what if we think this through from first principles?
[00:45:51]
Where would we arrive?
[00:45:52]
And I think like, I think Evan has really modeled and embodied that and that has shaped
[00:45:58]
the Elm community and attracted a lot of people to the Elm community who care about that.
[00:46:03]
I think Elm's data types and purity have created tools to help people do that and made that
[00:46:11]
the path of least resistance to make impossible states impossible and make you really think
[00:46:15]
through the options.
[00:46:17]
And like Matt, I know you've personally inspired me the way you take that approach.
[00:46:22]
And I like, that's what I love about Elm and the Elm community is that we take these principles
[00:46:29]
and we say, yeah, we're not going to settle for like, people have figured out a pretty
[00:46:33]
okay way to do this.
[00:46:34]
We're like, let's think this through from the ground up from first principles and find
[00:46:37]
a really great way to approach this.
[00:46:39]
So very exciting stuff.
[00:46:41]
Shall we go around the room and talk about plans?
[00:46:43]
Is that exciting?
[00:46:44]
Is that a thing?
[00:46:45]
Absolutely.
[00:46:46]
Absolutely.
[00:46:47]
Okay.
[00:46:48]
Who's got plans?
[00:46:49]
Any, anything you say here, you are going to be held to legally.
[00:46:55]
There may be interventions.
[00:46:56]
There may be interventions.
[00:46:59]
Legally and also like socially slash emotionally.
[00:47:02]
Basically all of them.
[00:47:04]
Any PRs that are mentioned here must be reviewed.
[00:47:08]
Or they will be closed.
[00:47:09]
Tell recursion monitor to close.
[00:47:10]
I was going to say any PR that's mentioned here, I'm just going to go close.
[00:47:13]
It's been reviewed.
[00:47:17]
Well, I don't make any PRs for Lambda because it's all closed.
[00:47:24]
So yeah, I guess I'll dive in.
[00:47:28]
I am excited for my year long hustling towards a Lambda version 1.1.
[00:47:36]
Funnily enough that the feature I'm most excited about isn't actually one that I primarily
[00:47:40]
worked on anyway.
[00:47:41]
So that's also kind of cool.
[00:47:44]
So what I've been mostly working on is evergreen migration auto generation.
[00:47:50]
So for those that don't know in Lambda the migrations and deployments are type safe,
[00:47:57]
or at least my goal is for them to be 100% type safe.
[00:47:59]
So if it compiles locally, you know it's going to deploy and you know it's going to migrate
[00:48:04]
and everything's going to be lovely.
[00:48:06]
And so one of the problems of that introduced is Elm.
[00:48:09]
So what Elm does have is it has equality between records that are equally defined, right?
[00:48:16]
So if you have a record that has first name and last name as strings, and then somewhere
[00:48:21]
else in your project, you've defined identically the same record, and then you compare those
[00:48:25]
somewhere, they will be equal.
[00:48:27]
So there's kind of like the underlying reason for that is that there are really no records,
[00:48:32]
all records are anonymous and you only have kind of type aliases for records.
[00:48:36]
Whereas for custom types, that's not true.
[00:48:39]
So a custom type is not an alias, a custom type is kind of like a concrete primitive,
[00:48:43]
if you will.
[00:48:44]
So if you create a custom type that has, you know, a custom type of ice cream flavors that
[00:48:49]
has chocolate, vanilla and strawberry, and then in another file somewhere else, you create
[00:48:54]
exactly the same type with the same name and the same variance, creating two values of
[00:48:58]
those two different types and then comparing them, they won't, well, it'll be a type error,
[00:49:02]
you can't even compare them.
[00:49:05]
So the annoying thing about trying to apply the evergreen kind of philosophy to your apps
[00:49:10]
is that basically between two different versions of your apps, we do snapshots to keep hold
[00:49:17]
of what all your types were so that Lambdaera can know, well, you know, you've changed these
[00:49:22]
types and this is exactly what's changing.
[00:49:24]
And the frustrating thing has been that users kind of have to write out, even if you haven't
[00:49:29]
changed a custom type, technically, according to Elm, it's changed, right?
[00:49:32]
So you have to write this really big migration function to go, okay, every single old variant
[00:49:37]
maps to every single new variant of this thing that, you know, hasn't changed.
[00:49:41]
And it's a bit annoying.
[00:49:42]
So yeah, it's one of those things where I'm like, I feel slightly annoyed because it's
[00:49:46]
like, it's not a feature that's delightful in the sense of like, hey, look at this new
[00:49:51]
thing you've got.
[00:49:52]
And it's more like a, hey, look at this thing I fixed that was annoying and imposed by me.
[00:49:58]
So it has been not a huge amount of joy in that because I'm like, oh, it was kind of
[00:50:03]
just bad to start off with.
[00:50:04]
And I've had to figure out a way to patch it.
[00:50:07]
So it'll save people a lot of time.
[00:50:09]
I think 99% of migrations will now get written for you.
[00:50:11]
So I'm really excited about that.
[00:50:12]
But most people would just probably, I'm assuming just be like, oh, great.
[00:50:15]
Now I don't have to do that annoying thing that you made me do.
[00:50:18]
And it's how it maybe should have been always.
[00:50:21]
But the second part of it, and there's a whole slew of features in there, but the one I'm
[00:50:25]
super, super excited about, and I think even non-Lambdera enthusiasts will be excited about
[00:50:30]
this is Martin Stewart came up with an implementation of an idea that I'd kind of thought and toyed
[00:50:36]
with, but he really kind of nailed it down.
[00:50:38]
So basically in the next version of Lambdera, what you'll be able to do is you boot up Lambdera
[00:50:42]
Live, you browse around anywhere in your project, you want to edit a particular piece of the
[00:50:47]
UI, you've navigated somewhere deep or you've navigated into some complex state and you'll
[00:50:51]
notice a borders off where there's something's wrong and you want to go there.
[00:50:54]
And I think now the experience, at least for me, is I kind of jump into my editor and if
[00:50:59]
I'm lucky, I'll kind of guess the name of the identifier that I'm kind of globally searching
[00:51:04]
for and maybe I'll find it.
[00:51:05]
Or maybe on the page, there's a bit of text and you're like, oh, that looks like a bit
[00:51:09]
of unique text.
[00:51:10]
Maybe I'll just copy that text and search for that and maybe I'll find the element.
[00:51:13]
But a lot of the time, especially as a project I've not worked on for ages, you just, you
[00:51:17]
can't remember where stuff is, right?
[00:51:19]
And everything's slightly, it's just a little bit of friction.
[00:51:21]
And so now instead of doing the thing that you were thinking like, oh, I need to do that,
[00:51:25]
you've had to switch modes, switch gears entirely to where's the thing.
[00:51:29]
And then when you find the thing, you're like, what was I doing again?
[00:51:31]
And it's just a bit of mental kind of impediment.
[00:51:36]
So yeah, now with the feature that Martin's worked on and we've kind of worked together
[00:51:39]
to integrate into the compiler, you can hover over any UI element, hit a hotkey, it'll give
[00:51:45]
you a dropdown of the kind of tree of functions that were involved in generating that particular
[00:51:52]
piece of UI.
[00:51:53]
And if you click on any of them, it'll try and find your current editor and open up like
[00:51:59]
directly that line and like the column and the row of the exact expression that is generating
[00:52:05]
that UI element.
[00:52:06]
So it's kind of, I'm calling it UI source maps or like live UI source maps.
[00:52:10]
So I'm, yeah, I'm phenomenally excited about this.
[00:52:14]
And yeah, the moment that I started using it, I was like, how have I not had this?
[00:52:18]
Like now I can't not have it.
[00:52:20]
And the exciting thing for other Elm users will be because one of my goals of the Lambdaera
[00:52:25]
compiler is for it to be backwards compatible.
[00:52:27]
You should be able to, well, we have to figure this out how that'll integrate into other
[00:52:32]
pipelines, but there should be a pathway for using this feature on just a regular Elm project,
[00:52:39]
which I think would be really, really cool.
[00:52:40]
But I think that as a whole release thing, I'm excited about that, but I think that segue
[00:52:45]
is I'm going to just throw the baton over to Matt for the other project that we've been
[00:52:49]
kind of on and off collaborating for this whole year, because yeah, this feature, I
[00:52:54]
want to end up in that tool as well.
[00:52:56]
Yeah, a thousand percent.
[00:52:57]
So this is something I initially sort of announced at Strangeloop for my talk, Code Gen with
[00:53:03]
Types.
[00:53:04]
And you'll see a little demo at the end of something that's possible.
[00:53:07]
If you go look for that talk and watch it, it's at the end, so you'll have to stay till
[00:53:13]
the end.
[00:53:14]
So this project is called ElmDev.
[00:53:16]
There's a placeholder website at elm.dev.
[00:53:19]
I actually got that domain, which I'm so happy about.
[00:53:22]
What ElmDev is, is again, talking about how Dillon was like, well, in Elm, we sort of try
[00:53:30]
to rethink things maybe from principles, first principles.
[00:53:32]
Not that that's always the way, but like, it can be very nice.
[00:53:36]
So ElmDev is basically support for editor tooling based on a version of the Elm compiler.
[00:53:44]
So this is something that Mario and I have been talking about and have been working on
[00:53:48]
for actually a decent amount of time.
[00:53:50]
The idea is that, you know, the compiler actually knows a lot about your project.
[00:53:54]
And a lot of that information could be surfaced in really interesting ways.
[00:53:59]
Like yeah, you could have a mapping to like a view function.
[00:54:01]
You could have like, I think actually navigation of your code base in different ways than files.
[00:54:08]
You could have like information from the compiler about your code.
[00:54:12]
So this would be like essentially like bringing the static analysis that the compiler already
[00:54:17]
does and surfacing that when you can.
[00:54:20]
And I was just very excited because it seemed like there were so many interesting avenues
[00:54:25]
for editing that an Elm would be like ideal for a lot of this because of just how it's
[00:54:31]
sort of put together that we'd be able, that I wanted to explore personally.
[00:54:37]
And the main blocker seemed to be that, you know, there's this sort of this concept of
[00:54:42]
that and Mario, let me know if I'm getting ahead of myself, but like that, you know,
[00:54:47]
a batch compiler, a compiler that is meant to run, you know, you fire it and then it
[00:54:53]
finishes is just going to be too slow for editor tooling.
[00:54:58]
And of course, if you're Rust or if you're Haskell, this is probably true just because,
[00:55:04]
but your language is vastly more complicated than Elms in a lot of ways.
[00:55:07]
And also Evans put a lot of effort into making the Elm compiler efficient.
[00:55:12]
It is very efficient.
[00:55:14]
So what we've been working on is with our version of Elm dev, our version of the Elm
[00:55:18]
compiler is what couldn't we cache in memory?
[00:55:22]
Like can this be a running server that we talked to and can we cache some of these things
[00:55:26]
to make it fast?
[00:55:27]
And like, I, we think that that's, that's true from what we're seeing.
[00:55:32]
We can't probably talk to specifics on that, but, and there's still a lot of work to be
[00:55:38]
done, but very excited for what this opens up.
[00:55:41]
And this is to give a little bit of context.
[00:55:45]
When we had Simon Lidell on for the Elmwatch tool, he kind of hinted at this idea of like,
[00:55:54]
okay, I can make the feedback cycle faster with this nice Elm live dev server environment
[00:56:01]
that, you know, compiles things very quickly.
[00:56:04]
But if I, like he was getting hooked on making it faster and he's like, well, if I really
[00:56:09]
wanted to make it faster, I would have it in memory.
[00:56:12]
And yeah, that's basically what you're talking about.
[00:56:15]
Yeah.
[00:56:16]
Yeah.
[00:56:17]
Yep.
[00:56:18]
I find it funny that I've been working very hard to make ElmReviews cache that is in memory,
[00:56:28]
put it on the file system and you've been trying to do the opposite.
[00:56:31]
The opposite.
[00:56:32]
That's right.
[00:56:33]
Yeah.
[00:56:34]
Absolutely.
[00:56:35]
So one, one anecdote there, and like Matt said, like there's some, a lot of this work
[00:56:39]
is, I mean, it's looking pretty promising.
[00:56:41]
I think Matt's currently been playing around with the kind of memory model work that I'm
[00:56:47]
desperately trying to get back to, to finish off.
[00:56:49]
But yeah, one anecdote that I found both really funny and very kind of encouraging, continuing
[00:56:56]
to pursue this as I spent an entire weekend, kind of, I spent a weekend finishing off,
[00:57:01]
finishing off basically this kind of a chunk of this in-memory caching feature, caching
[00:57:07]
feature.
[00:57:08]
And I was getting really excited to be like, okay, I'm going to now it's, you know, it's,
[00:57:12]
it's, it's working, it's type checking.
[00:57:14]
I'm going to do some tests.
[00:57:15]
And I was really excited to send some results to Matt.
[00:57:18]
And I started, I started putting together like all these tests and you know, I was having,
[00:57:23]
this isn't in like a Haskell development mode, right?
[00:57:26]
So it was slower than the normal Elm compiles would be anyway, but I was kind of seeing
[00:57:30]
like 200, 300 millisecond compiles without caching like the normal ones.
[00:57:37]
And then on my, my memory work, for some reason it was giving me like 600, 700 milliseconds.
[00:57:46]
And I'm, I'm scratching my head.
[00:57:47]
I'm going like, it doesn't, it doesn't make sense.
[00:57:49]
I'm like, what if I deoptimize?
[00:57:50]
And I was digging, digging, I spent hours, I think I spent the full, I think I spent
[00:57:54]
the full of my Sunday kind of, kind of torpedoed into this.
[00:57:59]
And eventually I got a, something, something, something crashed at some point and I couldn't
[00:58:04]
figure it out.
[00:58:05]
I was looking at, at, at the code and I had this really, I mean, it's all entirely my
[00:58:09]
fault.
[00:58:10]
I had this really, really janky code where I was using some, some Haskell, a low level
[00:58:14]
library to do timing parsing.
[00:58:17]
Right.
[00:58:18]
And I had assumed in my little string parser of this timing result, things would come back
[00:58:23]
to me in seconds or milliseconds.
[00:58:25]
And I had this, this parsing crash.
[00:58:27]
And then I look into it and I realized actually I hadn't handled the case where things are
[00:58:31]
coming back in nanoseconds, but what was actually happening is that the memory cache compile
[00:58:38]
was coming back in like 600 to 700, 800 nanoseconds, not milliseconds.
[00:58:43]
And so actually everything was fine and there wasn't a problem.
[00:58:45]
And I was just going around in circles for a day.
[00:58:47]
So it's so good.
[00:58:50]
Very, very excited when I was able to share that with Matt.
[00:58:53]
I literally remember that day.
[00:58:54]
It was, it was, yeah, it was awesome.
[00:58:56]
I, yeah, and what we're using to sort of validate this is we actually are using the vendor code
[00:59:03]
base, which again, 600,000 lines of code.
[00:59:06]
So it's pretty big.
[00:59:09]
You know, there may be bigger code bases, but it's definitely one of the top, you know,
[00:59:13]
whatever, five, maybe of things that are out there.
[00:59:17]
So if we can get it where it can in the editor, it feels like instantaneous feedback, which
[00:59:20]
I, I feel is possible.
[00:59:23]
And I, I have experienced actually with some of this stuff because when the stuff is cached
[00:59:28]
and you haven't changed anything, you're just navigating around.
[00:59:31]
Like it should be nearly instantaneous, like, you know, a millisecond or two to do some
[00:59:37]
of these things.
[00:59:38]
So the tricky part is when like, okay, you made an edit now, can we get stuff?
[00:59:44]
But yeah, cannot wait.
[00:59:46]
That's going to, that's going to be this year for sure.
[00:59:48]
Because it's one of the projects I'm super, super excited about this year, 2022.
[00:59:53]
Cool.
[00:59:54]
This upcoming year.
[00:59:56]
That's right.
[00:59:57]
I'm closing your PRs right now.
[01:00:00]
I have the window open.
[01:00:03]
I'm leaving an emoji.
[01:00:06]
Another middle finger one.
[01:00:11]
So this is all very exciting.
[01:00:13]
I'm not sure whether you guys want to get into, you're talking about like speed and
[01:00:18]
the feedback cycle.
[01:00:19]
I'm not sure if you, how much you want to get into things beyond that of like getting
[01:00:25]
more rich information about Elm code here, but just wanted to give you the opportunity
[01:00:32]
if you want to talk about it.
[01:00:33]
Yeah, I can kind of talk to this a little bit.
[01:00:35]
It's kind of been aware, like Mario's been working on the caching strategy and I've been
[01:00:40]
working on iterating on a specific plugin for VS code to sort of try out these editing
[01:00:45]
ideas that we sort of have.
[01:00:47]
It's a, there's the basic premise, which is that the compiler can allow us to get information
[01:00:53]
that is otherwise hard to compute, or you basically just end up into a situation where
[01:00:58]
you're literally recreating the compiler in some other language, which is a pain.
[01:01:02]
Yes.
[01:01:03]
So it's like, okay, we have this information.
[01:01:08]
So we have this information and also just the, you know, at vendor, I spent a lot of
[01:01:12]
time thinking about product and how to develop a product that's actually useful and, you
[01:01:18]
know, solves like for the user and everything.
[01:01:20]
So we don't, it, what I am not pitching is a specific solution with this, but I am looking
[01:01:27]
very hard at what do people actually do when they edit.
[01:01:32]
And it's not obvious to me that our default modality of editing, and when I say default,
[01:01:38]
I mean something like the standard VS code editing experience where you have a lot of
[01:01:43]
information in hover cards or, you know, even like the, the language server, like we're
[01:01:49]
going to flash red with all these intermediate compilation steps.
[01:01:54]
Like it's not like that doesn't feel like the, that doesn't feel like the ideal.
[01:02:00]
It doesn't to me.
[01:02:01]
I think it's really cool.
[01:02:02]
And there's, there's a lot of, there's some stuff there, but there's a lot of stuff just
[01:02:06]
to learn of what information do you want at what time or what are you doing?
[01:02:10]
You know, what are you trying to accomplish?
[01:02:12]
We spend, I think way more time or I spend a lot more time in my code.
[01:02:17]
It's not about reading code necessarily.
[01:02:19]
It's literally about navigating and gathering enough information context.
[01:02:24]
So it's, you don't read it from front to back.
[01:02:26]
Like you read a book, you know, you, you, you go around, you gather clues of, of what
[01:02:33]
you might, you gather references, right?
[01:02:35]
You set your table with various things from all over the code base, and then you get a
[01:02:40]
piece of clarity and you do something.
[01:02:42]
So there's not too many, I mean, there are some tools, but there aren't too many tools
[01:02:46]
that I think look at that concept at that primary interaction, which feels massively
[01:02:53]
common and actually try to solve for it beyond just like, we're going to kind of give you
[01:02:57]
everything at every point and hopefully something sticks.
[01:03:01]
So I have some really cool experiments that I cannot wait to share, like once we have
[01:03:06]
something going, but it's sort of in the stage of like, okay, I think I have a good idea
[01:03:12]
what the problem is.
[01:03:14]
Let's start trying out some ideas that address those things directly and hopefully it'll
[01:03:19]
be successful, but you know, who knows?
[01:03:21]
It's very exciting for me.
[01:03:24]
It's every time I see these exciting things being done with AI code assist tools, like
[01:03:31]
GitHub copilot or people using GPT chat to solve coding problems and, and stack overflow
[01:03:39]
banning GPT chat answers in, you know, I'm like, ah, this feels like the wrong direction.
[01:03:47]
And like, I would love as a, you know, pure FP community to be like, here's another path
[01:03:55]
we could go down and it's actually really awesome.
[01:03:58]
Let us show you how cool it can be.
[01:04:00]
Yeah.
[01:04:01]
I'm really curious.
[01:04:02]
I mean, I think AI stuff, it's not going to be like a fad.
[01:04:05]
It's going to be just like progressively moving forward.
[01:04:08]
I think one of the challenges we're going to have just in general is not that right
[01:04:12]
now there's a bifurcation, right?
[01:04:13]
There's like, okay, here's something that was totally like human developed and here's
[01:04:16]
something that was totally suggested by an AI, but like, there's going, there are going
[01:04:21]
to be hybrid tools that are going to be more nuanced on both sides, but who knows what
[01:04:26]
that looks like?
[01:04:27]
Absolutely.
[01:04:28]
Exactly.
[01:04:29]
And like type directed, right?
[01:04:32]
Like, okay, we can, we can calculate the types already.
[01:04:35]
Type directed AI intervention of some sort.
[01:04:37]
That's I don't know.
[01:04:39]
It could be a thing.
[01:04:41]
Yeah.
[01:04:42]
And it should be like computers are good at understanding constraints and they have them.
[01:04:45]
So let them do smart AI things within those constraints.
[01:04:50]
Yeah, definitely.
[01:04:51]
I'm pretty, I'm pretty convinced that it's not going to be, that it's not going to be
[01:04:54]
AI long-term applied to directly spitting out code for us.
[01:04:59]
It feels like there's going to be a better, a better human interface there, or just, just
[01:05:04]
a better interface in general.
[01:05:06]
And then maybe AI could target that interface or humans could direct AI to target that interface
[01:05:11]
much better.
[01:05:12]
Like I think the imagery, imagery is a pretty good view of how that goes, right?
[01:05:17]
Like there's a, there's a, there's a visual target.
[01:05:20]
It's a kind of softer visual target.
[01:05:21]
Whereas I think programming right now is very, very precise and very, in a large amount of
[01:05:27]
really pernickety ways.
[01:05:28]
And I think Elm, like Elm is a really great example of that, right?
[01:05:31]
Like it's like a tighter interface where we go, you know what, let's use more of what
[01:05:35]
the computer is really, really good at.
[01:05:36]
Like let's narrow in on that or let the computer do more of that stuff rather than us, you
[01:05:41]
know, having those kinds of foot guns lying around all over the place.
[01:05:44]
So yeah, we'll see.
[01:05:46]
AI in Elm.dev for version two now, I think.
[01:05:52]
I like that.
[01:05:53]
I like that take, Mario.
[01:05:54]
I can definitely imagine like AI tools to help assist you in generating like sample
[01:06:00]
inputs and outputs.
[01:06:01]
Cause it sees the pattern and it's like, well, okay, should I help you fill out your test
[01:06:06]
suite?
[01:06:07]
And then it could understand how it's tweaking of the code or generation of code influences
[01:06:15]
the outputs as it runs that test suite and have that as part of its feedback loop.
[01:06:20]
It could understand the constraints of the type system it's working in.
[01:06:23]
And then it could iterate on that and start making those tests green and then show you,
[01:06:29]
okay, here are five different ways to make this green.
[01:06:31]
Like that's what I want.
[01:06:33]
Those are the type of AI assists that I want.
[01:06:35]
Help us help you machines.
[01:06:37]
We're here for you.
[01:06:40]
Always with tests, right?
[01:06:41]
That's true.
[01:06:42]
It always goes back to types and tests.
[01:06:46]
That's a moral of the story.
[01:06:48]
It's only going to work for you because you're the only one who writes tests first.
[01:06:54]
In the typed world.
[01:06:55]
Or like you could maybe take that further.
[01:06:58]
You basically have a code and then have the AI ask you questions like, were you intending
[01:07:02]
for this list to be reversed afterwards?
[01:07:04]
That's interesting.
[01:07:05]
I like that.
[01:07:06]
Because you may not have noticed it, but it definitely is.
[01:07:10]
You could get the AI to review PRs for you.
[01:07:12]
And then you basically just confirm properties, right?
[01:07:15]
So like you say, yeah, this list is reversed when you call this function.
[01:07:20]
Great.
[01:07:21]
Jeroen, do you have any plans for 2023?
[01:07:24]
Any goals?
[01:07:25]
Any hopes?
[01:07:26]
I think I'm going to work on that.
[01:07:28]
It's not just the one hope.
[01:07:29]
It's just that one PR.
[01:07:30]
That would be pretty cool.
[01:07:31]
And then hopefully it gets backtracked to the Elm compiler.
[01:07:39]
Because otherwise it's not very useful in practice.
[01:07:43]
I think I'm going to work on Elm review.
[01:07:46]
Probably.
[01:07:47]
Surprising, yeah.
[01:07:49]
The one thing that I would really like to get in there is to add type information.
[01:07:53]
But for that I need to re-implant the Elm compiler.
[01:07:57]
To ask Martin Janicek to do that for me.
[01:08:00]
So if you're listening, do it.
[01:08:06]
That would be amazing.
[01:08:07]
That would open up for so many possibilities.
[01:08:11]
So that would be cool.
[01:08:12]
Yeah, maybe I'll...
[01:08:13]
I'm really thinking about performance at the moment.
[01:08:16]
So maybe I'll do a few more pull requests to Elm Optimizer 2.
[01:08:19]
Who knows?
[01:08:21]
Maybe we can look at those next year.
[01:08:25]
Yeah.
[01:08:27]
Then what I'm probably going to do with Elm review is just add more information to the
[01:08:32]
project.
[01:08:33]
Like being able to collect arbitrary files, like CSS files or arbitrary JSON, your translation
[01:08:40]
files, whatever.
[01:08:42]
Because the more information you give to the linter, the better it becomes.
[01:08:49]
That's what I figured out when I was preparing talks this year.
[01:08:52]
And then yeah.
[01:08:53]
Because false positives is a lot of information.
[01:08:56]
Yeah.
[01:08:57]
And maybe to make it be able to do and maybe allow it to do more things like create files,
[01:09:04]
delete files, basically do something like Elm Code Gen in a way.
[01:09:09]
Elm Pages Code Gen review.
[01:09:11]
Yeah, absolutely.
[01:09:14]
Maybe without the pages.
[01:09:15]
Matt, let's do something just you and me.
[01:09:19]
It's always Elm Pages.
[01:09:21]
Why is it always me who's the third wheel?
[01:09:25]
Okay, hear me out here.
[01:09:27]
Elm Pages Code Gen review Lambdaera.
[01:09:31]
Boom.
[01:09:32]
Now you're just trying to include Mario.
[01:09:34]
No, actually I am very excited about the possibility.
[01:09:38]
Well already Elm Pages v3 beta uses Lambdaera, but other way around could be really cool
[01:09:46]
too.
[01:09:47]
And we've definitely discussed possibilities in that area.
[01:09:50]
2025 all tools converge into one mega tool.
[01:09:57]
That's what I'm predicting.
[01:09:58]
Yes.
[01:09:59]
Elm Pages is already using Elm Code Gen, Lambdaera and Elm Review.
[01:10:03]
Right?
[01:10:04]
All right.
[01:10:05]
Exactly.
[01:10:06]
Yeah, it uses Elm Review for several things, including helping do dead code elimination
[01:10:12]
for the data sources.
[01:10:13]
So they're stripped out of your client side bundle, which is very exciting.
[01:10:16]
So second hot take there, Elm Pages does a hostile reverse takeover.
[01:10:21]
This is all the other tools to be subservient to Elm Pages.
[01:10:28]
I will neither confirm nor deny that.
[01:10:33]
Anything else on your radar Jeroen?
[01:10:35]
For now that's it.
[01:10:37]
But like most things I will go through with whatever I feel like I'm interested in.
[01:10:42]
Right?
[01:10:43]
If I'm interested in performance, I will look at that if I'm interested in fixing security
[01:10:47]
issues, I will do that again.
[01:10:50]
If I'm interested in making Elm Review much faster, that's what I'll focus on.
[01:10:54]
And it's probably going to be related to performance or Elm Review in some way.
[01:10:59]
And all the while I will keep trying to convince the JavaScript community that they're wrong
[01:11:05]
and that they should do things like we do it in the Elm community.
[01:11:09]
But not very hopeful for that.
[01:11:13]
The best way to convince someone is to tell them they're wrong, by the way.
[01:11:18]
I know, I know.
[01:11:20]
In all seriousness, I do think actually a lot of the things we've talked about here
[01:11:25]
do reduce the barrier to entry for people coming into Elm and give a better on-ramp.
[01:11:31]
Because I think we all know that once you're up the on-ramp of Elm, you fall in love with
[01:11:38]
all these things, all the things that seem like just a pain, decoders and not having
[01:11:44]
a bajillion NPM dependencies and things like that seem like a burden and how am I going
[01:11:49]
to manage?
[01:11:50]
But then you're like, actually, packages that do exist are amazing.
[01:11:53]
There are all these things that I can very easily do without a package.
[01:11:58]
It's so easy to manage my dependencies and it's so type safe to write these decoders
[01:12:04]
in this way.
[01:12:05]
You fall in love with it, but you need a good on-ramp.
[01:12:07]
So I think we're talking about a lot of things here that do ease that on-ramp.
[01:12:11]
I'm definitely excited about in 2023, first of all, getting the Elmpages v3 stable release
[01:12:18]
is going to be a huge load off my back.
[01:12:22]
I can't wait to finally be done with it, but also just have created this thing that I have
[01:12:29]
really wanted to create for a long time for server-side rendering, dynamic server-side
[01:12:35]
applications, a la Remix and Next.js.
[01:12:38]
Very excited for there to be an answer to the question of how do you do that kind of
[01:12:42]
thing in Elm.
[01:12:44]
And I'm just, yeah, I think in 2023, I'm really excited to have that out there and do fun
[01:12:50]
things with it and to continue to try to answer this question of how do we make great experiences
[01:12:56]
for the web with Elm and how do we equip people with the tools to do that?
[01:13:01]
And so, yeah, I'm also, I've been doing some pairing with Philip Kruger on Tailwind for
[01:13:11]
some Tailwind v3 changes for Elm Tailwind modules to take all of these permutations
[01:13:19]
of different Tailwind variants that get generated into a bajillion generated functions and parameterize
[01:13:27]
color.
[01:13:28]
So instead of bg red 500, bg red 600, bg red 700, you have bg with color and then theme
[01:13:36]
dot red 600, for example.
[01:13:40]
So that's another thing I'm excited about, shipping and getting a reduced period entry
[01:13:47]
for people who, you know, I think that having great first principles tools like Elm UI is
[01:13:54]
important.
[01:13:55]
And I think people who say, well, we're on Tailwind, how do I do that in Elm is also
[01:14:00]
super important.
[01:14:01]
So I'm really excited to, like, we can have best in class ways to do that where it's like,
[01:14:08]
okay, here's how you do Tailwind and react, but check out how you can do it in Elm.
[01:14:12]
Check out how type safe it is and how high level it is, but you still are using Tailwind.
[01:14:17]
So I'm super bullish on that and yeah, excited to see what's in store for us in 2023.
[01:14:24]
Yeah.
[01:14:25]
I also want a website for Elm review because Matt's been making a few websites for his
[01:14:32]
Elm projects.
[01:14:33]
This year is going to be the year of Matt writing so many websites.
[01:14:40]
And I'm just going to fork one of them and make Elm review.
[01:14:43]
Great.
[01:14:44]
Yeah, I need to write it.
[01:14:45]
You can do that right now, but they're very, it's like one page, but ultimately, I mean,
[01:14:52]
yeah, there's a sequence here.
[01:14:53]
It's like design system generator.
[01:14:55]
Great.
[01:14:56]
I get that.
[01:14:57]
And then I'm able to use that to generate the stuff for the pages.
[01:14:59]
And then, yeah, no, I got at least four websites that I want to make this year.
[01:15:04]
We've got ElmUI.com.
[01:15:06]
We got ElmGQL.com.
[01:15:07]
We got ElmCodeGen.com.
[01:15:08]
We got Elm.dev.
[01:15:10]
I think I want to launch my own blog at some point.
[01:15:13]
We'll see.
[01:15:15]
Don't each of those have to have their own blog as well?
[01:15:18]
Probably.
[01:15:19]
Yes.
[01:15:20]
Wait, your blog has a blog?
[01:15:23]
Yeah.
[01:15:24]
He blogging about the blog.
[01:15:26]
It's the meta blog.
[01:15:29]
Well, I can't wait for all of these wonderful projects.
[01:15:33]
And thank you again for coming on to ring in the new year with us.
[01:15:37]
Mario, Matt, thank you so much for coming on the show and happy 2023, everybody.
[01:15:43]
Thanks for having us.
[01:15:44]
This is great.
[01:15:45]
Yeah.
[01:15:46]
Happy 2023.
[01:15:47]
And Jeroen, until next year.
[01:15:48]
Until next year.
[01:15:49]
Happy 2021.