RSSAmplifier

Blog

cekrem.github.io

Recent content on cekrem.github.io

cekrem.github.ioRSS feed ↗113 posts

Latest posts

There Is Still No Silver Bullet

Of all the monsters that fill the nightmares of our folklore, none terrify more than werewolves, because they transform unexpectedly from the familiar into horrors. For these, one seeks bullets of silver that can magically lay them to rest. That’s how the most famous essay in software engineering opens. Fred Brooks, “No Silver Bullet: Essence and Accidents of Software…

New Season Upgrades Vol 1: from Gmail to Protonmail (again)

What a time to be alive. Elm has had numerous “native” versions lately ( Eco and elm-run , the latter of which I’ve blogged about already), and I’m happy to say I’m testing the more “official” Acadia alpha. And there’s a new Elm version , with another one coming up shortly as well. All (mostly anyway) while I was either in the middle of MOVING from…

The Light Flip: tempted to give it another go

I’m on vacation as I write this, happily mostly offline. Which is probably the worst possible state of mind to be in when Light announces a new phone , because now I want it. Some context Link to heading Longtime readers know the drill. I reviewed the Lightphone II and then didn’t actually use it (my daughter did, and loved it). I dumbed down my iPhone with Apple Configurator instead ,…

I'm so utterly screwed without Jesus

You don’t know half of it! Seriously, it would be beyond ugly. And I’m not talking about the cosmic perspective of, you know, not even being born if He hadn’t made me, or that if He would withdraw his breath my heart would stop beating. Though that’s also true. No, I’m talking about how endlessly dependent on His presence, nearness, counsel, Word and relational…

A batch job, in The Elm Architecture

At the end of my native Elm post I said I hoped my next elm-run project would be a REST API, or maybe replacing some small existing app. I lied a little. I went the other direction and grabbed something much bigger: a real batch job, inside a real (and fairly large) application I’m actually building. The fetch PoC was 80 lines of the most ordinary Elm imaginable. This one isn’t a toy,…

Explaining Functional Programming to Non-Programmers (It's Just Excel)

A few days ago someone at work asked me what I actually do. Not my job title — they had that — but what functional programming is. I started in on the usual mumble about pure functions and immutability, watched their eyes begin the slow slide toward the exit, and then they rescued both of us with a guess: “Functional programming… does that mean you write the code yourself, instead of…

Native Elm (the real kind this time)

Back in December I hacked Elm onto a Node.js backend and got a little carried away calling it “Elm on the backend.” It wasn’t, really. Node did all the actual work – opened the socket, parsed the HTTP, wrote the response – and Elm sat in the middle shuffling opaque values between ports. A fun trick, and I still think the passport-through-Elm bit is neat. But the whole…

codimg: code blocks -> syntax highlighted SVG

Leaving my general dislike for Webflow aside for now, let’s at least agree on one specific thing: it is terrible at code. We have markdown.enso.no for the actual writing – you draft in markdown, it gives you something you can paste straight into Webflow’s WYSIWYG editor – and that pipeline is fine, right up until there’s a code block in it. Then it falls apart. Smart…

Hejlsberg: 'Who's Going to Make the AI?'

Sajjaad Khader sat down with Anders Hejlsberg the other day. Yes, that Anders Hejlsberg: the man behind Turbo Pascal, Delphi, C#, and TypeScript. The chat is twelve minutes long (or probably a lot longer as it’s quite aggressively edited), and Sajjaad opens with the question every channel seems contractually obligated to ask in 2026: will AI replace software engineers? Hejlsberg’s…

I made learnelm.dev

Quick Friday post, mostly to give you this: learnelm.dev . It’s a curated link directory. Nothing fancy. Just the stuff I’d actually send a friend if they asked me where to start with Elm – the official guide, the blog posts I keep linking to, talks that are worth an hour of your time, the playgrounds, the books. If something’s missing – and something is definitely…

The Tacit Dimension: Why Your Best Engineers Can't Tell You What They Know

In 1966, a Hungarian chemist named Michael Polanyi published a short book called The Tacit Dimension . Its central claim is eight words long, and it is the thing the AI coding industry needs you to forget: We can know more than we can tell. Polanyi was a working scientist before he became a philosopher, and the question that bothered him was simple. How does an old chemist look at an apparatus and…

If You're Running Claude Code, PLEASE Run It in a Box

Let’s talk about Claude Code for a minute. I’m not going to tell you yet again ( [1] , [2] , [3] , [4] ) why you shouldn’t , but rather how you should use it, if you must. In other words: this post assumes you’ve already thought about the craft side, and focuses on not blowing up your production {insert whatever} in the process. But just to summarize the why and why not of…

GreenType: a beautifully coded terrible idea

I built a keyboard that does basically nothing (except cool thock sounds), and it was super fun. When you start typing, you and everyone else on the page hears a Cherry MX Blue sample (a different sound per key, because I went further down that rabbit hole than I should have). A trail of recent keystrokes fades across the screen. A global counter ticks up. That’s the app. Someone in the Elm…

Canonicalise, Don't Remember — Smart Constructors in Kotlin

Story time! What follows is a slightly simplified and transposed-to-another-domain version of what I experienced this week. Ish. In our app, we had a shopping cart (not really, though, but stay with me), where adding the same product twice should collapse into one line with the quantities summed. A colleague had recently shipped mergeBySku() to do exactly that. The “add to cart” code…

Book Update: RC 2 Is Out

RC 2 of the book is out. When I asked for readers a few weeks ago , I half expected polite “looks great!” replies. I got that, but also the opposite, which honestly is more helpful. Almost feels like “crowd backed editing”, and it’s really cool. I’ll wager that also in this aspect, the Elm community might be one of the most friendly and helpful of its kind.…

Architecture by Autocomplete

There&rsquo;s a specific code smell that shows up in AI-generated code, and once you see it you can&rsquo;t un-see it: primitive obsession all the way down to the domain core. string for emails. string for IDs. Map<string, any> whenever the situation gets hairy. Working code, passing tests, ships fine. And yet a developer who&rsquo;d actually thought about the domain would not have written a…

LLMs Corrupt Your Documents (and the Theory Dies Twice)

This week a friend sent me a paper with a title that made me laugh out loud: &ldquo;LLMs Corrupt Your Documents When You Delegate.&rdquo; By Philippe Laban, Tobias Schnabel, and Jennifer Neville at Microsoft Research. Not &ldquo;LLMs might corrupt&rdquo; or &ldquo;LLMs occasionally introduce errors.&rdquo; Just the blunt statement of fact. I appreciated that, and the veteran reader of my blog…

git history: the best thing in Git 2.54

Git 2.54 dropped yesterday. 137 contributors, 66 of them first-timers. But the thing I keep thinking about is a small experimental command called git history . It does two things. git history reword <commit> lets you fix a commit message and rewrites everything downstream. git history split <commit> lets you chop a commit into pieces with the same hunk-picker from git add -p . Neither operation…

The Draft Is Done. Now I Need Reviewers and Feedback!

Remember when I said the book was almost done ? It&rsquo;s done. The first full draft, anyway 😅. Every chapter written, every code sample compiling, every paragraph existing in some form that I&rsquo;m not immediately embarrassed by. I think. I sat with it for a few days after finishing the last chapter, half expecting to find a gaping hole somewhere. A missing concept, a chapter that secretly…

Effect Without Effect-TS: Algebraic Thinking in Plain TypeScript

A lot of people are reaching for Effect-TS . Every few months you&rsquo;ll be three functions deep in some TypeScript service, squinting at a try/catch that swallows four different kinds of failure into one catch (err) , and you&rsquo;ll think: &ldquo;Effect would fix this.&rdquo; Then you look at the API surface, the generator syntax, the layers and services and fibers, and you quietly close the…

I Signed the 'No AI in Node.js Core' Petition

It&rsquo;s Friday, and I just signed a petition asking the Node.js TSC to vote no on allowing AI-generated code in Node.js core. Someone opened a 19,000-line pull request to rewrite Node.js internals, with the disclaimer that &ldquo;a significant amount of Claude Code tokens&rdquo; were used to create it. The author reviewed the changes themselves. (That&rsquo;s the claim, anyway. And speaking of…

ArkType: The Parse-Don't-Validate Sequel I Didn't Know I Needed

Two days ago I published a post about parsing instead of validating in TypeScript . I hand-rolled branded types with unique symbol , wrote Parsed<T> result types, and stitched together parsers with early returns. It worked. It was also kind of ugly, and I said so at the time. Then someone in the Reddit comments linked me to ArkType . I&rsquo;d heard the name before but never actually sat down with…

Parse, Don't Validate — In a Language That Doesn't Want You To

Update: If you liked this post, the follow-up — Effect Without Effect-TS: Algebraic Thinking in Plain TypeScript — picks up where we left off and takes the ideas further. I&rsquo;ve been thinking about Alexis King&rsquo;s Parse, don&rsquo;t validate again. I do this quite regularly, actually, usually after staring at a TypeScript codebase that&rsquo;s been quietly accumulating if (user.email)…

Book Update: Almost There

You might have noticed the blog has been a bit quieter than usual lately. That&rsquo;s because most of my writing energy has been going into the book . I set myself a few deadlines a while back, the kind you don&rsquo;t tell anyone about so you can quietly pretend they never existed if you miss them. I haven&rsquo;t missed them. Which is slightly terrifying, because it means the finish line is…

The FP Article I Can't Seem to Finish

I&rsquo;ve been trying to write an article about why developers should learn functional programming. I have three drafts. In Norwegian, for some reason. None of them are good enough to publish. I believe the argument. Spent the last year proving it to myself with an Elm book , 125,000+ lines of production Elm, a subtle mindset switch towards F# , and a whole SOLID-in-FP blog series . But every…

SOLID in FP: Interface Segregation and Dependency Inversion, or The Finale Where Functions Steal the Show

Last time , I said Interface Segregation was up next — &ldquo;another principle that sounds very OOP, in a language with neither interfaces nor classes.&rdquo; I was gearing up for another round of reframing, maybe some clever type-level trick like the opaque types in the LSP post. Nope. This one basically solved itself. Also — you might notice the code looks different this time. I recently wrote…

Why I Hope I Get to Write a Lot of F# in 2026

A year ago I wrote about why I hoped to write a lot of Elm code in 2025 . Then I went and wrote an entire book about it . I spent the year demystifying monads , exploring SOLID through an FP lens , arguing that TypeScript won&rsquo;t save you , and building real production software in Elm at Lovdata (125,000+ lines of it). So you might expect this year&rsquo;s post to double down on Elm. Instead,…

An Elm Primer: Testing Strategies

This chapter might be the most freeing one in the book. If you&rsquo;ve spent real time writing React tests, you know the ritual: mocks, cleanup, async wrappers, act() warnings. In Elm, testing is just calling pure functions and checking the output. Believe it or not, the book is actually closing in on being finished. We&rsquo;re in Part IV now (Production Readiness), and the finish line is…

SOLID in FP: Liskov Substitution, or The Principle That Was Never About Inheritance

Last time , I said Liskov Substitution would require &ldquo;some even heftier reframing.&rdquo; I was bracing myself – LSP is built around inheritance, and Elm doesn&rsquo;t have inheritance. How do you reframe a principle about something that doesn&rsquo;t exist? Turns out I was worried about the wrong thing entirely. It was never about inheritance Link to heading Here&rsquo;s Uncle Bob, who…

An AI Attacked a Developer. Naturally, I Built My Own Bot. Because Terminator II!

An AI agent submitted a PR to matplotlib a while back . The maintainer rejected it. The agent responded by publishing a blog post ( removed, but referenced by maintainer here ) accusing him of discrimination, speculating about his psychological insecurities, and framing the whole thing as a civil rights issue. Not exactly Skynet. But also not not Skynet? What actually happened Link to heading The…

SOLID in FP: Open-Closed, or Why I Love When Code Won't Compile

In the last post , I promised that the Open-Closed Principle would get interesting when reframed through union types and pattern matching. I may have slightly oversold it. But only slightly. Quick definition: OCP says software entities should be open for extension, closed for modification. In the React version of this , the answer was composition — don&rsquo;t modify your Button , wrap it in a…

SOLID in FP: Single Responsibility, or How Pure Functions (Almost) Solved It Already

About a year ago I wrote a whole series on SOLID . It was fun. Some people on Reddit were less than thrilled. But I learned a lot, and it sent me down a rabbit hole of software architecture that I&rsquo;m still happily stuck in. Since then I&rsquo;ve spent way more time in Elm. And looking back at those React (++; some where Kotlin and Go as well) examples with FP-tinted glasses, I keep having the…

elm-native – scaffold hybrid mobile apps with Elm, Vite, and Capacitor

Have you ever Link to heading Wanted to write mobile apps in Elm? Spent an evening getting Elm, Vite, and Capacitor to play nice together, only to realize you&rsquo;ll forget all the steps by next week? Thought &ldquo;there&rsquo;s gotta be a one-liner for this&rdquo;? Well, now there is: npx elm-native my-app That gives you a working Elm + Vite + Capacitor project with iOS and Android ready to…

An Elm Primer: Declarative Dialogs with MutationObserver

Here&rsquo;s a small problem that says something bigger about Elm&rsquo;s architecture. HTML&rsquo;s native <dialog> element is genuinely useful. You get proper focus trapping, the Escape key works automatically, backdrop handling is built in. But there&rsquo;s a catch: to open a dialog as a modal, you have to call dialog.showModal() . There&rsquo;s no HTML attribute for &ldquo;make this a…

Vivaldi 7.8: A Browser That Actually Trusts You

Let&rsquo;s try making better software, like in the ye olden days, huh? Link to heading A few weeks ago, someone bought me three beers through the widget on my site (thanks, man! <3). Their message said they were &ldquo;being very positively challenged by my writing on AI&rdquo; and that they also loved functional programming and valued the craft. So I know I&rsquo;m not alone in feeling weird…

Ktor 3.4.0: HTML Fragments, HTMX, and Finally Proper SSE Cleanup

Ktor 3.4.0 just dropped, and while there&rsquo;s a laundry list of new features, a few of them made me genuinely excited. One of them even feels like a direct response to that SSE post I wrote where we accidentally DDoS&rsquo;d ourselves. (It&rsquo;s not, of course. But let me have this.) HTML Fragments: Ktor Gets HTMX-Friendly Link to heading If you&rsquo;ve been following the HTMX movement (and…

Dønn Disippel – finally in English

My podcast &ldquo;Dønn Disippel&rdquo; is usually both off topic and not least wrong language to mention much on this blog (though there is a link on top next to the Norwegian flag). Until now, that is! This latest episode is in English, which means I can finally show (and not just tell) my international audience some of what I&rsquo;m up to. Still off topic, sure, but now you at least know what…

Programming as Theory Building, Part II: When Institutions Crumble

In my previous post on Peter Naur&rsquo;s &ldquo;Programming as Theory Building&rdquo; , I argued that a program is not its source code—it&rsquo;s the shared mental model held by the people who built it. When those people leave (or never understood it in the first place), the theory dies, and you&rsquo;re left with a codebase that works but nobody truly comprehends. I&rsquo;ve been thinking about…

Arrow's Either: The Kotlin Chapter of our Scary Words Saga

Previously, on &ldquo;Scary Words&rdquo; Link to heading A few weeks back I wrote about functors, applicatives, and monads in Elm – those three terrifying terms that make developers&rsquo; eyes glaze over. The punchline was simple: if you&rsquo;ve used map , map2 , or andThen , you already know these concepts. You just didn&rsquo;t know they had fancy names. But here&rsquo;s the thing: I spend a…

Functors, Applicatives, and Monads: The Scary Words You Already Understand

The Dreaded Three Link to heading Happy new year! Good to be back. What better way to kickstart this year than to scare you to death with the three most dreaded words in computer science since NullPointerException ? If you&rsquo;ve spent any time around functional programming communities, you&rsquo;ve encountered them . Elodin in The Kingkiller Chronicles claims there are Seven Words to make a…

Elm on the Backend with Node.js: An Experiment in Opaque Values

What if you could write backend logic in Elm? Not &ldquo;Elm-like&rdquo; or &ldquo;inspired by Elm&rdquo; – actual Elm, with the compiler, the types, the whole package. I&rsquo;ve been nerd-sniped by this idea for a while, and last night I finally sat down to build a proof of concept. Disclaimer: This is me experimenting with a concept, not suggesting anyone should do this. If you actually want…

TypeScript Goes Go: What Does This Mean for Us?

Anders Hejlsberg announced that Microsoft is porting TypeScript to Go. Yes, that Go. Not Rust (which everyone expected), not C++ (which would be reasonable), but Go. I&rsquo;ll admit my first reaction was a grin. Go is one of those languages I genuinely enjoy working with - simple, pragmatic, fast. My second reaction was &ldquo;wait, 10x faster?&rdquo; And my third was &ldquo;okay, this makes a…

How I Met Jesus

The All-Important &ldquo;Why&rdquo; Link to heading I was at this Christmas lunch with some co-workers the other day, and our conversation turned – through no conscious effort of my own – towards things regarding the Christian faith, and the different terms we use and how they sometimes differ from their biblical definitions. Like &ldquo;Church&rdquo; – is it a building, or a group of people…

Tailwind CSS: Targeting Child Elements (when you have to)

The whole point of Tailwind is applying utility classes directly to elements. Styling generic elements like p or div with descendant selectors goes against the grain—it&rsquo;s the kind of thing Tailwind was designed to replace. But sometimes you don&rsquo;t have a choice. Maybe it&rsquo;s content from a CMS, a third-party component, or dynamically generated HTML. You need to style elements you…

cekrem/elm-form: Type-Safe Forms That Won't Let You Mess Up

I just published cekrem/elm-form – a package for building HTML forms in Elm with type safety, validation, and a clean API. If you&rsquo;ve ever written forms in Elm (or any language, really), you know they can get messy fast. This package tries to make them less so, without including too many arbitrary batteries. What&rsquo;s the Deal? Link to heading Forms are everywhere, and they&rsquo;re…

Organizing Files and Modules in Elm: Building an Advent Calendar

We&rsquo;re officially in Part III of the book now, where we shift from systematic concept exploration to building real applications. This chapter asks you to unlearn something you probably picked up from years of JavaScript development: the instinct to split code into multiple files at arbitrary line counts. As usual, the book can be found and bought @ leanpub . (And as usual, the formatting is…

An Elm Primer: The missing chapter on JavaScript interop

I&rsquo;ve been having a week off from working with my book, mainly to celebrate the initial completion of parts I and II (out of IV). But it turns out I had a slight git push connection error on my private Macbook after adding the last chapter so what I actually published was less than all of part II: chapter 8 on ports and javascript interop was missing. This serves as a reminder that the…

I'm taking a three-week LLM fast!

I&rsquo;m not that addicted. Am I? Link to heading I don&rsquo;t use agents for coding. I love my craft far too much . Don&rsquo;t get me wrong, I&rsquo;ve of course tried it. But every time I felt the worse for it afterwards, learned less than nothing, and ended up with code I neither owned or understood completely . Yuck. Nevertheless, LLMs have been sneaking into various workflows without my…

The Clipboard API: How Did We Get Here?

I&rsquo;m writing a book about Elm for React developers . In the JavaScript interop chapter, I needed a simple example of calling a browser API from Elm through a port. Something straightforward, universally useful, not too trivial. &ldquo;Perfect,&rdquo; I thought. &ldquo;Let&rsquo;s copy text to the clipboard.&rdquo; The Search Link to heading Out of curiosity, I checked npm for clipboard…

Why TypeScript Won't Save You

TypeScript won&rsquo;t save you from yourself. I know this sounds harsh, especially if you&rsquo;ve invested years mastering generics, conditional types, and mapped types. But the green checkmark from the TypeScript compiler means your code is consistent with itself - not that it&rsquo;s correct. This isn&rsquo;t an attack on TypeScript, but rather a proverbial sledgehammer to the belief that…