FullStack Bulletin logo

FullStack Bulletin

Archives
Subscribe
January 27, 2026

🟡 The Incredible Overcomplexity of the Shadcn Radio Button — FullStack Bulletin #453

Shai Hulud postmortem from Trigger.dev, Extism plugins, CEL rules, Node.js config file slides, Basecoat UI, SeqFlow JS, and a quick break with Tiled Words.

This issue is kindly sponsored by

The platform for building AI workflows in TypeScript. Long-running tasks with retries, queues, observability, and elastic scaling.


What's up,

Lately I have been reflecting on how much I have enjoyed building software throughout my career, and especially building for the web. It is probably getting close to 20 years now, which is both exciting and slightly terrifying.

I think I always loved this craft because it gave me that magic feeling of building something from nothing. Learn the tools, learn the languages, add a pinch of creativity, then iterate until the thing starts to feel like it has a life of its own. Bit by bit, it becomes real. Almost like an artisan refining a piece until it is finally ready to go.

But I am not sure it feels the same today. With AI in the mix, I sometimes feel like I have traded part of that artisanal spirit for something more industrial. I still believe the fine details matter a lot. Knowing how the browser really lays out a box, how a query planner behaves, or why a build step is slow is still what makes us good at this job. But the feeling of building is definitely different now. I spend less time shaping every little edge by hand, and more time directing, verifying, and stitching pieces together at speed. It is not always as fun, but it gives me so much more power to explore ideas and projects I would never have time for otherwise. I still do not know if that is good or bad. Time will tell. I just know I still love this world, even if it feels very different to work in it.

What about you? I know everyone has an opinion at this point, and I am genuinely curious to hear yours. Hit reply and tell me what you think.

Now, let us get into some full stack goodness. This week is mostly tools, and I hope you will like the selection.

Let's dive in and learn together!
— Luciano


"So much complexity in software comes from trying to make one thing do two things"
—Ryan Singer, Software Developer


An illustration for the article The Incredible Overcomplexity of the Shadcn Radio Button

The Incredible Overcomplexity of the Shadcn Radio Button — I admit, when I read the title of this one I was skeptical. It sounded like the usual “look how silly the JavaScript world is” take. Then I read it, and an old, dismissed feeling came back to me. You know, the first time I tried shadcn/ui, I was not really sold. The components looked great, but the implementation felt heavier than it needed to be for a lot of the basics. Then I kept using it, because the convenience is real and the results look good fast, and that nagging feeling basically vanished. This article brings it back in the best way. It walks through how a simple <input type="radio"> turns into a little universe of React wrappers, Radix primitives, ARIA plumbing, Tailwind classes, and even an icon dependency just to draw a circle. And the author is not dunking on libraries. The point is sharper than that. We keep rebuilding native controls because styling used to be painful, even though modern CSS can often get us what we want without dragging in a whole stack. I have a strong feeling now that maybe I should reconsider my choice of UI libraries and pick something simpler that leans on web standards a bit more. Any suggestions? Read Article

Tiled Words (web Game) — OK, I admit I feel a bit like a stalker mentioning this one. After reading the previous article, I got curious and clicked around the author’s site “just a little.” That is when I found they built this awesome daily game. It feels like a genius mashup of a classic crossword and Tetris. You drag tiles around, rotate them, and slowly turn a messy board into something that actually makes sense. It is not our usual link to a web resource or tutorial, but it is a perfect little break when your brain needs a reset. Or maybe it is not a break at all, because I also went snooping on GitHub and found what looks like the full source code of the game. It is a clean Vue + Vite project, and it is such a fun example of how you can build a beautiful, entertaining web game without having to learn Unity or Unreal. Take a Break and Play

Basecoat UI — ...And speaking of simpler alternatives to shadcn, one that got mentioned at the end of the featured article is Basecoat UI. The vibe is familiar (copy the component into your codebase, tweak it, ship it), but it is not trying to pull you into a React shaped world. It leans on CSS variables, Tailwind, and a CLI to grab the pieces you want, which makes it feel like a nice fit for full stack apps that render on the server, live in templates, or just want solid UI building blocks without adopting a whole runtime framework. I have not had a chance to use this one yet, but it seems quite well done. Could be especially interesting for a static website you want to keep simple and content-focused and doesn't need a full blown React frontend... Have you already seen it used in the wild? Browse Components

✨ Sponsored  A Shai Hulud Postmortem Story (Trigger.dev) — You might remember that a few issues ago we featured the terrible Shai Hulud supply chain worm. Here is the follow up I was hoping to see: not another high level recap, but a real postmortem from a developer team (also our sponsor) that actually got hit, then took the time to write down the whole story so the rest of us can learn from it. It walks through what happened, what got accessed, and exactly what they changed afterward. The value here is not fear. It is the practical checklist to keep you safe. You will come away wanting tighter CI boundaries, fewer long lived credentials, better dependency hygiene, and a much clearer answer to the question, “What happens if a token leaks? ...And while you are at it, you might just give Trigger a go. If you ever needed to build reliable multi step workflows (think payments, AI agents, image processing, web crawlers, etc), this looks like a genuinely strong option. I have been playing with AWS Lambda Durable Functions lately and Trigger feels like a more mature offering with a great DX and competitive pricing, so I think it is worth a look. There is also a generous FREE plan that should cover early experiments and a few small workflows. Read Postmortem and try Trigger

Extism — A few days ago I was working on implementing a spec for signing HTTP responses. Since I was in Rust mode, I ended up building a little Rust library for it. Then I hit the annoying part. The spec is still pretty new, I could not find many implementations (even in other languages), and I kept thinking, “How do I share this with other people without forcing them to adopt Rust?” That question is what led me to Extism. Extism is basically a practical way to ship logic across languages using WebAssembly. You compile your code once, then host it as a plugin inside apps written in all sorts of languages, with a tighter sandbox and a capability based surface so you are not handing out the keys to the kingdom. If you have ever wanted a plugin system, customer specific extensions, or a safe “bring your own logic” workflow, this feels like a really interesting foundation to explore. Check it out

Common Expression Language (CEL) — This one has a fun little origin story that ties nicely to the previous link. I was recently updating my open source OIDC Lambda authorizer and I wanted a clean way to let users express extra validation rules on the OIDC JSON Web Token without them having to fork the code. This comes up a lot in the real world. People want to validate custom claims, and once you open that door, it quickly becomes a “how do I support every weird check without hardcoding everything” problem. And it is a tricky problem. You want to support checks like “is this claim present,” “is it within a range,” “is it one of these allowed values,” and even arbitrary combinations using logical operators like AND and OR. You could let users write JavaScript or Python, but then you have to sandbox it, and you really do not want to slow down something as hot as auth that runs on basically every request. I could have used Extism, but that felt a bit heavy handed for this specific niche use case. That is when I discovered CEL (Common Expression Language). CEL gives you tiny, safe logic that is fast, portable, and intentionally constrained. The best part is it is available across most of the trending languages (yes, including Rust in my case), and it is surprisingly easy to integrate. Maybe my example is a bit too niche, but the same idea applies to much more generic problems too: think of a rule system for coupon eligibility in an e-commerce checkout, or a car rental pricing engine where discounts, surcharges, and eligibility constraints need to be expressed as composable rules. Also, if you want to learn it or just sanity check an expression, there is a nice little web playground. I had a lot of fun using this and I am sure I'll use it again in the future! Learn More

Node.js is getting a config file . (Almost) everyone has config file fatigue at this point. package.json, eslint, prettier, editorconfig, vite, workspace configs, and the list keeps growing. So yes, I was ready to roll my eyes when I heard Node.js is getting a dedicated config file. But hear me out, this one actually makes sense... a lot of sense! Last week I had the pleasure to attend the RomaJS meetup (great event, by the way. If you happen to be in Rome on the third Wednesday of the month, go say hi. Super friendly community). There, Marco Ippolito (of Amaro fame, the tool that powers the Node.js type-stripping feature) presented his work on the Node.js config file, and these slides are a great way to understand what is already possible today behind an experimental flag, and why this could be a genuinely nice quality of life upgrade for Node developers who are tired of juggling flags and environment variables. View Slides

SeqFlow JS . Yes, this is yet another JS frontend framework. But it is created by a friend of mine, which is by no means a badge of honour. Still, it was a great excuse to actually look at it properly, and I think there are a few ideas here that make it feel meaningfully different from the mainstream options. My personal favourite so far is how natural it feels to use async/await to express asynchronous UI constructs. Components are async functions, so you can render a “Loading…” state immediately, await work, then render again, without inventing a whole new mental model. If you are curious, the “why” page in the docs does a great job explaining the philosophy and what problem it is trying to solve. View Repo


đź“• Book of the week!

TypeScript Cookbook: Real World Type-Level Programming, by Stefan Baumgartner

TypeScript Cookbook: Real World Type-Level Programming

TypeScript is one of the most important tools for JavaScript developers. Still, even experienced developers wonder why the TypeScript compiler is throwing squiggly red lines at them. Enter TypeScript Cookbook. With this practical guide, author Stefan Baumgartner provides senior engineers with solutions for everyday TypeScript problems. If you're conversant with TypeScript as well as JavaScript basics, this book provides actionable recipes to help you tackle a wide array of issues. From setting up complex project structures to developing advanced helper types, each self-contained recipe guides you through the problem and discusses why and how a solution works. The ideal companion for your ongoing TypeScript journey, this cookbook helps you:

  • Dive into the inner workings of the TypeScript type system
  • Integrate TypeScript into a variety of projects
  • Craft advanced type definitions that allow for flexible scenarios
  • Create useful helper types that function across projects
  • Ensure readability along with type safety
  • Create robust APIs for helper types and their coworkers
  • Strongly type function signatures that rely on string types
  • Work around limitations of the standard library
  • Integrate TypeScript into advanced React projects

Buy on Amazon.com - Buy on Amazon.co.uk


More links. Fewer regrets. đź§ 

  • Open Props custom media recipes
  • Responsive hexagon grid using modern CSS
  • Understanding the fundamentals of CSS Layout
  • Faking a Fieldset Legend
  • How to write a good spec for AI agents
  • In The Beginning There Was Slop
  • robots.txt issues can get your site delisted
  • Responsive and Fluid Typography with Baseline CSS Features
  • EC2 loves Lambda - Lambda Managed Instances (AWS Bites podcast)

And we're done here! ✨

Another issue in the books! If anything caught your eye or you've got ideas to share, reply away – your input means the world! 🌍

Don't miss what's next. Subscribe to FullStack Bulletin:

Add a comment:

Share this email:
Share on Twitter Share on LinkedIn Share on Hacker News Share on Reddit Share on Mastodon Share on Bluesky
https://fullsta...
Powered by Buttondown, the easiest way to start and grow your newsletter.