Shiny Fishstick

Turn anywebsite intoan SDK.

Shiny Fishstick crawls a site once, discovers what it can do, and compiles it into a typed, agent-ready SDK. No selectors, no raw HTML, and no browser at all where a direct API call will do.

Python, TypeScript and Rust SDKs
Auto-generated MCP server
Open source, Apache 2.0

Every AI browser agent hits the same wall. It parses thousands of tokens of HTML to find a button, guesses selectors that break on the next refactor, and pays a context tax on every click. This isn’t a browser problem. It’s an abstraction problem.

Compile once. Call forever.

75lines of agent code
6selectors to maintain
669tokens per call
agent.py · raw Playwrightagent.py · Shiny Fishstick
page = await browser.new_page()
await page.goto("https://shop.example.com")
await page.locator("#email").fill("agent@example.com")
await page.locator("#password").fill("hunter2")
await page.locator("#login-submit-btn").click()
await page.wait_for_selector(".dashboard")
# ... 40 more lines for every action
site = ShinyClient("https://shop.example.com")
await site.login(email="agent@example.com", password="hunter2")
await site.search_products(query="running shoes")
await site.add_to_cart(product_id="42", quantity=1)
await site.checkout()

From URL to SDK in six stages.

  1. 1CrawlerBreadth-first traversal that handles auth redirects and session state.
  2. 2DOM AnalyzerScores selectors by stability: data-testid first, then id, class, and xpath.
  3. 3Intent EngineAn LLM or heuristic classifier maps elements to semantic actions.
  4. 4API SnifferWatches XHR and fetch traffic and upgrades UI actions to direct API calls.
  5. 5Workflow BuilderModels multi-step action sequences as a finite state machine.
  6. 6CompilerGenerates preflight.yaml, the SDKs and an MCP server.

Also included

Encrypted credentialsStealth modeProxy supportiFrame traversalSelf-healing selectorsChaos monkeyOffline LLM via OllamaOpenAPI exportNext.js dashboard

OpenAPI, for sites that never had an API.

The output is a human-readable, version-controllable action spec. Once add_to_cart is discovered as a POST call, future runs skip the browser entirely.

preflight.yaml
actions: login: action_type: browser selector: '#login-form' add_to_cart: description: Adds a product to the cart action_type: api # upgraded to a direct API call api: url: /api/cart/add method: POST

The numbers.

78.5%fewer tokens per call on the mock store
953×faster actions, 1,444 ms down to 1.5 ms
99.9%fewer page tokens on average across real sites
100%reliable under DOM mutation, up from 0%
Real sitePage tokensAPI tokensSpeed-up
Wikipedia40,8331318×
Hacker News2,29813.5×
GitHub (vscode)34,292524×

Mock-store figures come from a controlled demo. Real-site figures were measured live. Methodology and caveats for every number are in BENCHMARKS.md in the repo.

Where it sits next to everything else.

Playwright is a great browser control library. Shiny Fishstick sits on top of it to add a compilation and abstraction layer.

Try it on a mock store.

You’ll need Python 3.9+ and Node.js 18+. Docker is optional. Then run playwright install chromium.

preflight.yamlcompiled action spec
sdk.pyPython client
sdk.tsTypeScript client
sdk.rsRust client
mcp_server.pyplugs into any LLM

Generated into ./shared/specs/

terminal
git clone git@github.com:Hootsworth/shiny-fishstick.git cd shiny-fishstick cp .env.example .env make setup make demo

The agentic web needs a shared action spec.

We want preflight.yaml to become an open standard, the way OpenAPI did for REST: a spec, a compiler, a validator, and one day a registry where sites publish their own.

View on GitHubOpen an issue