Sandbox
@saffron-health/libretto

Browser automation toolkit for agent workflows

Libretto adds a live browser and a token-efficient CLI to agent-led browser work. It helps you inspect pages, capture network traffic, record actions, replay them as automation scripts, and debug failures against the real site.

889 stars68 forksTypeScriptUpdated 27d ago
Who it's for

Builders who use Claude Code, Codex, or Cursor to automate browser workflows and keep those automations reliable.

What it delivers

You can turn browser actions into repeatable scripts, inspect what went wrong, and fix the workflow against the real site.

What it does

Live browser sessions

Open a browser to a URL and keep the session inspectable with `npx libretto open <url>`.

Workflow runs

Run a TypeScript automation with `npx libretto run ./integration.ts --headless` and keep failed or paused runs open for inspection.

Page snapshots

Capture a screenshot and compact accessibility tree with `npx libretto snapshot --session <name>`.

Execute code in the page

Run Playwright TypeScript against the open page with `npx libretto exec "<code>"`.

Setup and status commands

Create the `.libretto/` workspace with `npx libretto setup` and check readiness with `npx libretto status`.

Skill packaging

Installs the Libretto skill so an agent can use the browser workflow directly from prompts.

How to get it

  1. 1Run
    # Add Libretto to your project. Requires Node.js and npm.
    npm install libretto
    
    # First-time onboarding: install skills and download Chromium
    npx libretto setup
    
    # Check workspace readiness at any time
    npx libretto status

README

Libretto

Libretto

npm version License: MIT GitHub Discussions Discord

Libretto is a toolkit for building robust web integrations. It gives your coding agent a live browser and a token-efficient CLI to:

  • Inspect live pages with minimal context overhead
  • Capture network traffic to reverse-engineer site APIs
  • Record user actions and replay them as automation scripts
  • Debug broken workflows interactively against the real site

We at Saffron Health built Libretto to help us maintain our browser integrations to common healthcare software. We're open-sourcing it so other teams have an easier time doing the same thing.

https://github.com/user-attachments/assets/9b9a0ab3-5133-4b20-b3be-459943349d18

Quick Links

Installation

# Add Libretto to your project. Requires Node.js and npm.
npm install libretto

# First-time onboarding: install skills and download Chromium
npx libretto setup

# Check workspace readiness at any time
npx libretto status

setup creates the .libretto/ directory, installs agent skills, and downloads Chromium unless you pass --skip-browsers.

Use cases

Libretto is designed to be used as a skill through your coding agent. Here are some example prompts:

One-shot script generation

Use the Libretto skill. Go on LinkedIn and scrape the first 10 posts for content, who posted it, the number of reactions, the first 25 comments, and the first 25 reposts.

Your coding agent will open a window for you to log into LinkedIn, and then automatically start exploring.

Interactive script building

I'm gonna show you a workflow in the eclinicalworks EHR to get a patient's primary insurance ID. Use libretto skill to turn it into a playwright script that takes patient name and dob as input to get back the insurance ID. URL is ...

Libretto can read your actions you perform in the browser, so you can perform a workflow, then ask it to use your actions to rebuild the workflow.

Convert browser automation to network requests

We have a browser script at ./integration.ts that automates going to Hacker News and getting the first 10 posts. Convert it to direct network scripts instead. Use the Libretto skill.

Libretto can read network requests from the browser, which it can use to reverse engineer the API and create a script that directly calls those requests. Directly making API calls is faster, and more reliable, than UI automation. You can also ask Libretto to conduct a security analysis which analyzes the requests for common security cookies, so you can understand whether a network request approach will be safe.

Fix broken integrations

We have a browser script at ./integration.ts that is supposed to go to Availity and perform an eligibility check for a patient. But I'm getting a broken selector error when I run it. Fix it. Use the Libretto skill.

Agents can use Libretto to reproduce the failure, pause the workflow at any point, inspect the live page, and fix issues, all autonomously.

CLI usage

You can also use Libretto directly from the command line. All commands accept --session <name> to target a specific session.

npx libretto open <url>                    # launch browser and open a URL
npx libretto run ./integration.ts --headless # run a workflow and close on success
npx libretto run ./integration.ts --headless --stay-open-on-success # keep a successful run inspectable
npx libretto snapshot --session <name>     # capture a screenshot and compact accessibility tree
npx libretto exec "<code>"                 # execute Playwright TypeScript against the open page
npx libretto close                         # close the browser

run sessions are inspectable through the same daemon-backed commands as open sessions. Successful runs close the browser by default; pass --stay-open-on-success to keep the browser open for pages, snapshot, and exec. Failed or paused workflows keep the browser open so you can inspect the exact page state before fixing or resuming the workflow.

Run npx libretto help for the full list of commands.

Configuration

All Libretto state lives in a .libretto/ directory at your project root. See the configuration docs for details on config files, sessions, and profiles.

Telemetry

Libretto records CLI telemetry to help understand CLI usage and help us prioritize improvements. Each resolved command can send only an install id, timestamp, command event name such as libretto run, error boolean, package version, build channel (node_modules, source, or unknown), and, when signed into Libretto Cloud, the configured cloud user id. Libretto does not send command arguments, URLs, project paths, session cookies, API keys, error messages or details, or emails.

The install id is stored in the telemetry file at ~/.libretto/telemetry.json. The implementation lives in packages/libretto/src/cli/core/telemetry.ts.

To disable telemetry, set LIBRETTO_TELEMETRY_DISABLED=1, set DO_NOT_TRACK=1, run with CI=1, or edit ~/.libretto/telemetry.json and set "enabled": false.

Join the Community

Join our Discord to connect with other developers, get help, and share what you've built:

Discord

For longer-form threads, head to GitHub Discussions. Found a bug? Open an issue.

License

MIT License — use it freely in commercial and open-source projects.

Development

For local development in this repository:

pnpm i
pnpm build
pnpm type-check
pnpm test

Source layout:

  • packages/libretto/src/cli/ — CLI commands
  • packages/libretto/src/runtime/ — browser runtime (network, recovery, downloads)
  • packages/libretto/src/shared/ — shared utilities (config, LLM client, logging, state)
  • packages/libretto/test/ — test files (*.spec.ts)
  • packages/libretto/README.template.md — source of truth for the repo and package READMEs
  • packages/libretto/skills/libretto/ — source of truth for the Libretto skill

Run pnpm sync:mirrors after editing packages/libretto/README.template.md or anything under packages/libretto/skills/libretto/.

To check that generated READMEs, skill mirrors, and skill version metadata are in sync without fixing them, run pnpm check:mirrors. To release, run pnpm prepare-release.


[!NOTE] This is an early-stage project under active development. APIs may change before version 1.0. We recommend pinning to specific versions in production.

Built by the team at Saffron Health.

Files in the repo

Repository payload35 top-level entries
  • .agents
  • .bin
  • .claude
  • .claude-plugin
  • .cursor
  • .deepsec
  • .github
  • .libretto
  • .opencode
  • .worktrees
  • apps
  • benchmarks
  • docs
  • evals
  • packages
  • scripts
  • specs
  • .dockerignore
  • .fallowrc.json
  • .gitignore
  • .node-version
  • .oxlintrc.json
  • AGENTS.md
  • CLAUDE.md
  • LICENSE
  • opencode.json
  • oxlint-plugin-libretto.mjs
  • package.json
  • pnpm-lock.yaml
  • pnpm-workspace.yaml
  • README.md
  • skills-lock.json
  • tsconfig.base.json
  • tsconfig.json
  • turbo.json

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More tools

JuliusBrussee/
caveman

🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman

105k
1 add
MemPalace/
mempalace

The best-benchmarked open-source AI memory system. And it's free.

59k
stablyai/
orca

Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.

66k

A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

132k

Never stop coding. Free MIT AI gateway: one endpoint, 352 providers (150+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550+ contributors

64k
headroomlabs-ai/
headroom

Compress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.

71k