Everything

All editions on a single page to make it easier to find things in lieu of a proper search. You can also browse previous editions by month in the archive.

🫐 August 2026

State of CSS 2026, declaring Node versions, framework and version control innovations

  • The 2026 State of CSS results are in. A few things that stood out to me: the second most popular CSS “framework” behind Tailwind is not using a framework at all, and both CSS-in-JS and pre-/post-processor use are in decline—a strong sign of CSS itself getting better. Also make sure to check out the features section, as always a great resource for features you may not know yet, or that are ready to adopt now.

  • What’s the easiest way of declaring Node and package manager versions in 2026? The answer varies by project type, but for application development the ecosystem seems to be aligning on devEngines.packageManager and devEngines.runtime. That’s especially convenient with pnpm, which picks the fields up and, depending on your settings, installs the correct versions of Node and itself automatically. The pnpm/setup action does the same in your pipeline, collapsing pnpm setup, Node installation, and dependency installation into a single step.

  • Stacked pull requests on GitHub are now in public preview: a new UI for merging pull requests into other pull requests, letting you break a big feature branch down into more manageable chunks. Personally, I’d still rather cut smaller slices that can be merged earlier, but this looks useful for when that isn’t possible.

  • Also in the version control space: the company behind Zed is launching a new product. Delta is an editor plus a new take on version control, optimized for collaborating with agents. Meanwhile, Cursor opened beta access to its Git hosting offering, Origin, and published an in-depth look at what it takes to host Git at any scale.

  • Updated guidance from Anthropic on using the latest generation of Claude models and Claude Code effectively: learn how to manage context, maximize the value of your sessions, and build verification loops with skills.

  • How do coding agents read your code? They grep their way around your codebase. There’s advice here on making relevant and related parts of the code easier to discover—which is great, because I also prefer grepping over complicated language intelligence features. A good example of how making code easier to understand for humans also benefits agents, and vice versa.

  • Stolen Thoughts is research showing how reasoning—the “thinking process” of an LLM that usually isn’t easily accessible—can be deciphered, with some surprising glimpses of what that actually looks like for different models, and of how it can be exploited to steal secrets. Well presented, too.

  • How Baseline can help you ship less JavaScript: a strategy, and plenty of practical examples, for using Baseline Availability to reduce dependencies and bundle size.

  • Node is working on a new documentation website. It’s still in beta, but I already prefer it to the old docs. Try it.

Notable releases:

  • Bun 1.4, the first release since the Rust rewrite, with a dizzying array of new features like remote control of web browsers, image and markdown APIs, a built-in React compiler, and tons of performance and Node compatibility improvements.

  • Claude Opus 5, claiming to double Opus 4.8’s score on Anthropic’s Frontier-Bench at a lower cost per task while keeping the same token pricing, with the biggest gains in agentic problem-solving and computer use.

  • Microlighter 2, a 2 KiB (compressed) syntax highlighter built on custom elements and the CSS Custom Highlight API.

  • Nuxt 4.5, getting ready for Nuxt 5 with various internal improvements, alongside more flexibility when rendering slots in layouts, stable error codes for better bug hunting, and a new enabled option for pausing reactive API requests until a certain condition is met.

  • pnpm 12 Release Candidate, yet another Rust rewrite, and adding project-aware global bins: global commands now follow the project you’re standing in, so running a tool from inside a project that asks for a different version gets you the version that project pins. Worth testing the RC now to ease the transition once the final release lands.

  • Solid 2 Release Candidate, packing a lot of innovations, above all making async a core part of the reactive system. Their metaframework SolidStart is being retired too, merged into a start mode in Solid’s Vite plugin.

  • SvelteKit 3 Release Candidate, simplifying config by reducing the number of required files and leaving things to Node where possible. Type-safe environment variables lose their experimental flag, and remote functions keep improving, though they’re still experimental.

  • Vue 3.6 Release Candidate, completing the feature set for vapor mode, an opt-in compilation mode that replaces the virtual DOM with direct DOM operations. Benchmarks put it on par with Solid and Svelte. The reactivity system also got a rewrite based on alien-signals, improving performance and memory use.

🍇 July 2026

ECMAScript 2026, revisiting best practices, TypeScript’s native port

  • The 2026 ECMAScript specification—the standard behind JavaScript—has been approved. Here’s what’s new, including more reliable Error detection, an upsert method for maps, and improvements to JSON serialization of non-primitive values.

  • The field-sizing CSS property is now Baseline Newly Available, allowing form elements to resize automatically based on their value.

  • Josh Comeau wrote an in-depth, interactive guide to anchor positioning, including strategies for supporting older browsers.

  • As someone who has a working knowledge of Docker but is by no means an expert, these five Docker best practices that are actually wrong held a few surprises for me and helped me make better sense of how we use Docker in our projects.

  • The shifting line between CSS states and JavaScript events: CSS keeps gaining pseudo-classes that react to user interaction without JavaScript, and a proposed event-trigger feature would bring event listening into CSS itself.

  • Bun has, to much controversy, been rewritten in Rust. Jarred Sumner, author of Bun, follows up with an explainer of why and how they did it. Claude Code apparently now ships with the Rust version of Bun. Time will tell how it works out, but in the meantime, it’s a good case study of a large-scale AI refactor.

  • Do we still need build tools? Still yes for now, but a useful breakdown of what they cover and where the gaps are starting to close.

  • Similarly, Lea Verou makes the case for keeping polyfills, with an interesting take on how web standards actually get made, and the role real-world experimentation plays in that.

  • Some interesting JavaScript trivia about NaN, the not-a-number number that isn’t NaN.

  • PGlite is a 3 MB embeddable Postgres database with reactivity and sync, running locally in the browser or in Node, Deno, and Bun.

  • ast-grep, a “fast, polyglot tool for structural code search, linting, and large-scale rewriting.”

Notable releases:

  • Claude Sonnet 5, the new version of my favorite coding model, with significant improvements over its predecessor, albeit at a higher cost due to a new tokenizer.

  • Deno 2.9, introducing a new desktop command for building desktop applications, along with faster startup time, built-in snapshot testing, and support for importing CSS files as constructable stylesheets.

  • GPT 5.6 Sol, Terra, and Luna, OpenAI’s new generation of models, promising “more intelligence from every token” and “stronger performance per dollar.”

  • mise 2026.7.4, stabilizing the bootstrap and dotfiles commands for setting up fresh machines.

  • Node 26.4 and 26.5, adding package maps and text imports.

  • npm 12, making many security-related breaking changes. See this overview.

  • Podman 6, modernizing networking, improving Podman machines, and offering better Docker compatibility.

  • TypeScript 7, the native port, which should vastly improve type-checking and compilation performance. Much of that depends on the ecosystem adopting the new version, though, which might take longer since the API will not be available until 7.1.

  • Vite 8.1, taking a new approach to bundling in the development server that should significantly improve performance, especially for larger projects.

  • Vite+ Beta, in their words: “stable, but not yet complete. We recommend adopting Vite+ if it covers the features you are looking for in a unified toolchain.”

  • Wordgard 0.1, a new rich-text editor by the author of the popular ProseMirror, incorporating insights from nine years of developing ProseMirror into a fresh start.

  • Zed, with multiple releases including improved Git history viewing and Telescope-style picker previews.

🦎 June 2026

Breaking changes in npm, updates to the web platform, laziness

  • Mozilla’s (formerly Google’s) Jake Archibald joins the Syntax podcast to discuss web standards, how they make their way into Firefox, and what else is coming to the web platform.

  • How to favicon in 2026: A practical guide on what you actually need to support all the different places where an icon might show up (tabs, home screens, bookmarks).

  • The next major version of npm, v12, will make some breaking changes to improve security. Similar to pnpm, it will disable the execution of install scripts and the resolution of Git dependencies by default.

  • A look at the fundamentals and developer experience of the upcoming CSS @function rule. It comes with some really interesting additions, but also quite a few gotchas.

  • What was Baseline Newly Available in May? Highlights include the :open CSS pseudo-class, container style queries, and name-only container queries.

  • Apple held its annual developer conference, and there were several web technology sessions at WWDC 2026 worth catching up on. Check them out to learn what’s coming to Safari with the new OS versions, including grid lanes, customizable selects, and more.

  • If you’re rebasing a branch and find yourself resolving the same conflict again and again, Git’s reuse recorded resolution (rerere) feature can make your life easier.

  • VoidZero is joining Cloudflare. While the tools (like Vite) will remain open source and community-driven, Cloudflare is likely to build a brand-new full-stack framework heavily optimized for agents.

  • Anders Hejlsberg—co-creator of TypeScript, C#, and Turbo Pascal—sits down with the Pragmatic Engineer podcast to talk about his career, language design, and the future of programming with AI.

  • Bryan Cantrill on the peril of laziness lost:

LLMs inherently lack the virtue of laziness. Work costs nothing to an LLM. LLMs do not feel a need to optimize for their own (or anyone’s) future time […] Left unchecked, LLMs will make systems larger, not better […] The best engineering is always borne of constraints, and the constraint of our time places limits on the cognitive load of the system that we’re willing to accept. This is what drives us to make the system simpler, despite its essential complexity.

Notable releases:

  • Apple Container 1.0, adding support for persistent Linux environments that integrate seamlessly with your local macOS setup.

  • Astro 6.4 and Astro 7, upgrading to Vite 8, switching to a new, faster compiler and markdown parser, making the markdown rendering pipeline more customizable, and stabilizing the new routing API.

  • Claude Fable 5, a new class of models from Anthropic, though they got shut down again in the meantime.

  • Homebrew 6, the popular package manager for macOS, shipping with better defaults, a new trust mechanism for 3rd-party taps, sandboxing on Linux, and plenty of improvements to bundles.

  • npm 11.16, adding initial opt-in support for the upcoming v12 breaking changes to help prepare for the transition.

  • pnpm/setup@1, a streamlined GitHub Action for setting up both pnpm and the JavaScript runtime in GitHub pipelines.

  • temporal-polyfill 1.0, going stable with tree shaking, shimming, reduced bundle size, and conformance with the latest version of the spec.

🪐 May 2026

Code maintainability analysis, browser engine quirks, Bun’s Rust rewrite

  • I recently switched the web version of these notes from Eleventy to Zola. Something about Eleventy’s recent rebrand doesn’t sit quite right with me. I’ve always found its documentation, data model, and use any templating language you want-approach a bit confusing, too. So I migrated to Zola—it’s well documented, easy to learn, fast, and comes with useful features: You can now subscribe to updates via RSS, and it opens the door for proper search in the future. I also gave the page a new look, please let me know how you like it and if you encounter any issues. 😊

  • Fallow, a static analysis tool that checks JavaScript and TypeScript codebases for dead code, unused exports, duplication, complexity, and other maintainability issues.

  • Best practices for publishing npm packages, including enforcing 2FA, configuring branch protection and trusted publishing, and a set of helpers for validating package.json and GitHub Actions workflows.

  • contrast-color, a CSS function for calculating accessible contrast for colors, is now Baseline Newly Available.

  • Round your calculated CSS measurements for more predictable alignment and better rendering across different types of screens.

  • Building a UI without breakpoints, using constraints instead, letting the browser derive the layout from component placement, screen size, and other factors.

  • The HTML description list element dl is used for representing name-value pairs—very common but not super straightforward to use. This article clarified it a lot for me.

  • Moving away from Tailwind, and learning to structure my CSS

  • Did you know that browsers treat big sites differently? And by browsers I mean everyone except Chrome, because when “Chrome ships a feature, developers use it because Chrome dominates the market, and other browsers scramble to either implement the feature or add site-specific quirks to paper over the difference. […] Chrome’s unspecified details become the de facto spec.”

  • Bun has been completely rewritten in Rust. What started as an experiment ended up as a 1-million LOC PR, merged to main after just 9 days. The move was criticized by many as irresponsible, rushed, and a publicity stunt for Bun-owner Anthropic. As a result, the first projects are dropping support for Bun. Meanwhile, Deno released version 2.8—after losing a significant portion of its staff earlier this year. 2.8 features better Node compatibility, and defaults to npm as its package registry. Developments in both don’t exactly inspire confidence; I recommend sticking with Node.

Notable releases:

  • Astro 6.3, previewing a new, advanced request handling pipeline allowing more control over redirects, middleware, caching, and more.

  • GPT 5.5, claiming better results when used for agentic coding compared to its predecessor, while consuming fewer tokens.

  • Lucide 1.0, my favorite open source icon library, reaching stable with improved documentation, accessibility, and integrations for vanilla JS and all major frameworks.

  • pnpm 11 & 11.1, stabilizing the security improvements already teased in last month’s release candidate, and adding support for registry aliases such as gh:.

  • Tailwind 4.3, expanding their color palette, adding support for default values in custom utilities, plus utilities for scrollbars, zoom, container size queries, and more.

  • Node 26, enabling the Temporal API and adding Map.prototype.getOrInsert. It will enter long-term support in October.

  • Rolldown 1.0, the high-performance Rollup-compatible bundler that powers Vite 8.

  • Zed 1.0, not changing much, but celebrating it’s stable and ready for daily use. While it does have some rough edges, it has become my main editor for its simplicity, performance, design, and a Vim mode that I like better than Vim itself.

🐣 April 2026

Claude Code unpacked, what’s new in JavaScript, CSS scroll state queries

  • The Claude Code source was leaked and it’s… something. You can visually explore its architecture at Claude Code Unpacked, with links to the code if you want to dig deeper. What struck me most: Claude Code is 500,000 lines of code! 🐳 You can make a good case that something much simpler would also do the trick.

  • On that note, the fundamental mechanics of coding agents aren’t all that complicated. Turns out you can build your own in under 400 lines of code!

  • MDN published an extensive write-up of their new frontend architecture, which they refactored from React to web components built with Lit. The most interesting part: how they got web components to render on the server—historically one of the biggest pain points. Spoiler: the solution involved Declarative Shadow DOM and a helper from Lit.

  • The three pillars of JavaScript bloat explain why node_modules and JavaScript bundles are so infamously large and tangled. Shoutout also to the incredible e18e (Ecosystem Performance) project, which has been quietly making the JavaScript ecosystem better for everyone.

  • What to know in JavaScript in 2026—a solid rundown of the most important new APIs and the current state of the most relevant tools and frameworks. Good catch-up read if you haven’t been following.

  • Similarly: 10 new CSS and HTML APIs, most notably a new experimental API for rendering HTML inside a canvas (enabling all kinds of new visual effects), plus plenty of smaller, lesser-known additions.

  • CSS scroll state queries make it easy to apply styles based on scroll state. Great for floating elements like navigation bars! Chrome-only for now, but degrades gracefully.

  • What is CSS containment and how can I use it? Containment lets you give the browser hints about which elements are independent, reducing the work it needs to do during rendering and painting. It’s a bit tricky to get right, but can improve your page’s performance.

  • Mise, the increasingly popular tool manager, environment manager, and task runner, now has experimental sandboxing for tasks.

  • Martin Fowler on AI, how it will change software engineering, and other topics—including refactoring and the state of agile.

  • Some small things I discovered this month that made my life easier:

    • Git Subtrees, a simpler alternative to submodules
    • git rebase --autostash for rebasing when the worktree has uncommitted changes
    • basename to extract a folder or file name from a full path
    • gh browse to jump from the terminal to various things on GitHub (e.g. a specific file)
    • gh run download to download artifacts from pipeline runs

Notable releases:

  • Claude Code Desktop, with a redesigned UI.

  • Claude Opus 4.7, iterating on its predecessor’s strengths—notably tool use and image recognition—though it’s drawn criticism for excessive token use and higher cost.

  • Git 2.54, adding a new history command for editing commit messages and splitting commits without rebasing, plus a configuration-based format for hooks.

  • Next.js 16.2, addressing long-standing vendor lock-in concerns with a new Adapters API that makes deploying to platforms other than Vercel more straightforward.

  • pnpm 11 Release Candidate, tightening security defaults, distancing itself further from npm, and adding pnpm sbom for vulnerability scanning.

  • VS Code Agents, a new companion app to VS Code optimized for working with multiple agents.

  • Zed 0.233.5, also introducing a new UI for orchestrating agents.

🌱 March 2026

Vite+, accessible custom keyboard focus, agentic engineering patterns

  • Vite+, the “unified toolchain for the web”, has been released in alpha—fully MIT-licensed and open source 🎉 Vite+ combines linting, formatting, testing, bundling, Node version management, package management, and more in a single CLI. Still early days, but this is likely to become the tool for web development soon.

  • Roving Tabindex is a pattern for implementing custom focus by smartly setting tabindex, and letting the browser handle the rest.

  • Lately I’ve been relying heavily on bookmarklets to test things on websites by manipulating font sizes, zoom levels, and highlighting elements. Here’s a guide for creating your own.

  • setHTML and the Trusted Types API, two recent additions to the web platform that aim to make handling untrusted inputs more secure, reducing the risk of XSS attacks.

  • When I last checked TanStack, it was a router and async state management library for React. Since then, they’ve added many libraries, including tables, forms, databases, and virtual lists—many of which support multiple frameworks beyond just React. They’re even building their own metaframework!

  • OpenCode is my preferred way of using AI for coding. If you’re not familiar with it, here’s an in-depth tutorial.

  • Agentic engineering patterns, a collection of best practices for getting the best results out of coding agents. I found Writing code is cheap now and Red/green TDD to be particularly insightful.

  • Coding in the Red-Queen Era, a reflection on balancing productivity, learning, and thinking when using AI for coding—and which skills continue to be valuable.

  • Opus 4.5 Changed Everything

Notable releases:

  • Astro 6, shipping the Font API, and stabilizing Content Security Policy support, alongside other DX improvements.

  • Ghostty 1.3, implementing some long-requested features such as search, drag & drop for split views, and improvements to scrolling, notifications, keybindings, and updating.

  • Java 26, focused on reliability and performance, with some iterations on preview features, and preparations “to make final mean final.”

  • npm 11, improving security by introducing a minimumReleaseAge setting and a flag to disable Git dependencies.

  • Nuxt 4.4, with improved APIs for custom fetch handlers, better typing of layouts, useAnnouncer for better screenreader support of dynamic page sections, build profiling, and much more.

  • Safari 26.4, adding support for CSS Grid Lanes, name-only container queries, and a long list of fixes and compatibility improvements.

  • TypeScript 6, released in beta last month, is now stable, bringing numerous default changes and deprecations to prepare for the full Go-rewrite of TypeScript in v7.

  • Vite 8, replacing esbuild and Rollup with a faster, unified bundler during both development and production; as well as integrated devtools and built-in support for tsconfig paths.

🧘‍♀️ February 2026

Interop 2026, framework design for AI, keyboard shortcuts

Notable releases:

  • Deno Deploy, now generally available, seems like a good platform to host prototypes and small projects with its simple setup, free database + key value store, and sandboxing.

  • ESLint 10, dropping support for Node versions <24 and .eslintrc, and introducing a new algorithm for looking up configuration files.

  • npmx, an alternative npm registry frontend for exploring dependencies, vulnerabilities, and comparing packages.

  • Oxfmt Beta, the code formatter by the Vite team, achieving 100% Prettier compatibility up to 30x faster, with built-in support for Tailwind class sorting and import organization.

  • TypeScript 6 Beta, introducing a number of breaking changes and deprecations aimed at promoting better defaults and modern code.

🦕 January 2026

The web in 2025 and beyond, pre-commit hooks, accessibility checks

Pre-commit hooks are a fundamentally broken idea. Code does not exist in isolation. Commits that are local to a developer machine do not ever go through CI. Commits don’t even necessarily mean that that the code is ready to publish. […] More than that, pre-commit hooks are preventing you from saving your work. There should be a really, really good reason to prevent you from saving your work, and IMO “doesn’t pass the test suite” is not that.

🎅🏻 December 2025

CSS Wrapped, parsing and validating, newly supported web standards

Shotgun parsing is a programming antipattern whereby parsing and input-validating code is mixed with and spread across processing code. […] Shotgun parsing necessarily deprives the program of the ability to reject invalid input instead of processing it.

Notable releases:

🚴‍♂️ November 2025

Date pickers, designing URLs, rotting software

Notable releases:

🎃 October 2025

Making progress, CSS colors, lots of releases

  • Something that’s been on my mind recently is the idea that there are no shortcuts if you want to make progress as an engineer—or at anything in life, really—in the long term. You can vibe code or copy from Stack Overflow if you want, and it might make you productive for a while. But at the end of the day, there is no substitute for putting in the work: reading the docs, asking questions, being curious, and digging until you really understand it. It’s not always fun or exciting, but it works. I like this analogy to magic tricks:

The only “trick” is that this preparation seems so boring, so impossibly tedious, that when we see the effect we can’t imagine that anyone would do something so tedious just for this simple effect. […] I often have people newer to the tech industry ask me for secrets to success. There aren’t many, really, but this secret—being willing to do something so terrifically tedious that it appears to be magic—works in tech too.

  • Use the HTML output tag to represent “the result of a calculation performed by the application, or the result of a user action,” and get assistive technology support for free 🎉

  • CSS colors have come a long way! Do you know what oklch, relative color, and light-dark do? Or that there’s a better alternative to rgba? Catch up on these topics and many others with the Pragmatic Guide to Modern CSS Colors.

  • In TypeScript, the Extract<Type, Union> type is a utility that pulls out from a union type only those members that are assignable to another specified type. Useful for narrowing types! It’s similar to Pick<Type, Keys>, except that it works on the shape of a member instead of its property name.

  • ESLint is preparing for another major release, expected to land in early 2026. v10 will drop support for Node 20 and the legacy .eslintrc config format. If you’re still using them, consider upgrading soon.

  • AI Coding Sucks is your permission to ignore the AI hype for a while. Conveniently, VS Code now allows you to disable AI-related functionality with a single setting.

  • Vite+, the Vite team’s vision of a Go-style all-in-one toolchain for building, testing, linting, and formatting JavaScript projects, is available in early access. It will be a commercial product, albeit “source-available” and with a “generous free tier.” It remains to be seen what that means for licensing and using it in our projects 🤔

  • A first look at Remix v3, the successor to… Remix, which is now React Router 🤷‍♂️. There are some interesting approaches here, as well as some I find baffling—such as getting rid of reactivity and relying on a manual call to this.update() instead. Watch the full demo at Remix Jam for more details.

  • Overtype, a lightweight Markdown editor component. Had to include it because I 100% subscribe to their guiding principle: “Built with the radical idea that sometimes dumb ideas work.” 💯

  • If you automate the setup of macOS, you’ll appreciate this thorough guide for changing macOS user preferences via the command line.

Notable releases:

💨 September 2025

Supply-chain security, platform APIs, evil package managers

In light of the recent supply-chain attacks in the npm and Node world (this one and that one), we’re starting with some food for thought about protecting ourselves from malicious dependencies. Obsidian’s philosophy of Less is safer is the best collection of measures to mitigate the risk of successful supply-chain attacks I’ve seen so far. In short:

  • Avoid dependencies if possible
  • Re-implement or vendor small to medium dependencies (if licensing allows)
  • Update large dependencies only periodically after careful manual review
  • Block postinstall scripts
  • Pin dependencies to patch versions
  • Install strictly what’s in the lockfile (npm ci)
  • Delay updates, as malicious packages are usually detected within hours.

This sounds reasonable to me. Yet it’s also quite different from our current practice of mostly immediate, mostly automated updates. Interested in hearing your thoughts 🧠

It can also be tricky to avoid dependencies. In Norms, for example, we have very few client-side dependencies. But our toolchain for linting, formatting, and testing is pretty complex. I don’t see how we can reduce that by much without compromising code quality and consistency. This is one of the reasons I’m excited about Vite+, the Vite team’s attempt at replacing the zoo of linters, formatters, test runners, etc. with a unified toolchain. We’ll learn more at this year’s ViteConf!


  • Are package managers evil? An interesting argument against automating dependency management in the first place. I tend to agree. In fact I have started vendoring stuff manually for small, personal projects. But as mentioned above, I don’t have good ideas for making this practical for bigger projects that involve many people.

  • A good way of reducing dependencies is using features that the platform already offers. Did you know the browser has an internationalization API? Among other things, you can use it for formatting dates, relative time, and numbers. Similarly, the Temporal API already works in Firefox and can be polyfilled in other browsers, removing the need to use dayjs or similar libraries. The browser also has APIs for client-side form validation that can get you pretty far for many basic use cases.

  • In my recent post about Tailwind I argued that CSS is much more dynamic than it used to be. If you had no idea what I was talking about, here are some good examples: subgrid & container queries change how we can create layouts, and a new approach to container and wrapper classes.

  • What if AI doesn’t get much better than this?

  • The Progressive Complexity Manifesto lays out a useful mental model for thinking about server-side rendering and client-side interactivity beyond the static vs. single-page app binary.

  • tldr is a project to make man pages more approachable by giving you the most important ways of running commands in an easy to read format. You can use their client to run it in your terminal or try it on the web.

  • The new Apple OSes have been released and with them the (controversial) liquid glass design. Be that as it may, people have attempted to recreate it on the web. Always love to see that type of experimentation! Wouldn’t be required though if we had access to Apple’s private CSS property that enables the effect.

  • New Apple OSes also come with a new major version of Safari. Recently they’ve been packed with features, and this year is no different. Among others, anchor positioning, scroll-driven animations, and SVG favicons are now supported in Safari, which should get them closer to Baseline availability.

  • Java 25 has been released with some nice quality of life features such as more flexible constructors, top-level main methods, and a new way to import things.

⛵️ August 2025

State of CSS, debugging Java in VS Code, building software quickly

  • The results of the State of CSS 2025 survey are out. The usual caveats about diversity of respondents etc. apply. Still a good read to find out how people are writing CSS nowadays, and which new features and trends to keep an eye on. The main takeaway:

It’s clear that CSS is no longer “just” a styling language. It has made a fundamental shift in direction, taking on a larger role when it comes to layouts, motion, compatibility, and of course, accessibility. This shift helps redefine CSS’s identity not as a legacy styling language, but as a modern, expressive toolset that is finally getting the recognition it deserves.

  • For a while, I have dreaded debugging Java with VS Code because I assumed it would be very complicated to set up. Turns out it’s really quite simple, and even works for more involved projects with Gradle and Spring Boot (like Normen). My mission to replace IntelliJ with VS Code is now complete 🎉 (everything else is still pretty much the same as I reported last time).

  • SmolCSS, a collection of “minimal snippets for modern CSS layouts and components”.

  • A while ago, we learned that TypeScript is being rewritten in Go, promising much better performance. Now the roadmap is becoming more concrete: TypeScript v6 is going to be a transition release, introducing a few deprecations and smaller changes in behavior. v7 will be the rewritten version.

  • “How I build software quickly”: spoiler—it only involves a small amount of AI, and lots of setting expectations, iterating, and negotiating requirements.

  • The latest beta of Vitest adds support for visual regression testing via the toMatchScreenshot assertion.

  • You can use Git Worktrees to check out more than one branch at a time. Think of it like cloning the repository multiple times, except that everything will be shared, so it’s faster and consumes less disk space. VS Code recently has added support for Worktrees, too.

  • The Zed team is hosting Agentic Engineering, a series of events on making software with AI. While I’m still struggling to find a good workflow for myself personally, their principles sound reasonable to me, and the conversations are interesting.

  • Type stripping in Node is now enabled by default from version 22.18.0 onwards. That means we can now run TypeScript directly without any additional configuration! Two caveats: TSX, as well as TypeScript in dependencies, are not supported.

  • GitHub’s CEO has resigned. As a result, GitHub, which is owned by Microsoft but has so far operated as an independent organization, is now part of the Core AI team at Microsoft. Will be interesting to see how that’s going to shape GitHub going forward. Interesting discussion on Hacker News, too.

🌞 July 2025

JSNation 2025, JSON modules, CSS if()

  • I’ve heard many good things about JSNation 2025. Recordings of their talks are now available online. My recommendations:

  • Besides the talk he gave at JSNation, Alex Russel also attended React Summit, and reflects about the differences on his blog:

Near as I can tell, the schedule of React Summit mirrors the content of other recent and pending React conferences in that these are not engineering conferences; they are marketing events. […] Conferences crystallise consensus about which problems matter, and React Summit succeeded in projecting a clear perspective—namely that it’s time to party like it’s 2013.

  • Vapor mode, a Svelte-like compiler for Vue components that promises dramatically improved performance, has been merged into Vue core and should land as a preview with the next release.

  • Nuxt is joining Vercel. Part of me is slightly nervous about Vercel “owning” so many frameworks (Next, Nuxt, Svelte). But for the Nuxt team it’s a good chance to secure funding, Nuxt UI will be available for free, and Svelte seems to be doing just fine. So I’m cautiously optimistic 🤞

  • The CookieStore API, a more modern and ergonomic API for handling cookies, is now available in all browsers.

  • JavaScript now natively supports importing JSON as modules. If you’re wondering about the funky syntax, those are called import attributes (and there are more to come).

  • CSS is getting an if() function. While I can see how this might be useful, I’m not sold on the syntax. It looks kinda messy, especially if you have more than one rule in a class using it. Early days for now, but this will be coming to all browsers eventually.

  • Experimenting with no-build Web Applications as a reminder that the plethora of tools we use in web development are there to solve specific issues, and not actually required. Always a good idea to be conscious about which dependencies we bring into our projects and why.

  • Syntax discussing the different browsers and rendering engines that we have in 2025.

  • Need a quick favicon?

  • HTTP Cats 😻

Notable releases:

  • Deno 2.4, bringing back bundling for frontend and backend code.

  • Edit, “a simple text editor for simple needs”, e.g. when you need to edit stuff in the terminal but can’t be bothered with Vim.

  • Git 2.50—can’t say I really understand all of the updates here, but merging now uses a different algorithm that is a lot faster, so I’ll take it.

  • Nuxt 4, Vue’s meta-framework, with various stability- and quality-of-life-related updates. Appreciate their approach to releases: “In general, we aim for a hype-free approach to releases.”

  • Oxlint 1.0, a fast and easy to use linter from the Vite team. Keeping a close eye on this one because it seems to be the best candidate for replacing ESLint eventually 👀

  • Prettier 3.6, coming with a new, experimental CLI that promises to be much faster.

  • Vite 7, again with performance and stability improvements, as well as changing the default browser target to Baseline Widely Available. Is browserslist still a thing at this point?

🏝️ June 2025

AI skepticism, Safari 26, Remix waking up

  • My AI skeptic friends are all nuts: As an AI-skeptic myself, this post gave me some food for thought. I played around with agent mode and Claude 4 in Zed the other day, and that much I can say already: it’s absolutely a different Hausnummer than Copilot clumsily autocompleting my code a few months ago.

  • During WWDC, Apple announced a bunch of features coming to Safari 19 26. My personal favorites: anchor positioning, scroll-driven animations, and the URLPattern API. You can find the full list on the WebKit blog.

  • VS Code now shows the Baseline support status of CSS features. It is also getting an official PostgreSQL extension for building and exploring databases that integrates with Copilot.

  • In the latest episode of React: Tag und Nacht, Remix, the popular React-framework that has recently been merged into React Router, “woke up” to be an entirely different framework based on a fork of Preact. The community is… not excited (Reddit, HN). My personal take: their stated principles sound promising, and I appreciate the experimentation. But I don’t trust the authors to keep this stable for long enough that it would be a good foundation for any project that intends to be around for a while. Thoughts?

  • Last month I mentioned that Firefox has shipped the new Temporal API. If you haven’t heard about it before, here’s a good overview of what it does.

  • Ever wondered why some types of collections support forEach but not other array methods such as map? That’s because they implement the iterator protocol, which so far hasn’t supported anything else. Fortunately, that has now changed: Iterator helpers have become Baseline Newly Available

  • gum is a neat little tool if you write shell scripts but also want ✨fancy✨

  • Invoker commands are a declarative way for showing popups, dialogs, and more. You can also register your own commands! This should make handling many common interactions in web UIs simpler. Chrome-only for now, but all other major browsers are actively working on implementing the spec.

  • Inner peace 😌

Notable releases:

  • Angular 20 continues to modernize and improve the framework with signals, reworking their rendering model, improved template syntax, and more. I haven’t worked with Angular in years, but it looks like they’re busy fixing all the things I didn’t like about it back then. Definitely keeping an eye on it!

  • es-toolkit, a popular alternative to lodash, is now 100% lodash compatible.

  • JSPM 4, a different take on package management for the frontend that builds on web standards. I haven’t tried it yet, but I’m intrigued.

  • You can now try Rolldown Vite, the next generation of Vite with a completely rewritten bundler.

  • Storybook 9, with huge improvements in bundle size and installed dependencies, along with better testing tools. They offer a migration tool that worked flawlessly for RIS UI. Here’s an interview with one of the engineers if you want to hear more.

🌳 May 2025

Dotfiles, new JavaScript APIs, Generators

  • I recently set up a new computer and was reminded how great dotfiles are. Feel free to share yours 😊 One thing I already learned from @Christian is that you can configure many macOS settings from the terminal!

  • Shellcheck is a linter for shell scripts that helps you write more robust scripts and avoid common mistakes.

  • New JavaScript APIs that might make your life easier:

    • RegExp.escape: escapes potential regex syntax characters in a string
    • Error.isError: checks if something is an error without weird edge cases
    • Array.with: copies an array and replaces an item at an index in one go (handy for immutable state updates)
    • Promise.withResolvers: more convenient and modern syntax for creating promises
  • Do we still need CSS pre- and post-processors? I don’t think so. I would go as far as saying that I would at least consider not using Tailwind either when starting a new project. Plain CSS, light component-level encapsulation (like Vue’s scoping), and some conventions like CUBE seems more appealing to me than dependencies and breaking changes at this point.

  • React Server Confusion formulates some fair criticism of React server components. Fun fact: the first and only time I touched them was my coding assignment for DS. But from my limited experience, this rings true:

The issue is the tradeoffs involved in making it work. It leaks into, or even demands control over layers that are previously not in scope for client-side frameworks. This creates heavy complexity […] React team made a bet that they can work with Next team to polish the DX to the extent that the benefit would essentially be free […]. IMO, that bet has failed.

  • “I think the ergonomics of generators is growing on me”—same here, though I rarely use them. This is a good read if you’re curious about iterators and generators.

  • After @Dennis recommendation last month, I’ve started using Zed and enjoy it! It’s fast, looks great, and easy to get used to when coming from VS Code. It finds a good balance between supporting AI features but not shoving them in your face. I particularly like the Vim mode, which has many Vim features but aligns better with my expectations for a modern text editor.

  • Some people are saying Deno is in decline. Deno, naturally, disagrees. The discussion around it is instructive, because it highlights Deno’s capabilities and community expectations vs. the company’s goals. Personally, I’ve switched back to Node + npm, which have improved a lot thanks to competition from other runtimes.

  • Check if a number is even with the power of ✨AI✨

🐰 April 2025

State of Vue, visual effects in CSS, Temporal API

Starting with insights from the State of Vue 2025 report: beyond the usual popularity surveys (Vue continues to thrive) the report includes case studies, core team interviews, and some stats I hadn’t seen before:

  • Most Vue developers have 4+ years of experience with the framework, and nearly all would choose it again for future projects—says something about the quality to have such a loyal community ✨
  • Single page applications remain the dominant architecture in the Vue ecosystem, despite recent industry shifts away from SPAs. The Vue team is aware of that and say they have no intentions to become opinionated about servers or otherwise changing their scope.
  • No plans for a V4 or breaking changes. Instead, the Vue team is focusing on performance improvements and stability through internal refactoring, as well as vapor mode.

Other things that caught my attention:

  • Experimenting with visual effects in CSS: I love the animated gradient in the footer of the Rocycle website, so I “view source”-ed a bit to learn how it’s implemented. Turns out it’s quite simple: It combines a canvas, two colorful circles and some clever math for a very nice visual effect. I re-created it using CSS, which was a great opportunity to play with some modern CSS features such as @property, sin(), and container queries, in addition to web components and Alpine.js. It only takes 1/4th of the code of the original canvas-based implementation—a great reminder of how powerful CSS has become. You can find the result on GitHub if you’re curious. Please be gentle with the demo, I did not try very hard to make it robust 😬

  • Looks like Chrome won’t be removing 3rd party cookies after all.

  • Some food for thought: The skill of the future is not ‘AI’, but ‘Focus’ (interesting discussion on HN, too)

  • TAC (tags, attributes, classes), a CSS methodology that relies on custom tags and attributes for almost all the styling. I like the idea because it looks clean and more component-y.

  • Continuing with cool CSS-based visuals, over-engineering frosted glass is one of my favorite UI styles, and these CSS-only blurred image placeholders blow my mind 🤯

  • A negative animation delay will start the animation at the point as if that time has already passed, e.g. an animation of 2s with a delay of -1s starts the animation at 50%. Useful if you have multiple of the same animation on one page and don’t want them all to be in sync.

  • The Node util promisify turns functions that take callbacks into nice modern promises.

  • Eyecons is an icon pack for VS Code that automatically adapts to your color scheme.

  • Kill the newsletter, a free service that converts email newsletters into RSS feeds.

  • Firefox is the first browser to ship the new Temporal API (a.k.a Date but good). Still a long way to go before this will be usable, but great to see some progress.

🪻 March 2025

Interop, customizable select, vanilla JS date formatting

  • Interop 2025 is the yearly initiative by the major browser vendors to make various new or existing features of the web platform work consistently everywhere. Among other things, this year we’re getting anchor positioning and view transitions 🎉

  • Did you know you can reorder commits during interactive rebase by simply reordering the lines in the editor?

  • The customizable select is stable in Chrome! No timeline on implementation in Firefox or WebKit yet, but since it degrades gracefully, we should be able to cautiously use it already today.

  • Design mode: setting document.designMode = "on" via the console will make any page editable. Useful for quickly testing text manipulations, removing stuff and other small edits.

  • Here’s a little cheatsheet for formatting dates with vanilla JavaScript.

  • Node has added utilities for coloring console logs. Another instance of a thing people commonly installed libraries for being moved to the platform. Did you know you can style console logs in the browser using CSS, too?

  • Tailwind Play: there is a fully functioning Tailwind distribution that can be included in a script tag without any build steps. Probably not what you’d want in a production app, but might be useful for prototypes or small projects.

  • ESLint is iterating their new config format, including adding a defineConfig helper to get better TypeScript support. Confusingly they’re also re-introducing extends, supposedly one of the worst sources of complexity and a major reason for developing the new format in the first place. Another round on the frontend treadmill I guess. As with anything ESLint does, it made me wonder if Biome or Oxlint have become viable alternatives in the meantime. They don’t seem to be there just yet, but progress has been made.

  • Corepack will be removed from Node: if you know what Corepack is, this is good to know. If the word Corepack doesn’t mean anything to you, there’s no reason to find out anymore 😄

  • Next.js has been getting some bad press lately, including reports on horrible performance outside of Vercel and other vendor lock-in, along with a really bad security flaw that they apparently also handled poorly. Luckily for us we don’t use Next.js anyawy (as far as I’m aware 🤔). So we can add this to the list of reasons to keep it that way.

  • A talk about software quality and simplicity (or lack thereof) with lots of fascinating examples about technology knowledge that has been lost over time: Preventing the Collapse of Civilization

  • I was looking for a new system to organize my notes and came across Johnny Decimal, which looked interesting and indeed quite organized. I ended up in the other extreme, dumping everything into One Big Text File instead. Let me know if personal knowledge management and productivity are interesting to you—would love to chat! C&C maybe? ☕️

🤧 February 2025

Java without IntelliJ, CLI tools

Since I wasn’t in the mood to read a lot of newsletters I wanted to share something else I’ve been tinkering with: finding a good setup for programming Java that doesn’t suck rely on IntelliJ 😇

As we touched on this topic at the Delivery Offsite last year I thought this might be interesting to some of you. If it’s not relevant for you, you might still find some of the tools I mention valuable for other things.

Enjoy! And feel free to leave feedback if you found this helpful. 😊


First, if you’re happy with IntelliJ, great! This might not be for you, and I’m not trying to convince you otherwise. But I prefer to work in a specific way and am apparently too set in my ways to change:

  • I prefer lightweight, responsive tools and can’t stand loading spinners or laggy UIs
  • I favor small, focused tools over the kitchensink
  • I like being “close to the metal” and understanding what’s happening under the hood
  • I want sensible defaults with minimal or no configuration
  • I prefer dumb and simple for the most part: console.log > debuggers, string find + replace > refactoring

For frontend development, this means using VS Code for editing and a terminal with various CLIs for everything else (running tests, version control, …). This approach is common in the frontend world. However, in the Java ecosystem, IntelliJ seems the default choice. Other options are less obvious. After some experimentation though, here’s my setup:

  • Editing & Autocompletions: VS Code with two extensions: Language Support for Java by Red Hat and Spring Boot Tools. These provide autocompletions, inline error messages, auto imports, and decent refactoring out of the box, without bloating VS Code with tons of extensions like some of the Java extension packs.

  • Keeping dependencies up to date: ./gradlew build --refresh-dependencies

  • Watch Mode Development: Such a normal thing in the frontend world, but surprisingly tricky in Java:

    • ./gradlew build --continuous -x <loooooong list of tasks to exclude>: Recompiles on changes (exclude tests and other checks for speed)
    • ./gradlew bootRun --continuous: Restarts the app when build succeeds
    • Combined, these approximate something like vite dev, but slower 🤷‍♂️
  • Test Watch Mode:

    • ./gradlew test --continuous (no build needed!)
    • --tests "*.MyPackage": Runs only specified package tests
    • -i: Provides verbose output with stack traces
    • HTML reports are written to build/reports/tests/. Combine with npx servor --reload for readable, auto-refreshing test output in the browser ✨
  • Helpful Tools:

    • Ghostty: My preferred terminal
    • Just: Simplifies long commands or combines frequently used command sequences. As you saw, there are quite a few of these in this approach!
    • Servor: Minimalist static file server
    • Lazygit: For when you need to do more complicated stuff than push, pull, commit -am
    • tmux: For running multiple commands in split view (like continuous build + boot)
  • Debugging: Don’t know yet… still reluctantly reaching for IntelliJ when needed (only if I can’t get there with tests and console logs though)

  • Database Access: Previously I used IntelliJ’s database tools. I know DBeaver, it’s ugly though 😭 Open to recommendations!

☃️ January 2025

Complexity, State of JS, Vue 3.6 sneak-peek

Since it’s still the beginning of the year—and I’m a New Year’s resolutions person—I wanted to start with a reflection. Over the past few years, and especially in 2024, the web platform has evolved dramatically. CSS, in particular, feels almost unrecognizable compared to not so long ago. Features that once required tons of code or additional build tools are now built right into the platform, often as simple one-liners: dialogs, popovers, previously impossible transitions, CSS nesting, and so much more.

To me, this is the perfect time to strip away some of the many layers of abstraction we’ve accumulated—complex build setups, frameworks, and libraries—and get closer to the metal of the web platform again. I want to write simpler, more resilient code and focus on knowledge that remains broadly applicable. That includes a renewed interest in Svelte, which, despite being a compiled framework, aligns closely with the spirit of the web. I also want to dive deeper into new APIs like Temporal and techniques like view transitions.

Because as someone said at a conference I attended last year:

Frameworks come and go, but the web platform and its APIs are knowledge you can rely on for decades.


  • Speaking of new APIs and techniques, the results of the State of JS 2024 survey have been published—as always a great source for finding out about the latest trends and developments in the JavaScript world.

  • Another interesting source is the JavaScript Rising Stars report, which watches and categorizes new libraries, frameworks, and apps based on their GitHub stars.

  • Evan You, creator of Vue, shared an update on Vue 3.6 at Vue.js Nation 2025 (his talk starts at 17 minutes). Vue 3.6 will feature another massive performance boost in the reactivity APIs thanks to alien signals 👽. It will also include a first version of the much-anticipated vapor mode, which works similar to Svelte or Solid.js and should also result in vastly better performance and smaller bundle size.

  • Pinia, Vue’s recommended state management solution, has now has a data fetching plugin for making working with APIs easier.

  • Tailwind v4 has been released with many interesting, but unfortunately also breaking changes: new configuration formats, faster compiler, no more PostCSS requirement,… I tried to upgrade one of our projects the other day, but looks like it’s going to require some work…

  • Ghostty is the new trendy terminal emulator. I have been using it as my main terminal for a few weeks now and love how snappy it is, and how well it integrates with whatever platform you’re using.

  • Svelte 5 has been released (a while ago actually, but I didn’t pay attention). It’s a complete rewrite and fixed many of the things that I thought were weird in previous versions. Hopefully I’ll find the time to give it a try soon! If you’re feeling the same, here is a tutorial.

  • We usually think of web components as a replacement for React/Vue/… components. But here’s a clever pattern for using them for progressive enhancement instead: HTML Web Components

  • Old but gold: What is the event loop and how does it work?

  • JavaScript classes can have a static initialization block that is run as soon as the class is parsed. Not sure what to use that for but somehow it feels like it could be handy.

🎄 December 2024

CSS Wrapped, impossible animations, custom selects

  • CSS Wrapped 2024! A great rundown of the latest changes in CSS, including things that are widely available, things that will soon be available, and some things that are currently Chrome-only experiments.

  • Animating the (previously) impossible with CSS: You can use @starting-style in combination with transition: allow-discrete to animate to and from display: none or dialog[open]. Soon it will also be possible to animate height: auto!

  • CSS now has built-in virtualization, a performance optimization for long lists or complex pages that used to be very annoying to implement: content-visibility

  • Soon finally possible: Complex customization of the browser-native select component. Currently in Chrome Canary, but expected to be widely supported some time in 2025. Check out this demo to get an idea what to expect. Love to see it! The part about backwards compatibility blew my mind. All the details and a request for feedback are here.

  • With all those new features, how do you know what you can already use? Besides the always great Can I use?, there’s now the Web Platform Status Dashboard that specifically tracks new additions to the platform and alignment efforts between browsers. Best served 🍳 with polyfills, @supports and strategies like graceful degradation (remember the select?) so you can start using most of these already today.

  • Here’s a little trick that allows you to make pretty callout boxes with Markdown on GitHub.

  • I haven’t watched it yet but here is a talk about hexagonal architecture apparently by the guy who invented it? Sounds interesting!

  • Speaking of GitHub: not new but also not very well known—press . in any repository on GitHub or change the domain of the URL from .com to .dev to open the repository in an in-browser VS Code. Great for browsing codebases! If you use settings sync, you can even use your extensions, theme, and other settings. Try it!

  • Some inspiration for “how to go beyond surface level skills and really dive deep on a topic”.

  • The Hype Around Signals: Good explanation of the idea behind “fine-grained reactivity”, i.e. the UI rendering pattern that almost all frameworks—except React—are using.

  • Excited about Tailwind 4 already? It’s now in beta. Here’s a deep dive with one of the authors about the new features. (Fair warning: not very structured so you might find yourself skipping quite a bit, but I still found it interesting.)

  • Most of the 2024 web almanac is now available: “a comprehensive report on the state of the web, backed by real data and trusted web experts. The 2024 edition is comprised of 21 chapters spanning aspects of page content, user experience, publishing, and distribution.”

  • Vite 6 has been released and it’s at the same time rather boring and a huge update. Boring because almost nothing changes for end users (yay!). Huge because it has tons of internal refactoring and improvements, most notably the experimental environment API. This will enable frameworks that build on top of Vite (such as Nuxt, Remix, and SvelteKit) to provide better DX.

  • I refer to this all the time, so too this month. Exports in JavaScript are tricky: export default thing is different to export { thing as default }

🍄‍🟫 November 2024

State of CSS, gradient blur, text fragments

  • State of CSS & HTML 2024: The results of the yearly CSS and HTML surveys are out! These are always great to learn about new APIs and tools that are picking up pace. Especially CSS has been on a run recently: ‘Let me make a prediction: we’ll look back at 2024 as the turning point between “CSS Classic” and “New CSS”.’ Agreed!

  • This neat gradient blur effect in a few lines of CSS, combining mask + backdrop-filter: Codepen

  • Center stuff in a single line of CSS? Now finally possible with align-content: center; 🎉

  • Text fragments allow you to link to a specific piece of text on a page and highlight it. It’s similar to #, except that this is a browser feature and does not require the website to implement anything. Try it!

  • Lefthook, the Git hooks manager we use in many projects, can also be used for general tasks outside of Git hooks. Might be handy to unify commands across different stacks and setups! It also supports local overrides.

  • Vue Dev Tools are getting a huge update (urgently needed tbh). Interestingly it’s in the form of a Vite plugin, not a browser extension, meaning they can be embedded directly on the page. Should be great for debugging across browsers and devices.

  • Promise.try: This new API offers an alternative to try/catch. Nothing you couldn’t do before but can help you write more compact or uniform code in some situations. Browser support is currently limited, but should be available everywhere soon.

  • System things: Did you know you can use system colors like Canvas and LinkText in CSS? Not incredibly fancy, but adapts automatically to the user’s system and preferences (like dark mode and contrast). I created a small page where you can see all of them. Related: This list of font stacks that work without downloading additional fonts.

  • If I got you excited about symbols last time, here is a great explainer: Exploring JavaScript symbols

  • Love this idea: Using static websites for tiny archives

  • macOS has a built-in internet speed test that you can run from the terminal: networkQuality, along with some other helpful tools.

🍁 October 2024

CSS colors, symbols, no-op template literals

  • If you need a tagged template literal in JavaScript that does nothing, you can use string.raw. Why would you do that, you wonder? Because if you write something like this in your code: html`<div></div>` many editors will highlight it as HTML, and Prettier will format it as HTML. Great e.g. for stories in Storybook or inline-components in unit tests.

  • CSS colors received some updates. The other day I played around with OKLCH and color-mix. OKLCH is an alternative to RGB/HSL with the interesting property that the perceived brightness stays the same with different hues. For example in HSL, blue will look darker than yellow when both have the same lightness. In OKLCH, they will be perceived to be the same lightness. Combine that with color-mix and you can easily generate entire color palettes just in CSS! Here is a playground for OKLCH and here is an article with more information.

  • Need a random UUID? This used to be something people would install a package for. Nowadays there’s native support for this: randomUUID

  • Symbols are actually pretty cool, I never really used them but turns out there are well-known symbols, which you can define on objects to tell the JavaScript runtime how to iterate over the object, what to return when checking with instanceof, and other things. Also did you know that if an object has a toJSON() method, that method will be called when the object is passed to JSON.stringify 🤯

  • With WebKit now supporting view transitions, this new feature is available in all major browsers. Rather cutting edge still, but degrades gracefully so time to start looking into it in case you need/want some fancy transitions.

  • Hono apparently is “the newest scream” 😅 in JS-based web servers because it’s fast, lightweight, modular, built on web standards, has an intuitive API, and works in all runtimes. I tried it and it is indeed very nice, will keep that in my mind if I ever need a quick, simple server.

  • Very early stages, but Node can now cache compiled JS byte code, which should lead to significant performance gains for CLI tools and short-lived processes. Fun fact: a lot of what makes JS execution on websites fast is that when the browser compiles the JS to bytecode, the result is cached and doesn’t need to be compiled again unless the bundle changed. Node only used to to that per process, and since many processes are short lived (e.g. run a CLI command) you never really get to benefit from that caching. This flag tries to change that.

  • Speaking of performance: With the latest Node versions, you can use node --run <some-npm-task> instead of npm run <some-npm-task>. This too should be a lot faster because Node launches immediately, rather than Node launching npm launching Node…