From 35c885b199121290093874c52e26baebd28fe29c Mon Sep 17 00:00:00 2001 From: "Tommy D. Rossi" Date: Thu, 19 Feb 2026 17:43:23 +0100 Subject: [PATCH] rewrite liveline page to Playwriter content, update skill docs, add OG image liveline.tsx: replace Liveline chart library content with Playwriter product page. Sections now cover getting started, architecture, snapshots, visual labels, sessions, debugger/editor, network interception, screen recording, comparison tables, remote access, and security. skill.md: clarify page reuse rules (reusing about:blank is fine), fix download path to /tmp instead of ./ for cross-platform safety. Add og-errore-vs-effect.png for errore comparison page. --- playwriter/src/skill.md | 4 +- public/og-errore-vs-effect.png | Bin 0 -> 63971 bytes website/src/routes/liveline.tsx | 638 +++++++++++++++++--------------- 3 files changed, 338 insertions(+), 304 deletions(-) create mode 100644 public/og-errore-vs-effect.png diff --git a/playwriter/src/skill.md b/playwriter/src/skill.md index 042c652..dad01cf 100644 --- a/playwriter/src/skill.md +++ b/playwriter/src/skill.md @@ -162,7 +162,7 @@ You can collaborate with the user - they can help with captchas, difficult eleme ## rules -- **Create your own page**: see "working with pages" — always create and store your own page in `state`, never use the default `page` for automation. Examples below use bare `page` for brevity, but in real automation always use `state.myPage` +- **Create your own page**: see "working with pages" — create and store your own page in `state`, don't use the default `page` for automation unless the user asks you to use a specific tab. Reusing an existing `about:blank` tab is fine. Examples below use bare `page` for brevity, but in real automation always use `state.myPage` - **Multiple calls**: use multiple execute calls for complex logic - helps understand intermediate state and isolate which action failed - **Never close**: never call `browser.close()` or `context.close()`. Only close pages you created or if user asks - **No bringToFront**: never call unless user asks - it's disruptive and unnecessary, you can interact with background pages @@ -599,7 +599,7 @@ console.log('New tab URL:', newTab.url()); ```js const [download] = await Promise.all([page.waitForEvent('download'), page.click('button.download')]); -await download.saveAs(`./${download.suggestedFilename()}`); +await download.saveAs(`/tmp/${download.suggestedFilename()}`); ``` **iFrames** - two approaches depending on what you need: diff --git a/public/og-errore-vs-effect.png b/public/og-errore-vs-effect.png new file mode 100644 index 0000000000000000000000000000000000000000..8daafadc57d2aedad430c9b465e4221c938ada66 GIT binary patch literal 63971 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 - Liveline + Playwriter
{/* Intro */} - Liveline is a real-time animated line chart component for React. One{" "} - {""}, no dependencies beyond React - 18, smooth interpolation at 60fps. + Playwriter lets you control your Chrome browser with the full + Playwright API. A Chrome extension, a local relay, and a CLI. No new + browser windows, no Chrome flags, no context bloat. - + - Degen mode (chart shake and particles) with momentum arrows. + Your existing Chrome session. Extensions, logins, cookies — all there. - I built this because every charting library I tried was either too - heavy for a simple live feed, or too rigid to feel alive. Liveline - does one thing: draw a line that moves smoothly as new data arrives. - Everything else is opt-in. + Every browser automation MCP I tried either spawns a new Chrome + instance or forces you into a limited set of predefined tools. Playwriter + does neither. It connects to the browser you already have open, + exposes the full Playwright API through a single{" "} + execute tool, and gets out of the way. + One tool. Any Playwright code. No wrappers.
- npm install liveline - - The component fills its parent container. Set a height on the - wrapper. + Three steps. Extension, icon click, then you're automating. - - {`import { Liveline } from 'liveline' - -function Chart({ data, value }) { - return ( -
- -
- ) -}`} -
+ {`# 1. Install the Chrome extension +# https://chromewebstore.google.com/detail/playwriter-mcp/jfeammnjpkecdekppnclgkkffahnhfhe + +# 2. Click the extension icon on a tab — it turns green + +# 3. Install CLI and run your first command +npm i -g playwriter +playwriter -s 1 -e "await page.goto('https://example.com')"`} - data is an array of{" "} - {"{ time, value }"} points.{" "} - value is the latest number. + The extension connects your browser to a local WebSocket relay on{" "} + localhost:19988. The CLI sends Playwright + code through the relay. No remote servers, no accounts, nothing + leaves your machine. - - Two props. That's it. + {`playwriter session new # new sandbox, outputs id (e.g. 1) +playwriter -s 1 -e "await page.goto('https://example.com')" +playwriter -s 1 -e "console.log(await snapshot({ page }))" +playwriter -s 1 -e "await page.locator('aria-ref=e5').click()"`} - - Feed it data however you like. WebSocket, polling, random walk. - Liveline interpolates between updates so even infrequent data looks - smooth. It works for anything with a value that changes over time. - - - + - Resting heart rate. Custom formatter, exaggerated Y-axis. + Extension icon green = connected. Gray = not attached to this tab.
-
- - - The momentum prop adds directional arrows - and a glow to the live dot. Green for up, red for down, grey for - flat. Pass true to auto-detect direction, - or force it with{" "} - "up",{" "} - "down", or{" "} - "flat". - - - - - Arrows fade out fully before the new direction fades in. - - -
- -
- - - showValue renders the current value as a - large number over the chart. It updates at 60fps through direct DOM - manipulation, not React re-renders. Pair it with{" "} - valueMomentumColor to tint the number based - on direction. - - - - 60fps value overlay with momentum colouring. - -
- -
- - - Pass a windows array to render time horizon - buttons. Each entry has a label and{" "} - secs value. Three styles are available via{" "} - windowStyle:{" "} - "default",{" "} - "rounded", and{" "} - "text". - - - - {``} - - - - - CPU usage with occasional spikes. Rounded time windows. - - -
- -
- - - referenceLine draws a horizontal line at a - fixed value. Pass an object with value and - an optional label. - - - - - Polymarket-style prediction line. "Will Bitcoin stay above - $67,500?" - - -
- -
- - - Pass an orderbook prop with{" "} - bids and asks{" "} - arrays to render streaming order labels behind the line. Each entry - is a [price, size] tuple. Labels spawn at - the bottom, drift upward, and fade out. Green for bids, red for - asks. Bigger orders appear brighter. - - - - The stream speed reacts to price momentum and orderbook churn (how - much the bid/ask totals are changing). Calm markets drift slowly, - volatile ones rush. - - - - - Kalshi-style orderbook stream. Bid and ask sizes float upward behind - the price line. - - -
- -
- - - Pass any CSS colour string to color and - Liveline derives the full palette. Line, fill gradient, glow, badge, - grid labels. It converts the input to HSL and generates every variant - from there. - - - - Dark theme. Same component, different colour. - -
- -
- - - Everything is off by default or has sensible defaults. A few more - things you can turn on: - - - -
  • - exaggerate tightens the Y-axis range so - small movements fill the full chart height. Useful for values that - move in tiny increments, like the heart rate demo above. -
  • -
  • - scrub shows a crosshair with time and - value tooltips on hover. On by default. -
  • -
  • - degen enables burst particles and chart - shake on momentum swings. For when subtlety is not the goal. -
  • -
  • - badgeVariant="minimal" renders a - quieter white pill instead of the accent-colored default. Or{" "} - {"badge={false}"} to remove it entirely. -
  • -
    - -
    -
    - One {""}, one{" "} - requestAnimationFrame loop. When a new - value arrives, nothing jumps. The chart lerps toward the new state at - 8% per frame (lerpSpeed). The Y-axis range, - the badge, the grid labels all use the same lerp. The range snaps - outward instantly when data exceeds it, so the line is never clipped. - That's why it feels like one thing breathing rather than a bunch - of parts updating independently. + The extension uses chrome.debugger to + attach to tabs where you clicked the icon. It opens a WebSocket + connection to a local relay server. The CLI (or MCP, or your own + Playwright script) connects to the same relay. CDP commands flow + through; the extension forwards them to Chrome and sends responses + back. + + + {`+---------------------+ +-------------------+ +-----------------+ +| BROWSER | | LOCALHOST | | CLIENT | +| | | | | | +| +---------------+ | | WebSocket Server | | +-----------+ | +| | Extension |<---------> :19988 | | | CLI / MCP | | +| +-------+-------+ | WS | | | +-----------+ | +| | | | /extension | | | | +| chrome.debugger | | | | | v | +| v | | v | | +-----------+ | +| +---------------+ | | /cdp/:id <------------> | | execute | | +| | Tab 1 (green) | | +--------------------+ WS | +-----------+ | +| | Tab 2 (green) | | | | | +| | Tab 3 (gray) | | Tab 3 not controlled | Playwright API | ++---------------------+ (extension not clicked) +-----------------+`} + + + No Chrome restart required. No --remote-debugging-port{" "} + flags. The extension handles the CDP attachment transparently, and + the relay multiplexes sessions so multiple agents or CLI instances + can work with the same browser simultaneously.
    -
    +
    + + + The core feedback loop is observe → act → observe. + Accessibility snapshots are the primary way to read page state. They return + the full interactive element tree as text, with Playwright locators attached + to every element. + + + {`playwriter -s 1 -e "await snapshot({ page })" + +# Output: +# - banner: +# - link "Home" [id="nav-home"] +# - navigation: +# - link "Docs" [data-testid="docs-link"] +# - link "Blog" role=link[name="Blog"]`} + + + Each line ends with a locator you can pass directly to{" "} + page.locator(). Subsequent calls return a + diff, so you only see what changed. Use{" "} + search to filter large pages. + + + {`# Search for specific elements +playwriter -s 1 -e "await snapshot({ page, search: /button|submit/i })" + +# Always print URL first, then snapshot — pages can redirect +playwriter -s 1 -e "console.log('URL:', page.url()); await snapshot({ page }).then(console.log)"`} + + + Snapshots are text. They cost a fraction of what screenshots cost in + tokens. Use them as your primary debugging tool. Only reach for + screenshots when spatial layout matters — grids, dashboards, maps. + + + + + Accessibility tree as text. 5–20KB vs 100KB+ for screenshots. + + +
    + +
    + + + For pages where spatial layout matters,{" "} + screenshotWithAccessibilityLabels overlays + Vimium-style labels on every interactive element. Take a screenshot, + read the labels, click by reference. + + + {`playwriter -s 1 -e "await screenshotWithAccessibilityLabels({ page })" +# Returns screenshot + accessibility snapshot with aria-ref selectors + +playwriter -s 1 -e "await page.locator('aria-ref=e5').click()"`} + + + Labels are color-coded by element type: yellow for links, orange for + buttons, coral for inputs, pink for checkboxes, peach for sliders, + salmon for menus, amber for tabs. The ref system is shared with{" "} + snapshot(), so you can switch between text + and visual modes freely. + + + + + Vimium-style labels. Screenshot + snapshot in one call. + + +
    + +
    + + + Each session runs in an isolated sandbox with its own{" "} + state object. Variables, pages, listeners + persist between calls within a session. Different sessions get + different state. Browser tabs are shared. + + + {`playwriter session new # => 1 +playwriter session new # => 2 +playwriter session list # shows sessions + state keys + +# Session 1 stores data +playwriter -s 1 -e "state.users = await page.$$eval('.user', els => els.map(e => e.textContent))" + +# Session 2 can't see it +playwriter -s 2 -e "console.log(state.users)" # undefined`} + + + Create your own page to avoid interference from other agents. Reuse + an existing about:blank tab or create a + fresh one, and store it in state. + + + {`playwriter -s 1 -e "state.myPage = context.pages().find(p => p.url() === 'about:blank') ?? await context.newPage(); await state.myPage.goto('https://example.com')" + +# All subsequent calls use state.myPage +playwriter -s 1 -e "console.log(await state.myPage.title())"`} + +
    + +
    + + + Full Chrome DevTools Protocol access. Set breakpoints, step through + code, inspect variables at runtime. Live-edit page scripts and CSS + without reloading. + + + {`# Set breakpoints and debug +playwriter -s 1 -e "state.cdp = await getCDPSession({ page }); state.dbg = createDebugger({ cdp: state.cdp }); await state.dbg.enable()" +playwriter -s 1 -e "state.scripts = await state.dbg.listScripts({ search: 'app' }); console.log(state.scripts.map(s => s.url))" +playwriter -s 1 -e "await state.dbg.setBreakpoint({ file: state.scripts[0].url, line: 42 })" + +# Live edit page code +playwriter -s 1 -e "state.editor = createEditor({ cdp: state.cdp }); await state.editor.enable()" +playwriter -s 1 -e "await state.editor.edit({ url: 'https://example.com/app.js', oldString: 'const DEBUG = false', newString: 'const DEBUG = true' })"`} + + + Edits are in-memory and persist until the page reloads. Useful for + toggling debug flags, patching broken code, or testing quick fixes + without touching source files. The editor also supports{" "} + grep across all loaded scripts. + + + + + Breakpoints, stepping, variable inspection — from the CLI. + + +
    + +
    + + + Intercept requests and responses to reverse-engineer APIs, scrape + data, or debug network issues. Store captured data in{" "} + state and analyze across calls. + + + {`# Start intercepting +playwriter -s 1 -e "state.responses = []; page.on('response', async res => { if (res.url().includes('/api/')) { try { state.responses.push({ url: res.url(), status: res.status(), body: await res.json() }); } catch {} } })" + +# Trigger actions, then analyze +playwriter -s 1 -e "await page.click('button.load-more')" +playwriter -s 1 -e "console.log('Captured', state.responses.length, 'API calls'); state.responses.forEach(r => console.log(r.status, r.url.slice(0, 80)))" + +# Replay an API call directly +playwriter -s 1 -e "const data = await page.evaluate(async (url) => { const res = await fetch(url); return res.json(); }, state.responses[0].url); console.log(data)"`} + + + This is faster than scrolling through DOM. Capture the real API + calls, inspect their schemas, and replay them with different + parameters. Works for pagination, authenticated endpoints, and + anything behind JavaScript rendering. + + +
    + +
    + + + Record the active tab as video using{" "} + chrome.tabCapture. The recording runs in + the extension context, so it survives page navigation. Video is saved + as MP4. + + + {`# Start recording +playwriter -s 1 -e "await startRecording({ page, outputPath: './recording.mp4', frameRate: 30 })" + +# Navigate, interact — recording continues +playwriter -s 1 -e "await page.click('a'); await page.waitForLoadState('domcontentloaded')" +playwriter -s 1 -e "await page.goBack()" + +# Stop and save +playwriter -s 1 -e "const { path, duration, size } = await stopRecording({ page }); console.log(path, duration + 'ms', size + ' bytes')"`} + + + Unlike getDisplayMedia, this approach + persists across navigations because the extension holds the{" "} + MediaRecorder, not the page. You can also + check recording status with isRecording or + cancel without saving with cancelRecording. + + + + + Native tab capture. 30–60fps. Survives navigation. + + +
    + +
    + + + How Playwriter compares to other browser automation approaches. + void", "\u2014"], - ["windowStyle", "'default' | 'rounded' | 'text'", "\u2014"], - ]} - /> - - - - - - string", "v.toFixed(2)"], - ["formatTime", "(t: number) => string", "HH:MM:SS"], - ["lerpSpeed", "number", "0.08"], - [ - "padding", - "Padding", - "{ top: 12, right: 80, bottom: 28, left: 12 }", - ], - ["onHover", "(point: HoverPoint | null) => void", "\u2014"], - ["cursor", "string", "'crosshair'"], - ["className", "string", "\u2014"], - ["style", "CSSProperties", "\u2014"], + ["Agent support", "Claude only", "Any MCP client"], + ["Windows WSL", "No", "Yes"], + ["Context method", "Screenshots (100KB+)", "A11y snapshots (5\u201320KB)"], + ["Playwright API", "No", "Full"], + ["Debugger", "No", "Yes"], + ["Live code editing", "No", "Yes"], + ["Network interception", "Limited", "Full"], + ["Raw CDP access", "No", "Yes"], ]} />
    -
    +
    - A chart that only looks good on calm data isn't much use. These - demos throw the worst stuff I could think of at it: wild volatility, - sharp direction changes, isolated spikes on flat lines, and irregular - data arrival with random gaps. + Control Chrome on a remote machine over the internet using tunnels. + Run the relay on the host, expose it through a tunnel, and connect + from anywhere. - + {`# On the host machine +npx -y traforo -p 19988 -t my-machine -- npx -y playwriter serve --token + +# From anywhere +export PLAYWRITER_HOST=https://my-machine-tunnel.traforo.dev +export PLAYWRITER_TOKEN= +playwriter -s 1 -e "await page.goto('https://example.com')"`} - Sharp reversals are the classic breaking point. The first chart - hammers the line with frequent direction changes at 60ms. The second - holds nearly flat, then fires massive isolated spikes. The third is - just chaos. + Also works on a LAN without tunnels — just set{" "} + PLAYWRITER_HOST=192.168.1.10. Use cases + include controlling a headless Mac mini, providing remote user + support, and multi-machine automation. - - - - Real-world data doesn't arrive at regular intervals. WebSocket - connections drop, batch updates land all at once, mobile networks - stall. This one simulates that: long quiet stretches of 1–3 - seconds between points, then sudden bursts at 40–80ms. The - tick interval itself is random. - - - -
    -
    +
    - Liveline can do a lot. Momentum arrows, particles, orderbooks, - scrubbing, time windows. But at the end of the day, if you just want - a line that moves when a number changes, it does that just fine too. + Playwriter is local by default. The relay runs on{" "} + localhost:19988 and only accepts connections + from the extension. There's no remote server, no account, no + telemetry. - - -
    - -
    - - - Built with React and HTML Canvas. Inspired by TradingView, Robinhood, - and Polymarket chart aesthetics. The interpolation approach is - borrowed from game development — lerp everything, snap nothing. - + +
  • + Local only — WebSocket server binds to + localhost. Nothing leaves your machine. +
  • +
  • + Origin validation — only the Playwriter + extension origin is accepted. Browsers cannot spoof the Origin + header, so malicious websites cannot connect. +
  • +
  • + Explicit consent — only tabs where you + clicked the extension icon are controlled. No background access. +
  • +
  • + Visible automation — Chrome shows an + automation banner on controlled tabs. +
  • +