There's no place like Chrome

Issue #447.December 9, 2025.2 Minute read.
Bytes

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

Welcome to #447.


Eyeballs logo

The Main Thing

A priest in church on a hoverboard

Preaching the gospel of the platform in 2025

There’s no place like Chrome

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 Commandscommandfor 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.


QA Wolf logo

Our Friends
(With Benefits)

Grinch smiling mischievously

When you realize AI can do the worst part of your job

Just launched: an AI that builds surprisingly complex tests for you

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:

  • Mapping Agents explore your app and learn every surface
  • Automation agents write and run deterministic tests
  • Maintenance Agents debug failures and suggest fixes

Join early access to try it out – and see why Doordash, OpenAI, and hundreds of other teams already trust QA Wolf.


Spot the Bug logo

Spot the Bug

Sponsored by Datadog

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;
}

Cool Bits logo

Cool Bits

  1. 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.

  2. 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.

  3. 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]

  4. Cassidoo Williams has been participating in the technical blogvent calendar for blogmas, just like the ancient Gregorian monks who came before her.

  5. Oxlint’s type-aware linting has reached alpha status, so type-aware rules can now be manually configured, disabled with comments, and fixed automatically.

  6. 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]

  7. 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.

  8. 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.

  9. 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]

  10. 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.

  11. Valibot 1.2 comes with powerful transformation actions for type coercion, new metadata features to improve AI tool integration, and more.

  12. 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.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Datadog

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 🙃.