
Today’s issue: JavaScript cryptids, “not smart enough for Rust,” and the undeniable beauty of fixed-width.
Welcome to #447.


Preaching the gospel of the platform in 2025
The Chrome team just released CSS Wrapped 2025, which is a lot like Spotify Wrapped – but instead of revealing that you’re still a late-2000s indie sad boi who can’t stop listening to Paramore, it shows off all the new CSS and UI features that landed in Chrome this year.
And there’s a lot. The team shipped 22 new features in 2025, and most of them are genuinely useful and interesting. All killer, no filler.
Here’s a quick look at our top 5:
Customizable <select> – A new appearance: base-select property lets you fully style native HTML <select> dropdowns with CSS. This lets you customize the select button, the dropdown list, and the options (even with HTML content and <selectedcontent>).
Native CSS carousels and scroll navigations – ::scroll-button() and ::scroll-marker() let you build functional, accessible slideshows and carousels with pure CSS + HTML. The browser automatically generates “previous/next” buttons (scroll buttons), handles enabling/disabling when you reach the ends, and supports all the keyboard and accessibility semantics.
Invoker Commands – commandfor and command="show-modal" allow buttons to declaratively control dialogs and popovers, without JavaScript or event listeners.
shape() for fancy clipping – The new shape() function lets you define responsive clipping paths in pure CSS for more complex, responsive shapes in CSS. It also plays nicely with custom properties, so you can animate the control points and build “CSS blob” avatars and other funky stuff without needing to mess with SVGs.
if() statements in CSS – Lets you write ternary-style conditionals right in your properties, like flex-direction: if(media(orientation: landscape): row; else: column); instead of juggling a bunch of tiny @media blocks for one rule. Hallelujah.
Bottom Line: I know you think that music peaked when Arcade Fire released Neon Bible in 2007 – but thankfully, CSS keeps getting better and better.


When you realize AI can do the worst part of your job
Now you can prompt the brand new QA Wolf AI to test anything you want, like “verify login works” – and it builds production-grade Playwright & Appium tests for you 🤯.
And unlike other AI tools, it can handle the deepest, most complex parts of your app without flaking, because it breaks each step into deterministic code with specialized agents:
Join early access to try it out – and see why Doordash, OpenAI, and hundreds of other teams already trust QA Wolf.

They created this The Front-end Developer Kit with a best practices guide for front-end testing strategies, a solutions brief showing how to catch and resolve issues proactively, and more.
function shouldAlert(durationInWarehouse, temperature) {
const CRITICAL_TEMPERATURE = 30; // °C
const SECONDARY_TEMPERATURE = 25; // °C
const CRITICAL_DURATION = 7; // Days
return temperature > CRITICAL_TEMPERATURE
&& durationInWarehouse > CRITICAL_DURATION
|| temperature > SECONDARY_TEMPERATURE;
}

TanStack AI (alpha) promises to be a framework-agnostic AI toolkit for developers who want full control of their stack. It comes with server support across multiple languages, adapters for all the LLM providers, and more. Because you can’t spell, “I am Lord Voldemort TanStack” without AI.
Our very own Lynn Fisher just released her annual personal site update, and you’ve never seen a tiny, fixed-width website this beautiful in your life.
AppSignal gives you logs, metrics, traces, and all the observability tools you need – without the enterprise price tag. Built for dev teams, not Fortune 500s. [sponsored]
Cassidoo Williams has been participating in the technical blogvent calendar for blogmas, just like the ancient Gregorian monks who came before her.
Oxlint’s type-aware linting has reached alpha status, so type-aware rules can now be manually configured, disabled with comments, and fixed automatically.
Auth0 for AI Agents is now Generally Available (GA)! You can now securely connect your AI agents to apps and data, control critical actions that agents can perform plus the data they can access, and enable human in the loop confirmation for agent actions. It includes the guardrails you need to empower your AI agent, in one single place. [sponsored]
Francis Bouvier shared why his team built Lightpanda in Zig. TLDR: “we’re not smart enough for C++ or Rust” (their words). 10/10 for honesty.
Giles Thomas wrote about training a base model from scratch on an RTX 3090, which is part 28 of his “Writing an LLM from scratch” series. Thank goodness for people who don’t have hobbies.
Sergiy Dybskiy wrote on the Sentry blog about Eliminating N+1 Queries with Seer’s automated root cause analysis feature. What’s an N+1 Query, you ask? It’s a performance problem where your app makes a bunch of unnecessary database queries in a loop, which can be very painful to fix – until now. Thanks Sergiy. [sponsored]
Andrew Nesbitt wrote a nice, cheery article called GitHub Actions has a package manager, and it might be the worst. I guess that explains why $MSFT has been down this month.
Valibot 1.2 comes with powerful transformation actions for type coercion, new metadata features to improve AI tool integration, and more.
Erik Thorsell published his take on why estimates are the bane of every dev team’s life. That’s true, although the current bane of my team’s life is the cryptid that lives in our office parking garage and follows us to our cars at night.
console.log(shouldAlert(5, 26)); // true (should be false)
console.log(shouldAlert(8, 26)); // true
console.log(shouldAlert(8, 32)); // true
In JavaScript, && has higher precedence than ||, so the expression is grouped as
(A && B) || C even though JavaScript still evaluates left-to-right.
That grouping means the final || C part gets applied more broadly than intended, causing the true result.
function shouldAlert(durationInWarehouse, temperature) {
const CRITICAL_TEMPERATURE = 30; // °C
const SECONDARY_TEMPERATURE = 25; // °C
const CRITICAL_DURATION = 7; // Days
return temperature > CRITICAL_TEMPERATURE
|| (
durationInWarehouse > CRITICAL_DURATION
&& temperature > SECONDARY_TEMPERATURE
);
}
Or you can just avoid ternaries altogether and spare your teammates and your future self pain by using a proper if/else statement 🙃.