Agustin Barrientos
All posts

The Brief #26.41 · Chrome 155, JPEG XL, Gemini 4 Argon's score, and Pi 1.0

Want more of these in your Google results?

A lot happened this week.

I became a Google Developer Expert in Web Technologies!

Gemini 4 Argon tied GPT-6 Astra and Claude Fable 5.1 on Artificial Analysis’ Intelligence Index, Chrome 155 is out with margin-trim and JPEG XL, and Firefox 158 adds JPEG XL on October 13.

Then there’s what’s coming in Chrome 156 and 157, more decision models, Pi 1.0, news from Antigravity and Claude Code, OpenAI’s text watermarks, Cloudflare’s AI toll and private Quick Tunnels, and Lottie export in Figma Motion.

Gemini 4 Argon’s score

Artificial Analysis scored Gemini 4 Argon on September 30, the same day Google announced it. I covered the announcement in last week’s Brief, but it was too early for the result.

Argon scored 53 at high effort, the highest setting it has (Gemini models don’t have a “Max” setting). That ties it with GPT-6 Astra and Claude Fable 5.1 at max effort. According to Artificial Analysis, the tie puts Google back among the top three labs on its Intelligence Index.

Argon came first on AutomationBench-AA with 78%, about 6 points ahead of Claude Sonnet 5.5. In that test, a model has to finish business tasks in copies of apps like Gmail and Slack by calling their APIs.

AA-Omniscience is a test with 6,000 factual questions. While doing it, Argon had a hallucination rate of only 15%. That’s the lowest of any model scoring 45 or more on the Intelligence Index. For comparison, GPT-6 Astra had 51% and GPT-6.1 Sol 54%. Artificial Analysis says the low rate means Argon is much more likely to skip a question it can’t answer than to guess wrong.

At Google’s introductory price, a task cost $1.99, 61% of GPT-6 Astra’s $3.26. This is an introductory price, though.

Argon used way more tokens than GPT-6 Astra, about 62,000 output tokens per task against 27,000, but Google charges less per token. At standard prices, a task would cost $3.98. Google hasn’t said when the introductory price ends.

Developers can’t use Argon yet, but Google plans to open it to them “as soon as possible”. There is still no date.

Table Intelligence Index
#ModelIntelligence IndexCost per Index task
1Claude Opus 5.5 (max)58$5.98
2Claude Sonnet 5.5 (max)56$7.67
3Claude Opus 5.5 (high)54$1.82
4Claude Fable 5.1 (max)53$7.63
5GPT-6 Astra (max)53$3.26
6Gemini 4 Argon (high)New53$1.99
7GPT-6.1 Sol (max)52$0.72
8Claude Fable 5.1 (high)51$3.91
9Muse Spark 1.3 (max)48$1.60
10Grok 4.7 (xhigh)46$3.74
These scores come from Artificial Analysis’ Intelligence Index, which averages results from ten tough tests for each model.

I’m a Google Developer Expert

I became a Google Developer Expert in Web Technologies. The title is for developers outside Google who teach other developers about its technologies, through things like talks and articles. Google reviews the title once a year, based on what you keep contributing.

GDEs also give feedback to Google’s product teams before the products are released to the public.

This also means that I’ll be giving in-person talks more often, hopefully somewhere near you. If you want to invite me, connect with me on LinkedIn and send me a message!

Chrome 155

Chrome 155 is out with a bunch of new CSS and JavaScript features.

One of them is margin-trim. That property is used on cards and other boxes with padding.

The space at the top and bottom of a card usually ends up bigger than its padding, because browsers give headings and paragraphs a top and bottom margin by default. Inside the card, the first child’s top margin and the last child’s bottom margin get added to the padding.

This would usually require you to set different inline (usually left, right) and block (usually top, bottom) paddings to compensate, which was imprecise.

With margin-trim: block on the card, the browser drops those two margins and only the padding is left. It works on regular block boxes and on multi-column layouts, but not on flex or grid containers.

The orange areas are the margins, colored the way DevTools paints them when you inspect an element.

Safari has supported margin-trim since version 16.4, but Firefox doesn’t have it yet. Cards there keep their margins and look the way they do today.

Browser supportmargin-trim15% of users
Chrome155
Edge155
FirefoxNo
Safari16.4
Safari iOS16.4
Chrome Android155

Browser data updated September 24, 2026

For lists, symbols() lets you write a custom marker right where you use it, without a named @counter-style rule. list-style: symbols( symbolic '*' ); marks a list of footnotes with *, **, ***, and so on. Firefox already supports it.

text-decoration-skip-spaces: all makes the browser draw a link’s underline under its words and leave the spaces between them blank. Neither Firefox nor Safari has it.

With the initial value, start end, the browser skips only the spaces at the start and end of a line.

JavaScript modules can now import a text file as a string, the way they import JSON.

js
import terms from './terms.txt' with { type: 'text' };

Before, you’d load the file with fetch() and wait for it after your code started running. An import loads the file along with the module and resolves a relative path like ./terms.txt from the module’s file, instead of the page’s address. Firefox has supported text imports since version 153, and Safari hasn’t shipped them.

A video inside an iframe keeps playing its sound after you hide the iframe, for example in a tab panel with display: none. Version 155 gives you a way to stop that. With allow="media-playback-while-not-visible 'none'" on the <iframe>, the browser pauses the iframe’s audio while it has display: none, visibility: hidden, or no width or height. This is perfect for user experience.

Version 155 also adds post-quantum algorithms to Web Crypto, the cryptography API built into browsers. They’re designed to stay secure even against future quantum computers.

JPEG XL in Chrome and Firefox

Starting with version 155, Chrome displays JPEG XL images by default. Firefox 158 lists it in its beta release notes and comes out on October 13. Safari added it in version 17, back in 2023.

That means all three should show JPEG XL by mid-October.

In Chrome’s announcement, Google says JPEG XL compresses images 30 to 50% better than JPEG. Mozilla says JPEG XL usually makes smaller files than WebP, JPEG, PNG, and GIF, and that it’s designed to replace them.

I wrote in August about why Chrome and Mozilla decided to ship it.

You can serve JPEG XL today with a <picture> element, where each browser takes the first format it supports and falls back to the <img> inside it.

html
<picture>
	<source srcset="team-photo.jxl" type="image/jxl">
	<img src="team-photo.jpg" alt="Five people around a whiteboard">
</picture>

If you don’t want to use JPEG XL yet, you could use AVIF: another modern image format that all three browsers support too.

Each one serves a different purpose. Mozilla found that AVIF made smaller photos at the quality most sites use, and JPEG XL made smaller files for images that have to keep every pixel exactly, like screenshots. Google recommends trying both formats, and expects JPEG XL to help most with high-quality or lossless compression, especially for photos.

Coming soon to Chrome

Chrome 156 has been in beta since September 30 and comes out on October 20. That’s only two weeks after 155. This is expected, given that Chrome and Firefox now release a new version every two weeks.

One of the new CSS features in 156 is random(), a function that returns a random value in a range you give it. For example, on dots with position: absolute, top: random( 0%, 100% ); and left: random( 0%, 100% ); scatter them around their container without any JavaScript. Safari shipped it earlier.

A table inside a box that scrolls sideways can’t keep its header row stuck to the top of the page, because CSS treats a box that scrolls in one direction as a scroller in the other direction too. overflow: scroll clip in 156 limits the box to sideways scrolling, and a sticky header can then follow the page’s scroll.

syntax and inherits used to be required in @property rules, but Chrome 156 lets you leave them out. Without syntax, the property accepts any value, and without inherits, it inherits, like a plain custom property.

And if a dynamic import() fails, for example on a bad connection, Chrome tries the download again the next time your code calls it. It used to cache the failure, and later calls failed right away. Firefox and Safari already download the module again on the next call.

HTML-in-canvas got its approval on September 30 to ship in Chrome 157 on November 3.

Anything drawn on a <canvas> is just pixels, with no text to select and nothing a keyboard or a screen reader can reach. HTML-in-canvas draws real elements into the canvas, like a form or a paragraph of styled text. Those elements stay in the page as HTML, which keeps them reachable by keyboard and screen readers.

The API is a bit different from the one I wrote about in July, so I’ll update the article.

Chrome will be the only browser with it on November 3, and the change that adds it to the HTML standard is still under review. In the July article, I built a version that works in any browser first and added HTML-in-canvas on top where the browser supports it.

The day after I covered the CSS corner shorthands in last week’s Brief, Chrome turned them off, because the code behind them followed an older version of the syntax. They moved to 157, one version later. The corner-top-left: 20px squircle; example I used follows the current syntax.

Version 157 also starts an origin trial for Overscroll Areas on desktop, running through version 162. An origin trial lets a site turn on an unfinished feature for its visitors, with a token the site gets by signing up.

Overscroll Areas is for drawer menus, the kind that slides in from the edge of the screen when you swipe past it or tap a menu button. You build one with HTML attributes and CSS properties instead of JavaScript, and you have to add a button. The button gives keyboard and screen reader users a way to open the same menu.

Browsers without Overscroll Areas show the menu as part of the normal content, and the Open UI proposal describes a popover fallback for them.

More decision models

On October 1, Chrome’s built-in AI team announced it’s starting to build a Decisions API, for running a decision model inside the browser, on the user’s device, without connecting to external sites!

I explained decision models two weeks ago with TypeSafe AI’s Jev. Jev and models like it take some text and a question with its possible answers, and return one of those answers, with a probability for each. They don’t write text.

In Chrome, you’d reach the API through window.DecisionModel. You’d set up your questions and their options once, with DecisionModel.create(). Then decide() would take whatever the user typed. The team’s goal is an answer in tens or low hundreds of milliseconds on a typical laptop, with nothing sent to a server.

Google’s proposal has examples like a hotel site turning “dog-friendly hotel downtown that won’t break the bank” into its search filters, or an editor’s command menu matching “let my coworkers view this file” to its share command.

js
const palette = await DecisionModel.create( {
	context: 'Document editor command palette',
	questions: [ {
		id: 'command',
		type: 'choice',
		prompt: "Which command best fulfills the user's goal?",
		options: [
			{ label: 'export_pdf', description: 'Download or save the document as a PDF' },
			{ label: 'share_link', description: 'Invite collaborators or copy a sharing link' },
		],
	} ],
} );

const { command } = await palette.decide( 'let my coworkers view this file' );
// command.label is 'share_link', with a confidence like 0.93

Nobody can use the API yet. Google estimates a first version in Chrome 157 behind a flag (an experimental setting you turn on yourself at chrome://flags/#decisions-api) and calls the proposal an early design sketch.

You can already do something similar in the browser with Google’s MediaPipe. Its Decision Maker task answers the same kind of questions as Jev, using a model like Google’s EmbeddingGemma 2, released on October 6.

Why are they building a new API instead of using MediaPipe then?

Each site that uses MediaPipe loads its own copy of the model, which means users download it again for each of them. With Chrome’s API, the browser would download one model and share it with every site.

Chrome’s Decisions API shares its name with the OpenAI Decisions API I covered last week, but OpenAI’s is a cloud service, and Chrome’s would run in the browser.

OpenAI opened its Decisions API to all developers on October 6 in public beta. It runs on gpt-6-luna, and it costs $0.10 per million input tokens, and it’s free for output.

Cloudflare also released two decision models, Clef and Clef-flash, on October 1.

Pi 1.0

Earendil shipped Pi 1.0 on October 1. Pi is a coding agent for the terminal, like Gemini CLI or Claude Code, but it’s minimal on purpose.

It comes without features like plan mode and subagents (helper agents that a main agent starts for one part of the job), and you add what you need with extensions, or you ask Pi to build them for you.

Pi is open source under the MIT license and works with models from more than 15 providers, Google included. Earendil says hundreds of thousands of people use it weekly.

Antigravity and Claude

Google’s Antigravity released version 2.19.1 on September 30, which lets you message a subagent directly, without going through the main agent.

Anthropic added mods to Claude Code on October 1.

Mods are small TypeScript functions that change how Claude Code works, in the CLI and in the desktop app. A mod can rewrite a prompt before Claude Code sends it to the model, block or retry a tool call, approve or deny a permission request, or remove secrets from a tool’s output. It can add buttons and panes to the interface too.

Mods come inside plugins, so you install them like any other plugin. Anthropic says mods aren’t sandboxed, which means a mod you install can do anything on your computer that Claude Code itself can do. Anthropic’s advice is to install mods only from sources you trust.

Text watermarks from OpenAI

On October 5, OpenAI let API customers turn on an invisible watermark for the text its models write. The company says the reason is the EU AI Act, which requires AI providers to mark generated text in a way software can detect. The setting is off by default for customers anywhere in the world.

OpenAI plans to add the watermark to ChatGPT and Codex text in the EU over the coming weeks, on all plans. Outside the EU, ChatGPT and Codex won’t get it by default.

The watermark is a hidden pattern in the words themselves, and OpenAI calls it textGrain. When a model writes, every next word is a random draw from the likely options, and textGrain uses a secret key to change the odds of those draws. A detector with that key can later check whether a passage follows the pattern more often than chance would. According to OpenAI’s help article, the watermark doesn’t add hidden characters or invisible spaces. Anthropic announced a similar watermark for Claude two months ago.

In the API, you turn it on for your whole organization in Organization settings, under Data controls and Text provenance, or for one project in its Project Settings. Either way, you pick which of the supported models get it.

The detector isn’t public, but researchers and expert organizations can apply to use it. The watermark setting doesn’t give you access to it.

For its tests, OpenAI tuned the detector to wrongly flag unmarked text 1% of the time. It found the watermark in about 80% of 200-token passages and about 95% of 400-token ones on topics like psychology, and much less often in math, where there are fewer ways to word an answer.

Another test used 400-token passages with some of the words swapped for synonyms. Detection dropped from about 92% to 66% with 10% of the words swapped, and to 17% with 25%.

OpenAI notes that the EU’s rules don’t require a watermark in code or in answers under 200 tokens, about 150 words.

Cloudflare’s AI toll and privacy setting

Cloudflare opened two betas on September 30 that let site owners charge AI companies and AI agents for what they use.

Pay Per Use lets an AI company offer a price for a specific use of your pages, like quoting them in an AI search answer. Then you accept or decline the offers in the Cloudflare dashboard. The AI company reports the uses itself, and the program’s terms require complete reports.

Cloudflare checks the reported uses against the sites that accepted the offer. It bills the AI company and pays you monthly.

In 2025, Cloudflare launched Pay Per Crawl to charge AI companies for crawling a page, while Pay Per Use charges for what they do with it afterwards. During the beta, Cloudflare works directly with the AI companies and the sites that opt in.

The Monetization Gateway is in closed beta and charges AI agents per request, for things like APIs and datasets. It uses the 402 Payment Required status code.

When an agent requests something with a price, Cloudflare responds with a 402 and the payment instructions. The agent signs a payment and gets the response once the payment settles, with no checkout page or separate payment API.

The payments use an open protocol for paying over HTTP called x402. They settle on the Base blockchain in USDC, a cryptocurrency tied to the U.S. dollar. The beta is open to eligible U.S.-based sellers and buyers, who apply in the dashboard.

Cloudflare’s examples include API2PDF, whose API turns HTML into PDFs. Requests to it without an API key get a 402. An agent can pay for that one request without creating an account.

On October 2, Cloudflare added email protection to Quick Tunnels.

A Quick Tunnel gives a server on your computer a public link at a random trycloudflare.com address. It takes one command in Cloudflare’s cloudflared command-line tool.

Quick Tunnels exist for sharing what you’re building on your computer. For example, if you were coding a local project and wanted to send it to a colleague, or test it on different devices that were not connected, you would use this approach, but anyone with the link could open one, not only you or your colleagues.

Starting with cloudflared 2026.9.3, the --allowed-mail flag limits the link to the email addresses or domains you list.

sh
cloudflared tunnel --url http://localhost:5173 --allowed-mail you@example.com

Visitors enter their email address and a one-time code sent to that address. The feature is free! And neither you nor your visitors need a Cloudflare account.

The company suggests adding When you start a Quick Tunnel, always add --allowed-mail me@example.com. to your coding agent’s instructions file, like AGENTS.md.

Lottie export in Figma Motion

Figma added Lottie and dotLottie export to Figma Motion on September 30.

Motion lets you animate designs on a timeline inside a Figma file. It’s in open beta on every plan, but exports larger than 1920x1080 or faster than 30 frames per second need a paid plan.

Lottie is an animation format saved as JSON. Instead of finished frames like a video, the file describes the shapes and how they move. A Lottie player in your page or app draws the animation from that data in real time.

The export gives you either a plain Lottie file with one animation in it or a dotLottie file, a compressed archive that bundles one or more animations with their images and fonts. Lottie keeps every part of the animation as data you can change in code. Figma’s examples include changing the colors without going back to the design, changing the speed, playing one part on a click, and tying the animation to real data, like a progress bar that follows the actual loading percentage.

Not everything in Motion makes it into a Lottie file. Figma exports shaders (small scripts that create visual effects) and angular gradients as flat images and leaves videos out. Effects like drop shadows, noise, and glass keep the look they have in the first frame.

Want more of these in your Google results?