Cadeno
Browserflow-opnemer · Chrome MV3

Je hebt het één keer voorgedaan.
Waarom doe je het nog steeds zelf?

Skill Recorder is een Chrome-extensie die kijkt hoe je een browsertaak één keer doorloopt — en schrijft dan een SKILL.md: een platte-markdown-specificatie die Claude Code (of elke agent op de browse-CLI) afspeelt zonder selectors, glue code of toezicht.

v0.4.14.5 MB bundleMV3 service worker21 fixtures12 locales
~/Downloads/recordings/2026-03-create-po.jsonrecording
RAW EVENTS23 captured · 4.6s elapsed
01navigate "/orders/new" // 304 → 200
02click "button.tabs__new" // data-tab=create
03focus "#sku"
04type "SKU-1029" // 8 keystrokes, 1.2s
05blur "#sku"
06type "50" // into #qty
07click "button.submit" ⚠ inside dynamic list
… 16 more (scroll · focus · mousemove · blur · resize)
distilled in 30s ↓
SKILL.md4 steps · 2 inputs · 1 precondition
01# create-purchase-order
02
03// precondition: signed in to supplier portal
04
05## inputs
06- {{sku}} // auto-detected · 8 chars · alphanumeric
07- {{quantity}} // auto-detected · int · 1–999
08
09## steps
101. navigate "/orders/new"
112. fill "#sku" with {{sku}}
123. fill "#qty" with {{quantity}}
134. click submit row matching {{sku}}
↑ een inkooporderflow van vijf minuten,
één keer opgenomen en eeuwig herhaald.
Anatomie

Drie stappen, één klik uit elkaar.

Wat we leveren is een kleine Chrome-MV3-extensie en een distillatie-pipeline van 4 KB. De opnemer haakt in chrome.debugger voor DOM-niveau trouw; de distillatie draait volledig in de service worker; het afspelen leest de resulterende SKILL.md via de browse-CLI. Geen server. Geen glue code.

i.

Vastleggen

Zijpaneel
Skill RecorderREC
00:01click nav.Orders
00:02click btn.New
00:04focus #sku
00:05type "SKU-1029"
00:06blur #sku
00:08type "50" → #qty
00:09click btn.Submit

Een poort per frame in het content script stuurt elk DOM-event door naar de service worker. Shadow DOM en same-origin iframes worden transparant doorgeprikt.

  • Zeskwartiers selectoroplossing (testid → id → aria → text → css → xpath)
  • tabPorts: Map<tabId, Map<frameId, Port>>
  • IME-bewuste invoerbuffering · paste · drag
23 events →
ii.

Distilleren

Service worker · 30 s
dedupe consecutive clicks23 → 16
fold keystrokes into type()16 → 11
detect inputs as {{params}}conf 0.94
mark auth boundary+1 precondition
parameterize URL segments2 swapped
flag dynamic-list clicks1 ⚠ note

Zes kleine doorgangen veranderen een rumoerig event-log in een deterministische specificatie. Autoparametrisering vuurt alleen boven 0,7 vertrouwen; daaronder vraagt de opnemer in plaats van te gokken.

  • paramConfidence(step) — heuristische ladder
  • auth-boundary-detectie — ondoorzichtige token + cookies
  • UUID · numeriek ID · email · ISO-datum · valuta
SKILL.md →
iii.

Afspelen

browse CLI
~/work $ claude
> create POs for these 50 rows
Reading ~/.claude/skills/create-purchase-order/SKILL.md Loaded 4 steps · 2 params · 1 precondition ▸ resolving precondition: signed in to supplier portal cookie present, expires 2026-08-04 ▸ running batch [50 rows] 50/50 in 3m 11s 0 retries, 0 manual rescues

De browse-CLI leest SKILL.md als platte markdown — geen schema, geen runtime, geen ontsnappingsluikjes. Elke stap is controleerbaar.

  • idempotente herstarts · auth-pauze + hervatting
  • gestructureerde logs ↦ JSONL-replay-historie
  • werkt met Claude Code, Cline, gewone shell
Specificatie

Wat overleeft een opname? Dertien harde gevallen, end-to-end.

De browser zit vol valkuilen voor opnemers — gehashte klassen, lui geladen modals, Shadow DOM, multi-tab-flows, IME-compositie, drag-and-drop. Elke rij hieronder is een echte fixture in de playground; klik op een willekeurige om er zelf tegen op te nemen.

groene stip = verzonden · blauw = automatisch
CategorieTechniekWat wij eraan doenFixture
Selectors
Rotatie van klasse- en ID-hashes

Tailwind-achtige klassen zoals btn__primary--ab3f9c roteren bij elke deploy; de resolver loopt 6 niveaus door (testid → id → aria → text → css → xpath), zodat een opnieuw-gehashte knop toch raakt.

A2
Selectors
Identieke broers/zussen-rijen

Zes rijen met letterlijk identieke "Pick"-knoppen — alleen positie onderscheidt. We verankeren elke klik met fingerprintIndex, zodat de juiste rij wordt geklikt, ook na herordenen.

A3
Selectors
Locale-stabiele identifiers

"Continue" / "继续" / "Weiter" verwijzen allemaal naar dezelfde data-i18n-key="action.continue". De opnemer geeft de voorkeur aan locale-onafhankelijke attributen, dus een in het Engels opgenomen skill speelt af in het Chinees.

A4
Async
SPA-route-overgangen

pushState- en hashchange-overgangen worden gevolgd zonder reload; afspelen wacht op het mounten van nieuwe content in plaats van een lege container te pollen.

B1
Async
Laat gemonteerde modals

De Confirm-knop bestaat nog niet wanneer de trigger wordt geklikt. elementVisible peilt totdat het doel verschijnt voordat de volgende stap wordt verstuurd — geen wankele timeouts.

B3
Oppervlakken
Same-origin iframes

all_frames: true injecteert per frame; acties worden gemarkeerd met de oorspronkelijke frameId, en bij re-renders opnieuw op URL opgelost, zodat een verouderde frameId nooit het afspelen blokkeert.

C1
Oppervlakken
Maskeren van gevoelige velden

password / phone / creditcard / SSN-invoer wordt gedetecteerd via type + autocomplete + name en vervangen door *** voordat ze de opslag raken. Bytes verlaten nooit de pagina.

C2
Oppervlakken
Shadow DOM doorprikken

Een aangepaste shadow-selector-soort codeert het pad als { host, inner }-segmenten; de resolver loopt shadowRoot.querySelector op elke grens, zodat Web Components eerste klas zijn.

C3
Oppervlakken
Overdracht tussen tabs

Wanneer een flow een nieuwe tab opent — afdrukvoorbeeld, OAuth, offerte-generatie — volgt de opname via chrome.tabs.onCreated. Afspelen creëert de tab opnieuw via chrome.tabs.create.

C4
Invoer
Native drag & drop

Een dragstart → dragover → drop-keten met gedeelde DataTransfer wordt samengevoegd tot één drag-stap (bron + doel + waargenomen typen). Geen broze pixelcoördinaten.

D1
Invoer
Modifier-toetscombinaties

Een losse "k" is tekstinvoer-ruis; met metaKey: true is het een Cmd-K-snelkoppeling. De opnemer houdt de combo, gooit de ruis weg, behoudt de modifier-toestand voor afspelen.

D3
Invoer
contenteditable-blokken

change vuurt nooit op contenteditable. We haken input + compositionend, debouncen 300 ms en zenden één change-stap met de uiteindelijke innerText — zelfde vorm als een tekstveld.

D4
Invoer
ARIA-combobox & typeahead

Elke klik-stap wordt verrijkt met comboboxContext (optie-tekst, root-selector); als directe klik bij afspelen faalt, typt de fallback de tekst, ArrowDown tot aria-activedescendant overeenkomt, dan Enter.

D6

Dertien van zestien. Plus vier composite-fixtures — Notion, Linear, Jira, Salesforce — die twaalf tot vijftien van deze technieken aaneenrijgen tot één samenhangende flow. Naar de playground →

Uitgewerkt voorbeeld

Een vijf-minuten browserritueel, gedistilleerd tot dertig seconden.

VeldnotitiesOpgenomen 2026-02-19, 16:42 UTC50× afgespeeld zonder ingrijpen

Elke maandagochtend opent een operations-engineer bij een kleine leverancier hetzelfde portaal, klikt op Nieuwe inkooporder, plakt een SKU uit een CSV, typt een aantal en klikt op Verzenden. Dan opnieuw. En opnieuw. Tweehonderd rijen per week, elke week, al veertien maanden. Een vijf-minuten ritueel, herhaald tot het werkblad eindigt.

Precies het soort taak waarvoor een opnemer wordt aangeprezen — en precies het soort waarop de meeste opnemers struikelen. Het leveranciersportaal roteert Tailwind-hashklassen bij elke deploy. De Verzenden-knop zit in een dynamische tabelrij die na elke opslag opnieuw rendert. Het auth-cookie verloopt om twaalf uur. Selenium-scripts tegen deze pagina overleven gemiddeld twee weken en beginnen dan stilletjes te falen.

De opname

De engineer zet de extensie vast in de werkbalk, opent het portaal, klikt op Opname starten en voert de taak exact één keer uit. Acht klikken, twee getypte waarden, één verzenden. Het zijpaneel toont een live feed van events terwijl ze gebeuren — inclusief ruis: scroll, focus, blur, per ongeluk over het help-icoon bewogen muis. Drieëntwintig events vastgelegd in 4,6 seconden.

raw events · 23verstreken 4,6 s
01 navigate "/orders/new" // 304 → 200 02 click "button.tabs__new" // data-tab=create 03 focus "#sku" 04 type "SKU-1029" // 8 keystrokes 05 blur "#sku" 06 focus "#qty" 07 type "50" 08 click "button.submit" inside .row[data-id=r9]16 more (scroll · focus · mousemove · blur · resize)
Het ruwe log bewaart alles; distillatie beslist wat ertoe doet.

De distillatie

main.example.p4

before / after23 events → 4 stappen
— BEFORE (raw)
type "S" → #sku
type "K" → #sku
type "U" → #sku
type "-" → #sku
type "1" → #sku
type "0" → #sku
type "2" → #sku
type "9" → #sku
+ AFTER (distilled)
fill "#sku" with {{sku}}
+ AUTO-DETECTED
// 8 chars · alphanumeric · prefix SKU-
// confidence 0.94
Acht toetsaanslagen worden één geparametriseerde fill — dezelfde vorm bij elke replay.

De overdracht

De engineer plaatst de resulterende markdown in ~/.claude/skills/create-purchase-order/SKILL.md en typt één zin tegen Claude Code. De agent vindt de skill op naam, lost de precondition op (het opgeslagen cookie is geldig tot twaalf uur), itereert over de vijftig rijen in het CSV en rapporteert terug. Drie minuten elf seconden later is het werk gedaan. Niemand keek toe.

claude code · stdout3 m 11 s · 0 retries
> create purchase orders for the rows in ~/Desktop/feb-orders.csv Reading ~/.claude/skills/create-purchase-order/SKILL.md 4 steps · 2 params · 1 precondition Resolving precondition: signed in to supplier portal cookie present (expires 2026-02-19 12:00 UTC) Running batch (50 rows) 50/50 submitted 0 retries · 0 manual rescues median 3.8s per row · longest 5.1s
Eén zin erin, vijftig inkooporders eruit. De agent stelde geen enkele vraag.
Postscriptum
De kosten van een vijf-minuten ritueel,
uitgesmeerd over een werkjaar.
4:18min
mediaan handmatig
3.8sec
mediaan agent
~187hrs/yr
teruggewonnen, alleen al deze taak
Wil je het op zwaardere fixtures zien? Probeer de playground →
Pak de opnemer

main.cta.title

Gratis tijdens de open beta. Geen account, geen upload, geen telemetrie. De hele bundel is 4,5 MB; opnames leven op jouw machine tot jij ze exporteert.

SKILL.md — een platte-markdown-contract tussen mensen en agents.v0.4.1 · Updated 2026-02-19