
One year at Hugging Face 🤗
A year ago I joined the WebAI team at Hugging Face to work on Transformers.js with Joshua Lochner. It's been the most intense and rewarding year of my career so far. Here's what we built:
I love exploring new technologies, testing ideas and seeing what the browser can do. This is where those experiments end up, alongside articles, videos, podcast appearances and everything else I share along the way.

A year ago I joined the WebAI team at Hugging Face to work on Transformers.js with Joshua Lochner. It's been the most intense and rewarding year of my career so far. Here's what we built:


open-jev is a browser-focused TypeScript library for typed decisions: one piece of text (the state) plus any number of typed questions go in, and one forward pass returns a calibrated probability distribution per question. Nothing is generated, so an answer is always one of the options you provided.

Transformers.js v4.3 is out, and the big one is structured output. With the new @huggingface/transformers-structured-output package you can force a model to follow an exact JSON Schema or regex, directly in the browser. No more parsing markdown fences and hoping the model picked the right property names. In this video I walk through how constrained decoding works, how the new package hooks into the logits processor in Transformers.js, and the technical story behind it: from a WASM wrapper around llguidance to a pure JavaScript implementation with almost no overhead. Also in 4.3: a complete overhaul of the documentation pipeline and a bunch of community-contributed fixes and features. Thank you!

Nico Martin, open source ML engineer at Hugging Face, talks with Mike Grabowski on React Universe On Air about Transformers.js, WebGPU, browser agents and Hugging Face's upcoming WebGPU inference engine.

all open source on the Hugging Face Hub, plus @huggingface/kernels, a library that loads, validates, renders and runs them for you. This video walks through how it works: what an op is vs a kernel, why WGSL, and why we ship Jinja templates instead of fixed WGSL files. The browser picks the data types and workgroup sizes your device supports and builds the fastest kernel for that hardware. Then two demos built on top of it: an attention mechanism with the tinyBERT weights in ~20 lines of JavaScript, and a 1M+ cell wave animation driven by a single matmul kernel, capped only by requestAnimationFrame. Finally, Fleet: run the kernel benchmarks on your own GPU. The results help us optimize the kernels for the thousands of devices we can't test ourselves.
One of our biggest goals on the WebAI team at Hugging Face is to make browser inference as fast and as user-friendly as possible. Getting there is a multi-layer effort: models need browser-friendly representations, runtimes need to build efficient execution plans, and the individual GPU operations at the bottom of the stack need to make the most of many different devices and browser implementations.

I built a research agent that runs entirely in the browser and puts its full think, plan, and act loop on display. Give it a question and it: - Creates an explicit action plan - Reasons about the next step - Chooses and calls tools - Inspects each result - Updates the plan and repeats It does not stop after one tool call. The agent keeps looping until every step in the plan is complete. Along the way, it can ask clarifying questions, use local context, delegate focused research to an isolated Wikipedia subagent, and collect sources. Once the plan is done, it turns the evidence into a cited response and downloadable research paper. The incredible part is the size: just 2.6B parameters. That makes LFM2.5 seriously fast on-device with WebGPU, while still being capable enough to plan, reason, use tools, and finish multi-step objectives. The model, agent loop, and inference pipeline all run locally. No inference server, no account, and prompts and outputs stay in the browser. Small models are not just autocomplete. They can be agents at the edge.


In dieser Folge begrüßen wir einen alten Bekannten in der programmier.bar: Nico Martin, Machine Learning Engineer bei Hugging Face und gern gesehener Podcast-Gast und programmier.con-Speaker.



Die Google I/O ist für viele Entwickler:innen vor allem durch ihre Ankündigungen bekannt – doch wie fühlt sich die Konferenz eigentlich vor Ort an? Darüber sprechen Jan und Dennis mit Nico Martin, der in diesem Jahr nach Mountain View gereist ist. Nico berichtet von seinen Eindrücken auf dem weitläufigen Google-Gelände, den großen Keynotes und den zahlreichen Möglichkeiten, direkt mit den Teams hinter Chrome, Gemini und anderen Google-Produkten ins Gespräch zu kommen. Natürlich geht es auch um die großen Themen der diesjährigen Google I/O. Die Runde diskutiert die aktuellen Gemini-Ankündigungen, den hohen Produktionsaufwand hinter den Keynotes und die Frage, wie viel davon wirklich neu war. Besonders spannend waren für Nico die Produkt-Demos vor Ort, darunter die neue Google-Brille, die er selbst ausprobieren konnte. Außerdem werfen Jan, Dennis und Nico einen Blick auf die Rolle von Entwickler:innenkonferenzen im Allgemeinen. Sie vergleichen die Google I/O mit Formaten wie der Google Cloud Next und den lokalen Google I/O Connect Events und diskutieren, für wen sich ein Besuch lohnt.

Transformers.js brings state-of-the-art machine learning to JavaScriprt. In this intro, I explain the mental model behind Transformers.js: tensors, neural networks, ONNX, quantization, model loading, preprocessing, postprocessing, and the pipeline() API. We also look at what happens under the hood for text-generation and depth-estimation, and why one high-level API can support many different AI tasks.



This week, I spoke with Nico Martin, open source ML engineer at Hugging Face working on Transformers.js, and a Google Developer Expert in AI and web technology. Nico's path is unusual — he studied to become a teacher, worked as a ski instructor and a windsurf instructor, taught himself web development by building sites for friends, and went freelance for years before joining Hugging Face about six months ago. The role pulls together his obsession with progressive web apps, on-device AI, and Transformers.js — a library he was already building demos with before version one even shipped. In this episode, we cover how Transformers.js actually runs models in the browser, what an ML model really is under the hood, how tokenizers and quantization work, why ONNX matters as a runtime-agnostic standard, where WebGPU fits next to WebAssembly, and what the Prompt API in Chrome means for the future of in-browser LLMs.

An on-device AI assistant that runs entirely in your browser using WebGPU and Transformers.js. This Chrome extension provides an intelligent agent that can understand natural language commands and interact with your browser through a set of specialized tools.
An article I wrote about how to build a Chrome extension with on-device AI using Transformers.js and Gemma 4, covering Manifest V3 architecture, model loading in service workers, and building an agentic tool-calling loop.

Transformers.js v4 is out!

A modern AI assistant web application featuring voice interaction, real-time conversation, and MCP (Model Context Protocol) server integration.
Beyond happy to announce that I'm joining 🤗 Hugging Face as a Machine Learning Engineer focused on WebML!

Lange war es still um PWAs, doch jetzt ist das Thema Progressive Web Apps gerade aktueller denn je: Zum einen hat der Bereich viel Aufmerksamkeit erfahren, als Apple im Frühjahr 2024 kurz davor war, das Feature unter iOS in Europa dauerhaft abzuschalten. Zum anderen erleben PWAs dank der neuen WebGPU-APIs und dem Hype um AI eine Art Renaissance. Aber was sind eigentlich Progressive Web Apps und was unterscheidet sie von „normalen“ Webseiten oder Bookmarks auf dem Homescreen? Und macht die Art der Anwendung für Endnutzer:innen wirklich einen Unterschied? All diesen Fragen und vielen weiteren gehen Dennis und Jan nach und sprechen dafür mit Nico Martin, Google Developer Expert fürs Web. Dabei geht’s nicht nur um APIs, Browser-Implementierungen und Webstandards, sondern auch darum, was User:innen von Webseiten erwarten und welche UX für sie relevant ist.

A Webapp that uses Retrieval Augmented Generation (RAG) and Large Language Models to interact with a PDF directly in the browser.

Install and update WordPress themes and plugins directly from your Git repository via GitHub, Gitlab or Bitbucket.

A toy car based on an Arduino Nano RP2040 that communicates over Bluetooth Low Energy and can be cntrolled with a webapplication that uses the Web Bluetooth API.

Nico Martin, Google Developer Expert und Webtech-Nerd, erklärt in dieser Revision Schepp und Peter alles zu WebBluetooth, WebUSB und WebNFC!

A web based markdown editor that uses modern progressive web app features to provide a great, cross-platform editing experience. The main goal of this project is to showcase the File System Access API. This API allows a web app to access local files. That means files can be opened and saved directly in the browser.
I think it's fair to say that sharing is one of the most time-saving interactions on our phones. So I was more than thrilled when I've heard about the Share Target API.
Scheduled is the key word there — that’s a fairly new thing! When a push notification is scheduled (i.e. "Take your pill" or "You've got a flight in 3 hours") that means it can be...

A year ago I joined the WebAI team at Hugging Face to work on Transformers.js with Joshua Lochner. It's been the most intense and rewarding year of my career so far. Here's what we built:

open-jev is a browser-focused TypeScript library for typed decisions: one piece of text (the state) plus any number of typed questions go in, and one forward pass returns a calibrated probability distribution per question. Nothing is generated, so an answer is always one of the options you provided.

Nico Martin, open source ML engineer at Hugging Face, talks with Mike Grabowski on React Universe On Air about Transformers.js, WebGPU, browser agents and Hugging Face's upcoming WebGPU inference engine.
One of our biggest goals on the WebAI team at Hugging Face is to make browser inference as fast and as user-friendly as possible. Getting there is a multi-layer effort: models need browser-friendly representations, runtimes need to build efficient execution plans, and the individual GPU operations at the bottom of the stack need to make the most of many different devices and browser implementations.



Die Google I/O ist für viele Entwickler:innen vor allem durch ihre Ankündigungen bekannt – doch wie fühlt sich die Konferenz eigentlich vor Ort an? Darüber sprechen Jan und Dennis mit Nico Martin, der in diesem Jahr nach Mountain View gereist ist. Nico berichtet von seinen Eindrücken auf dem weitläufigen Google-Gelände, den großen Keynotes und den zahlreichen Möglichkeiten, direkt mit den Teams hinter Chrome, Gemini und anderen Google-Produkten ins Gespräch zu kommen. Natürlich geht es auch um die großen Themen der diesjährigen Google I/O. Die Runde diskutiert die aktuellen Gemini-Ankündigungen, den hohen Produktionsaufwand hinter den Keynotes und die Frage, wie viel davon wirklich neu war. Besonders spannend waren für Nico die Produkt-Demos vor Ort, darunter die neue Google-Brille, die er selbst ausprobieren konnte. Außerdem werfen Jan, Dennis und Nico einen Blick auf die Rolle von Entwickler:innenkonferenzen im Allgemeinen. Sie vergleichen die Google I/O mit Formaten wie der Google Cloud Next und den lokalen Google I/O Connect Events und diskutieren, für wen sich ein Besuch lohnt.


This week, I spoke with Nico Martin, open source ML engineer at Hugging Face working on Transformers.js, and a Google Developer Expert in AI and web technology. Nico's path is unusual — he studied to become a teacher, worked as a ski instructor and a windsurf instructor, taught himself web development by building sites for friends, and went freelance for years before joining Hugging Face about six months ago. The role pulls together his obsession with progressive web apps, on-device AI, and Transformers.js — a library he was already building demos with before version one even shipped. In this episode, we cover how Transformers.js actually runs models in the browser, what an ML model really is under the hood, how tokenizers and quantization work, why ONNX matters as a runtime-agnostic standard, where WebGPU fits next to WebAssembly, and what the Prompt API in Chrome means for the future of in-browser LLMs.
An article I wrote about how to build a Chrome extension with on-device AI using Transformers.js and Gemma 4, covering Manifest V3 architecture, model loading in service workers, and building an agentic tool-calling loop.

A modern AI assistant web application featuring voice interaction, real-time conversation, and MCP (Model Context Protocol) server integration.

Lange war es still um PWAs, doch jetzt ist das Thema Progressive Web Apps gerade aktueller denn je: Zum einen hat der Bereich viel Aufmerksamkeit erfahren, als Apple im Frühjahr 2024 kurz davor war, das Feature unter iOS in Europa dauerhaft abzuschalten. Zum anderen erleben PWAs dank der neuen WebGPU-APIs und dem Hype um AI eine Art Renaissance. Aber was sind eigentlich Progressive Web Apps und was unterscheidet sie von „normalen“ Webseiten oder Bookmarks auf dem Homescreen? Und macht die Art der Anwendung für Endnutzer:innen wirklich einen Unterschied? All diesen Fragen und vielen weiteren gehen Dennis und Jan nach und sprechen dafür mit Nico Martin, Google Developer Expert fürs Web. Dabei geht’s nicht nur um APIs, Browser-Implementierungen und Webstandards, sondern auch darum, was User:innen von Webseiten erwarten und welche UX für sie relevant ist.

Install and update WordPress themes and plugins directly from your Git repository via GitHub, Gitlab or Bitbucket.

Nico Martin, Google Developer Expert und Webtech-Nerd, erklärt in dieser Revision Schepp und Peter alles zu WebBluetooth, WebUSB und WebNFC!
I think it's fair to say that sharing is one of the most time-saving interactions on our phones. So I was more than thrilled when I've heard about the Share Target API.


Transformers.js v4.3 is out, and the big one is structured output. With the new @huggingface/transformers-structured-output package you can force a model to follow an exact JSON Schema or regex, directly in the browser. No more parsing markdown fences and hoping the model picked the right property names. In this video I walk through how constrained decoding works, how the new package hooks into the logits processor in Transformers.js, and the technical story behind it: from a WASM wrapper around llguidance to a pure JavaScript implementation with almost no overhead. Also in 4.3: a complete overhaul of the documentation pipeline and a bunch of community-contributed fixes and features. Thank you!

all open source on the Hugging Face Hub, plus @huggingface/kernels, a library that loads, validates, renders and runs them for you. This video walks through how it works: what an op is vs a kernel, why WGSL, and why we ship Jinja templates instead of fixed WGSL files. The browser picks the data types and workgroup sizes your device supports and builds the fastest kernel for that hardware. Then two demos built on top of it: an attention mechanism with the tinyBERT weights in ~20 lines of JavaScript, and a 1M+ cell wave animation driven by a single matmul kernel, capped only by requestAnimationFrame. Finally, Fleet: run the kernel benchmarks on your own GPU. The results help us optimize the kernels for the thousands of devices we can't test ourselves.

I built a research agent that runs entirely in the browser and puts its full think, plan, and act loop on display. Give it a question and it: - Creates an explicit action plan - Reasons about the next step - Chooses and calls tools - Inspects each result - Updates the plan and repeats It does not stop after one tool call. The agent keeps looping until every step in the plan is complete. Along the way, it can ask clarifying questions, use local context, delegate focused research to an isolated Wikipedia subagent, and collect sources. Once the plan is done, it turns the evidence into a cited response and downloadable research paper. The incredible part is the size: just 2.6B parameters. That makes LFM2.5 seriously fast on-device with WebGPU, while still being capable enough to plan, reason, use tools, and finish multi-step objectives. The model, agent loop, and inference pipeline all run locally. No inference server, no account, and prompts and outputs stay in the browser. Small models are not just autocomplete. They can be agents at the edge.

In dieser Folge begrüßen wir einen alten Bekannten in der programmier.bar: Nico Martin, Machine Learning Engineer bei Hugging Face und gern gesehener Podcast-Gast und programmier.con-Speaker.


Transformers.js brings state-of-the-art machine learning to JavaScriprt. In this intro, I explain the mental model behind Transformers.js: tensors, neural networks, ONNX, quantization, model loading, preprocessing, postprocessing, and the pipeline() API. We also look at what happens under the hood for text-generation and depth-estimation, and why one high-level API can support many different AI tasks.


An on-device AI assistant that runs entirely in your browser using WebGPU and Transformers.js. This Chrome extension provides an intelligent agent that can understand natural language commands and interact with your browser through a set of specialized tools.

Transformers.js v4 is out!
Beyond happy to announce that I'm joining 🤗 Hugging Face as a Machine Learning Engineer focused on WebML!

A Webapp that uses Retrieval Augmented Generation (RAG) and Large Language Models to interact with a PDF directly in the browser.

A toy car based on an Arduino Nano RP2040 that communicates over Bluetooth Low Energy and can be cntrolled with a webapplication that uses the Web Bluetooth API.

A web based markdown editor that uses modern progressive web app features to provide a great, cross-platform editing experience. The main goal of this project is to showcase the File System Access API. This API allows a web app to access local files. That means files can be opened and saved directly in the browser.
Scheduled is the key word there — that’s a fairly new thing! When a push notification is scheduled (i.e. "Take your pill" or "You've got a flight in 3 hours") that means it can be...

A year ago I joined the WebAI team at Hugging Face to work on Transformers.js with Joshua Lochner. It's been the most intense and rewarding year of my career so far. Here's what we built:

Transformers.js v4.3 is out, and the big one is structured output. With the new @huggingface/transformers-structured-output package you can force a model to follow an exact JSON Schema or regex, directly in the browser. No more parsing markdown fences and hoping the model picked the right property names. In this video I walk through how constrained decoding works, how the new package hooks into the logits processor in Transformers.js, and the technical story behind it: from a WASM wrapper around llguidance to a pure JavaScript implementation with almost no overhead. Also in 4.3: a complete overhaul of the documentation pipeline and a bunch of community-contributed fixes and features. Thank you!
One of our biggest goals on the WebAI team at Hugging Face is to make browser inference as fast and as user-friendly as possible. Getting there is a multi-layer effort: models need browser-friendly representations, runtimes need to build efficient execution plans, and the individual GPU operations at the bottom of the stack need to make the most of many different devices and browser implementations.

In dieser Folge begrüßen wir einen alten Bekannten in der programmier.bar: Nico Martin, Machine Learning Engineer bei Hugging Face und gern gesehener Podcast-Gast und programmier.con-Speaker.

Die Google I/O ist für viele Entwickler:innen vor allem durch ihre Ankündigungen bekannt – doch wie fühlt sich die Konferenz eigentlich vor Ort an? Darüber sprechen Jan und Dennis mit Nico Martin, der in diesem Jahr nach Mountain View gereist ist. Nico berichtet von seinen Eindrücken auf dem weitläufigen Google-Gelände, den großen Keynotes und den zahlreichen Möglichkeiten, direkt mit den Teams hinter Chrome, Gemini und anderen Google-Produkten ins Gespräch zu kommen. Natürlich geht es auch um die großen Themen der diesjährigen Google I/O. Die Runde diskutiert die aktuellen Gemini-Ankündigungen, den hohen Produktionsaufwand hinter den Keynotes und die Frage, wie viel davon wirklich neu war. Besonders spannend waren für Nico die Produkt-Demos vor Ort, darunter die neue Google-Brille, die er selbst ausprobieren konnte. Außerdem werfen Jan, Dennis und Nico einen Blick auf die Rolle von Entwickler:innenkonferenzen im Allgemeinen. Sie vergleichen die Google I/O mit Formaten wie der Google Cloud Next und den lokalen Google I/O Connect Events und diskutieren, für wen sich ein Besuch lohnt.

An article I wrote about how to build a Chrome extension with on-device AI using Transformers.js and Gemma 4, covering Manifest V3 architecture, model loading in service workers, and building an agentic tool-calling loop.
Beyond happy to announce that I'm joining 🤗 Hugging Face as a Machine Learning Engineer focused on WebML!

Install and update WordPress themes and plugins directly from your Git repository via GitHub, Gitlab or Bitbucket.

A web based markdown editor that uses modern progressive web app features to provide a great, cross-platform editing experience. The main goal of this project is to showcase the File System Access API. This API allows a web app to access local files. That means files can be opened and saved directly in the browser.


Nico Martin, open source ML engineer at Hugging Face, talks with Mike Grabowski on React Universe On Air about Transformers.js, WebGPU, browser agents and Hugging Face's upcoming WebGPU inference engine.

I built a research agent that runs entirely in the browser and puts its full think, plan, and act loop on display. Give it a question and it: - Creates an explicit action plan - Reasons about the next step - Chooses and calls tools - Inspects each result - Updates the plan and repeats It does not stop after one tool call. The agent keeps looping until every step in the plan is complete. Along the way, it can ask clarifying questions, use local context, delegate focused research to an isolated Wikipedia subagent, and collect sources. Once the plan is done, it turns the evidence into a cited response and downloadable research paper. The incredible part is the size: just 2.6B parameters. That makes LFM2.5 seriously fast on-device with WebGPU, while still being capable enough to plan, reason, use tools, and finish multi-step objectives. The model, agent loop, and inference pipeline all run locally. No inference server, no account, and prompts and outputs stay in the browser. Small models are not just autocomplete. They can be agents at the edge.


Transformers.js brings state-of-the-art machine learning to JavaScriprt. In this intro, I explain the mental model behind Transformers.js: tensors, neural networks, ONNX, quantization, model loading, preprocessing, postprocessing, and the pipeline() API. We also look at what happens under the hood for text-generation and depth-estimation, and why one high-level API can support many different AI tasks.

This week, I spoke with Nico Martin, open source ML engineer at Hugging Face working on Transformers.js, and a Google Developer Expert in AI and web technology. Nico's path is unusual — he studied to become a teacher, worked as a ski instructor and a windsurf instructor, taught himself web development by building sites for friends, and went freelance for years before joining Hugging Face about six months ago. The role pulls together his obsession with progressive web apps, on-device AI, and Transformers.js — a library he was already building demos with before version one even shipped. In this episode, we cover how Transformers.js actually runs models in the browser, what an ML model really is under the hood, how tokenizers and quantization work, why ONNX matters as a runtime-agnostic standard, where WebGPU fits next to WebAssembly, and what the Prompt API in Chrome means for the future of in-browser LLMs.

Transformers.js v4 is out!

Lange war es still um PWAs, doch jetzt ist das Thema Progressive Web Apps gerade aktueller denn je: Zum einen hat der Bereich viel Aufmerksamkeit erfahren, als Apple im Frühjahr 2024 kurz davor war, das Feature unter iOS in Europa dauerhaft abzuschalten. Zum anderen erleben PWAs dank der neuen WebGPU-APIs und dem Hype um AI eine Art Renaissance. Aber was sind eigentlich Progressive Web Apps und was unterscheidet sie von „normalen“ Webseiten oder Bookmarks auf dem Homescreen? Und macht die Art der Anwendung für Endnutzer:innen wirklich einen Unterschied? All diesen Fragen und vielen weiteren gehen Dennis und Jan nach und sprechen dafür mit Nico Martin, Google Developer Expert fürs Web. Dabei geht’s nicht nur um APIs, Browser-Implementierungen und Webstandards, sondern auch darum, was User:innen von Webseiten erwarten und welche UX für sie relevant ist.

A toy car based on an Arduino Nano RP2040 that communicates over Bluetooth Low Energy and can be cntrolled with a webapplication that uses the Web Bluetooth API.
I think it's fair to say that sharing is one of the most time-saving interactions on our phones. So I was more than thrilled when I've heard about the Share Target API.

open-jev is a browser-focused TypeScript library for typed decisions: one piece of text (the state) plus any number of typed questions go in, and one forward pass returns a calibrated probability distribution per question. Nothing is generated, so an answer is always one of the options you provided.

all open source on the Hugging Face Hub, plus @huggingface/kernels, a library that loads, validates, renders and runs them for you. This video walks through how it works: what an op is vs a kernel, why WGSL, and why we ship Jinja templates instead of fixed WGSL files. The browser picks the data types and workgroup sizes your device supports and builds the fastest kernel for that hardware. Then two demos built on top of it: an attention mechanism with the tinyBERT weights in ~20 lines of JavaScript, and a 1M+ cell wave animation driven by a single matmul kernel, capped only by requestAnimationFrame. Finally, Fleet: run the kernel benchmarks on your own GPU. The results help us optimize the kernels for the thousands of devices we can't test ourselves.




An on-device AI assistant that runs entirely in your browser using WebGPU and Transformers.js. This Chrome extension provides an intelligent agent that can understand natural language commands and interact with your browser through a set of specialized tools.

A modern AI assistant web application featuring voice interaction, real-time conversation, and MCP (Model Context Protocol) server integration.

A Webapp that uses Retrieval Augmented Generation (RAG) and Large Language Models to interact with a PDF directly in the browser.

Nico Martin, Google Developer Expert und Webtech-Nerd, erklärt in dieser Revision Schepp und Peter alles zu WebBluetooth, WebUSB und WebNFC!
Scheduled is the key word there — that’s a fairly new thing! When a push notification is scheduled (i.e. "Take your pill" or "You've got a flight in 3 hours") that means it can be...