Cadeno
Browser-Flow-Recorder · Chrome MV3

Du hast es einmal vorgeführt.
Warum machst du es immer noch selbst?

Skill Recorder ist eine Chrome-Erweiterung, die zusieht, wie du eine Browser-Aufgabe einmal durchführst — und dann eine SKILL.md schreibt: eine reine Markdown-Spezifikation, die Claude Code (oder jeder Agent auf der browse CLI) ohne Selektoren, Glue-Code oder Babysitting wiedergibt.

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}}
↑ ein fünfminütiger Bestell-Flow,
einmal aufgezeichnet und ewig wiedergegeben.
Anatomie

Drei Stufen, einen Klick voneinander entfernt.

Was wir ausliefern, ist eine kleine Chrome-MV3-Erweiterung und eine 4-KB-Destillationspipeline. Der Recorder klinkt sich in chrome.debugger ein für DOM-Level-Treue; die Destillation läuft komplett im Service Worker; die Wiedergabe liest die resultierende SKILL.md über die browse-CLI. Kein Server. Kein Glue-Code.

i.

Erfassen

Seitenleiste
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

Ein Port pro Frame im Content-Script leitet jedes DOM-Ereignis an den Service Worker weiter. Shadow DOM und gleiche-Herkunft-iframes werden transparent durchdrungen.

  • Sechsstufige Selektor-Auflösung (testid → id → aria → text → css → xpath)
  • tabPorts: Map<tabId, Map<frameId, Port>>
  • IME-bewusste Eingabepufferung · paste · drag
23 Ereignisse →
ii.

Destillieren

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

Sechs kleine Durchgänge verwandeln einen rauschenden Ereignis-Log in eine deterministische Spezifikation. Auto-Parametrisierung feuert nur ab 0,7 Konfidenz; darunter fragt der Recorder, statt zu raten.

  • paramConfidence(step) — heuristische Leiter
  • auth-boundary-Erkennung — undurchsichtige Tokens + Cookies
  • UUID · numerische ID · E-Mail · ISO-Datum · Währung
SKILL.md →
iii.

Wiedergabe

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

Die browse-CLI liest SKILL.md als reines Markdown — kein Schema, keine Laufzeit, keine Hintertüren. Jeder Schritt ist auditierbar.

  • idempotente Wiederholungen · Auth-Pause + Fortsetzung
  • strukturierte Logs ↦ JSONL-Wiedergabeverlauf
  • funktioniert mit Claude Code, Cline, reiner Shell
Spezifikation

Was überlebt eine Aufzeichnung? Dreizehn harte Fälle, durchgängig.

Der Browser ist voller Recorder-Fallen — Hash-Klassen, faule Modals, Shadow DOM, Tab-übergreifende Flows, IME-Komposition, Drag-and-Drop. Jede Zeile unten ist eine echte Fixture im Playground; klick irgendeine an, um selbst dagegen aufzunehmen.

grüner Punkt = ausgeliefert · blau = automatisch
KategorieTechnikWie wir damit umgehenFixture
Selektoren
Hash-Klassen & ID-Rotation

Tailwind-artige Klassen wie btn__primary--ab3f9c rotieren bei jedem Deployment; der Resolver fällt durch 6 Stufen (testid → id → aria → text → css → xpath), sodass ein neu gehashter Button trotzdem trifft.

A2
Selektoren
Identische Geschwister-Zeilen

Sechs Zeilen mit buchstäblich identischen "Pick"-Buttons — nur die Position unterscheidet. Wir verankern jeden Klick per fingerprintIndex, sodass die richtige Zeile geklickt wird, auch nach Neusortierung.

A3
Selektoren
Locale-stabile Identifier

"Continue" / "继续" / "Weiter" bilden alle dasselbe data-i18n-key="action.continue" ab. Der Recorder bevorzugt locale-unabhängige Attribute, sodass ein auf Englisch aufgenommener Skill auf Chinesisch wiedergegeben wird.

A4
Async
SPA-Routenübergänge

pushState- und hashchange-Übergänge werden ohne Reload verfolgt; die Wiedergabe wartet auf das Mounten neuer Inhalte, statt einen leeren Container abzufragen.

B1
Async
Faul gemountete Modals

Der Confirm-Button existiert nicht, wenn der Trigger geklickt wird. elementVisible pollt, bis das Ziel auftaucht, bevor der nächste Schritt verschickt wird — keine wackeligen Timeouts.

B3
Oberflächen
Same-Origin-iframes

all_frames: true injiziert pro Frame; Aktionen werden mit der ursprünglichen frameId markiert und bei Re-Renders per URL neu aufgelöst, sodass eine veraltete frameId die Wiedergabe nie blockiert.

C1
Oberflächen
Schwärzen sensibler Felder

password / phone / Kreditkarte / SSN-Eingaben werden per type + autocomplete + name erkannt und vor der Speicherung durch *** ersetzt. Die Bytes verlassen die Seite nie.

C2
Oberflächen
Shadow-DOM-Durchdringung

Eine benutzerdefinierte shadow-Selektor-Art kodiert den Pfad als { host, inner }-Segmente; der Resolver läuft an jeder Grenze durch shadowRoot.querySelector, sodass Web Components erstklassig sind.

C3
Oberflächen
Tab-übergreifender Handoff

Wenn ein Flow einen neuen Tab öffnet — Druckvorschau, OAuth, Quote-Generierung — folgt die Aufzeichnung via chrome.tabs.onCreated. Die Wiedergabe erzeugt den Tab via chrome.tabs.create neu.

C4
Eingabe
Natives Drag & Drop

Eine dragstart → dragover → drop-Kette mit gemeinsamem DataTransfer wird zu einem drag-Schritt zusammengefasst (Quelle + Ziel + beobachtete Typen). Keine spröden Pixelkoordinaten.

D1
Eingabe
Modifikator-Tastenkombos

Ein nacktes "k" ist Texteingabe-Rauschen; mit metaKey: true ist es ein Cmd-K-Shortcut. Der Recorder behält den Kombo, verwirft das Rauschen und bewahrt den Modifikator-Zustand für die Wiedergabe.

D3
Eingabe
contenteditable-Blöcke

change feuert nie auf contenteditable. Wir hooken input + compositionend, debouncen 300 ms und emittieren einen change-Schritt mit dem finalen innerText — gleiche Form wie eine Texteingabe.

D4
Eingabe
ARIA-Combobox & Typeahead

Jeder Klick-Schritt wird mit comboboxContext (Optionstext, Wurzelselektor) angereichert; wenn ein direkter Klick bei der Wiedergabe scheitert, tippt der Fallback den Text, drückt ArrowDown bis aria-activedescendant passt, dann Enter.

D6

Dreizehn von sechzehn. Plus vier Composite-Fixtures — Notion, Linear, Jira, Salesforce — die zwölf bis fünfzehn dieser Techniken zu einem zusammenhängenden Flow verketten. Zum Playground →

Praxisbeispiel

Ein fünfminütiges Browser-Ritual, destilliert auf dreißig Sekunden.

FeldnotizbuchAufgezeichnet 2026-02-19, 16:42 UTC50× wiedergegeben ohne Eingriff

Jeden Montagmorgen öffnet eine Betriebs-Ingenieurin bei einem kleinen Lieferanten dasselbe Portal, klickt auf Neue Bestellung, fügt einen SKU aus einer CSV ein, tippt eine Menge und klickt auf Absenden. Dann macht sie es nochmal. Und nochmal. Zweihundert Zeilen pro Woche, Woche für Woche, seit vierzehn Monaten. Ein Fünf-Minuten-Ritual, wiederholt bis die Tabelle endet.

Genau die Art Aufgabe, der ein Recorder verkauft wird — und genau die Art, an der die meisten Recorder scheitern. Das Lieferantenportal rotiert Tailwind-Hash-Klassen bei jedem Deploy. Der Absenden-Button sitzt in einer dynamischen Tabellenzeile, die nach jedem Speichern neu rendert. Das Auth-Cookie läuft mittags ab. Selenium-Skripte gegen diese Seite überleben im Schnitt zwei Wochen und beginnen dann still zu versagen.

Die Aufzeichnung

Die Ingenieurin heftet die Erweiterung an die Symbolleiste, öffnet das Portal, klickt Aufnahme starten und führt die Aufgabe genau einmal aus. Acht Klicks, zwei eingegebene Werte, ein Absenden. Das Seitenpanel zeigt einen Live-Feed der Ereignisse — inklusive Rauschen: Scrollen, focus, blur, versehentliche mousemoves über das Hilfesymbol. Dreiundzwanzig Ereignisse in 4,6 Sekunden erfasst.

raw events · 23verstrichen 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)
Der Roh-Log behält alles; die Destillation entscheidet, was zählt.

Die Destillation

main.example.p4

before / after23 Ereignisse → 4 Schritte
— 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 Tastenanschläge werden zu einem parametrisierten fill — bei jeder Wiedergabe dieselbe Form.

Die Übergabe

Die Ingenieurin legt das resultierende Markdown nach ~/.claude/skills/create-purchase-order/SKILL.md und tippt einen Satz in Claude Code. Der Agent findet den Skill per Name, löst die Voraussetzung auf (das gespeicherte Cookie ist bis mittags gültig), iteriert über die fünfzig Zeilen in der CSV und meldet zurück. Drei Minuten elf Sekunden später ist die Arbeit erledigt. Kein Mensch hat zugesehen.

claude code · stdout3 m 11 s · 0 Wiederholungen
> 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
Ein Satz rein, fünfzig Bestellungen raus. Der Agent stellte keine Frage.
Postscriptum
Die Kosten eines Fünf-Minuten-Rituals,
auf ein Arbeitsjahr amortisiert.
4:18min
manueller Median
3.8sec
Agent-Median
~187hrs/yr
allein durch diese Aufgabe zurückgewonnen
Auf härteren Fixtures sehen? Probier den Playground →
Hol dir den Recorder

main.cta.title

Während der offenen Beta kostenlos. Kein Konto, kein Upload, keine Telemetrie. Das gesamte Bundle ist 4,5 MB; Aufzeichnungen bleiben auf deinem Rechner, bis du sie exportierst.

SKILL.md — ein reiner Markdown-Vertrag zwischen Mensch und Agent.v0.4.1 · Updated 2026-02-19