Repository navigation
Releases
Merge pull request #576 from saffron-health/release-v0.6.45
Fixes
-
/dashboard/phone_numbers404: The prerender list was hardcoded and didn't include the phone numbers section, so Vercel returned a 404 before the SPA could redirect. The list is now derived from the section registry so new sections can't be omitted silently. -
Hosted runtime auth forwarded correctly: The deployment artifact previously consumed and removed the hosted job token before the project's selected Libretto runtime could see it. A proxy now forwards auth to auth-capable runtimes (≥ 0.6.44) and strips it cleanly before invoking older runtimes, preserving strict input schemas. Using
--external librettois now rejected to prevent the executor's copy from shadowing the project's selected version. -
Docs build fixed for SMS OTP pages: The SMS OTP card in the API overview used an unresolvable
fontawesome:message-squareicon; switched tolucide:message-squareand added the missing OG images so the pages deploy correctly.
Improvements
-
Workflow output (
result) documented: The docs now clearly explain that the value a workflow handlerreturns is available asresultonjobs/getand onjob.completedwebhooks. The first-workflow guide, deploying guide, and hosting overview all link to the new canonical section. -
Recording availability clarified: The recordings API docs now note that
headless: trueruns and runs that fail before a browser starts are not recorded, and thatrecording_url_expires_atcan benull. Links to the new data retention page are added throughout.
Merge pull request #562 from saffron-health/release-v0.6.44
Features
-
SMS OTP support (
claimSmsOtp): Workflows can now automate portals that send a one-time code by SMS. Provision a Libretto Cloud inbox number, register it on the portal, then use the newclaimSmsOtphelper to lock the inbox and wait for the code:import { claimSmsOtp, workflow } from "libretto"; export default workflow("portal-login", { credentials: ["username", "password"], async handler(ctx, input) { // ... fill username/password, then: const otp = await claimSmsOtp({ phoneNumberLabel: "uhc" }); await ctx.page.click('button:has-text("Send code")'); const { code } = await otp.wait(); await ctx.page.fill('input[name="otp"]', code); }, });
Locally set
LIBRETTO_API_KEY; hosted Cloud jobs inject auth automatically. Select the inbox withphoneNumber,phoneNumberId, orphoneNumberLabel. -
SMS number management CLI: New
libretto cloud sms-numberscommands let you provision, list, update, and release tenant SMS inbox numbers from the terminal:libretto cloud sms-numbers provision --label uhc libretto cloud sms-numbers list libretto cloud sms-numbers release <id>
-
Dashboard Phone numbers section: A new Phone numbers page in the dashboard lets you provision and release SMS inbox numbers and see which numbers are active in your tenant pool.
-
Dashboard webhook endpoints: The Settings page now supports creating, editing, enabling/disabling, rotating signing secrets for, and deleting webhook endpoints for receiving workflow results.
-
Hosted Workflow APIs catalog: A new public
/hosted-workflowspage lists workflows shared as opaque run APIs. Each detail page shows the run endpoint, authentication requirements, credential requirements, and input/output schemas, along with a copyable agent prompt. Publishers share from the dashboard workflow detail view. -
Chrome Extension product page: The Chrome Extension is now publicly listed on the homepage and has its own dedicated page at
/chrome-extension, linking directly to the Chrome Web Store.
Improvements
- Sandbox Chromium fallback in
start.md: The onboarding guide (https://libretto.sh/start.md) now instructs agents in Linux sandboxes (e.g. Claude Cowork) to stop retrying OS package installs when local Chromium fails, and instead fall back to--provider libretto-cloudor ask the user to verify on a host machine with working Chromium. - Dashboard workflow sharing UI: Workflow sharing controls in the dashboard are clearer, with an updated section title ("Share workflow outside this workspace"), better confirmation dialogs for enabling and disabling workspace sharing, and a collapsible Settings panel.
- Dashboard table polish: All dashboard tables now use consistent row borders, uniform action button styles, a labeled "Live view" column in browser sessions, and better role-select alignment in the users table. Direct
/dashboard/workflows/:workflowURLs now resolve correctly on the static Vercel deployment. - Sharing externally is UI-only: Workflow sharing (open source and hosted) is now managed entirely from the dashboard. The CLI
cloud share,cloud host,cloud unhost, andcloud sharingcommands have been removed. A new Sharing workflows externally documentation page covers the updated flow.
Documentation
- New Reference → Runtime → SMS OTP page documents
claimSmsOtpoptions, return value, and a full example. - Hosting → Website authentication now covers SMS one-time codes with a setup and sign-in example.
- The Cloud API → SMS OTP page documents pool management APIs, claim/poll routes, and isolation rules.
- Cross-links added between the runtime reference, hosting auth guide, Cloud API SMS OTP page, and the understand-Libretto authentication overview.
release: v0.6.43 (#555)
Improvements
- Open workflows and Hosted workflows docs: New dedicated documentation pages cover the Open workflows and Hosted workflows Cloud APIs, including publisher and consumer routes, credential requirements, and CLI examples. Both are linked from the Cloud API and Cloud Hosting overviews.
- Workflow detail page: The dashboard now includes a per-workflow detail page (
/dashboard/workflows/<name>) showing run history and controls to publish or manage Open and Hosted workflow listings from the UI. Deployed workflow names in the workflows table are now clickable links to this page. - Workflow sharing settings copy: The workspace settings panel wording has been updated to distinguish Open workflows (source-sharing) from Hosted workflows (opaque run API).
Merge pull request #553 from saffron-health/release-v0.6.42
Improvements
-
Browser Tools MCP benchmark harnesses for Hermes and OpenClaw: The benchmark suite now includes four host-agent harnesses —
hermes-stock,hermes-browser-tools,openclaw-stock, andopenclaw-browser-tools— so Libretto Browser Tools MCP can be compared directly against the built-in browser toolsets of Hermes and OpenClaw using a local Chrome backend. Run them with:pnpm --filter libretto-browser-tools exec tsx benchmarks/index.ts run \ --harnesses hermes-stock,hermes-browser-tools,openclaw-stock,openclaw-browser-tools \ --provider local --concurrency 1
Results across 26 live-site tasks show that Browser Tools MCP lanes match or beat their stock counterparts in pass rate while using significantly fewer tokens (up to 41% fewer on OpenClaw).
-
"Backed by Y Combinator" badge on the website: The Libretto website now displays a Y Combinator badge in the homepage hero and in the site footer, linking to the Libretto YC company page.
release: v0.6.41 (#542)
Features
- Auth profiles docs: A new Auth profiles page is available under Browser Tools → Overview. It covers named profiles, the
defaultandfalseprofile options, the sign-in-once flow, provider support table, local storage location, and caveats. Thebrowser_opentool now documents itsauthProfileparameter, andbrowser_statussession listings includeauthProfilewhen set.
Improvements
-
run --cdppreserves existing page state: When running a workflow with--cdp, Libretto now attaches to the selected page without navigating to the workflow'sstartUrl. The page URL and authentication state stay intact. Navigate inside the handler, or position the browser on the target screen before the run. Normalrun(with Libretto launching the browser) continues to openstartUrlbefore the handler.# Attaches to the existing page — no startUrl navigation npx libretto run ./workflow.ts --cdp http://127.0.0.1:9222 -
Actionable workflow call stacks on failure:
libretto runnow prints the full Playwright error with its source-mapped call stack when a workflow fails, pinpointing the exact file and line in your TypeScript workflow code instead of only the top-level timeout message.page.waitForResponse: Timeout 500ms exceeded while waiting for event "response" at waitForMissingApi (workflow.ts:3:14) at extractExampleData (workflow.ts:6:9) Browser is still open. You can use `exec` to inspect it. -
Surfaced daemon startup errors: Startup failures such as an unreachable CDP endpoint (
connect ECONNREFUSED), a bad Chromium installation, or an unknown--pageid now print the real error message instead of the opaqueDaemon exited before startup (status: 1). Each failure includes a specific next-step hint.
Merge pull request #530 from saffron-health/release-v0.6.40
Improvements
-
Hermes Agent and OpenClaw integration guides: Dedicated documentation pages for using Browser Tools with Hermes Agent and OpenClaw are now available, covering install, configuration, auth profiles, cloud providers, and troubleshooting for each host.
-
Dashboard API authentication fixes: The dashboard now correctly surfaces API authentication errors instead of silently showing empty tables. GitHub installation setup is also routed through the tenant-authorized OAuth flow.
-
Chrome extension signup flow: Users who sign up through the Chrome extension and have a tenant auto-provisioned are now redirected directly to the dashboard, bypassing the manual onboarding steps.
-
Privacy policy: A privacy policy is now published at libretto.sh/privacy, covering Libretto Cloud and the Chrome extension, including Chrome Web Store Limited Use compliance.
-
Playwright updated to
^1.62.0: The Playwright version constraint is now centralized via a pnpm catalog entry shared across the monorepo, and the aria snapshot API has been updated topage.ariaSnapshot({ mode: 'ai' }).
Merge pull request #516 from saffron-health/release-v0.6.39
Features
-
Persistent browser auth profiles:
browser_opennow accepts anauthProfileparameter to reuse signed-in browser state across sessions. Omitting the field uses the nameddefaultprofile on supported providers; passauthProfile: falsefor a fresh incognito session.// Reuse a named profile await toolkit.tools.browser_open.execute({ authProfile: "work" }); // Incognito session await toolkit.tools.browser_open.execute({ authProfile: false });
Named profiles are supported on the Local, Libretto Cloud, Kernel, and Browser Use providers. Browserbase and Steel are unsupported until a durable name-to-ID mapping is available. Local profiles are stored under
~/.libretto/browser-tools/profileswith owner-only permissions. Changes persist only afterbrowser_closeor a gracefuldispose(). -
Account deletion controls: Workspace owners can now delete their Libretto Cloud account (and workspace, when they are the sole member) from the Users tab of the dashboard. A confirmation dialog is shown before any destructive action.
Improvements
-
Modal-scoped accessibility snapshots: When a modal dialog is open (
<dialog>,role="dialog" aria-modal="true", orrole="alertdialog" aria-modal="true"), the accessibility snapshot now roots at the modal instead of the full page. This prevents inert background content from cluttering the tree and ensures agents see only the focus-trapped UI.Before — page behind the modal stayed in the tree:
<document> <main> # Checkout <button>Pay now</button> </main> Delete this item? <button>Cancel</button> </document>After — modal is the root:
<dialog> Confirm delete Delete this item? <button>Cancel</button> <button>Delete</button> </dialog> -
Opt-in snapshot diffs on
exec: Accessibility-tree diffs afterbrowser_exec/libretto execare now opt-in. PassdiffSnapshot: true(tool) or--diff-snapshot(CLI) when you want a before/after page-change diff after an exploratory mutation. Skipping the flag avoids the cost of two snapshot captures on every exec.// Only capture a diff when you need it await toolkit.tools.browser_exec.execute({ sessionId, code: "await page.locator('button').click()", diffSnapshot: true, });
npx libretto exec --diff-snapshot "await page.locator('button').click()"
-
snapshot <ref>always captures a fresh tree: Scoped snapshots no longer depend on a cached tree from a prior full snapshot. Eachsnapshot <ref>call now captures a fresh screenshot and accessibility tree, then scopes the output to that ref. -
Portable daemon IPC endpoints: The daemon now uses
os.tmpdir()for socket paths on Linux (instead of a hardcoded/tmp), keeps macOS on the short/tmppath to stay within its 104-byte Unix socket limit, and correctly prefers UID-based endpoint isolation over username on Unix systems. Windows named pipe behavior is unchanged. -
Cleanup errors as values:
dispose(),closeSession(), andbrowser_closeno longer throw on provider or browser cleanup failures. Errors are returned as typed values (BrowserCleanupError | null), so partial failures are surfaced to callers without masking the original error or leaving sessions in an unknown state.
Merge pull request #509 from saffron-health/release-v0.6.38
Features
-
Unified authenticated dashboard: Signed-in users now land in a single left-sidebar dashboard that consolidates all workspace views into one place. Sections include Workflows, Schedules, Workflow Runs, Browser Sessions, Self-Healing Playwright, Users, Secrets, API Keys, and Billing — all reachable from
/dashboard/<section>. -
Secrets management: A new Secrets section lets workspace owners add, rename, replace, and delete encrypted secrets directly from the dashboard. Secret values are write-only — they are never returned in dashboard responses or shown in tables. A visibility toggle lets you preview a value before saving.
-
API key management: A new API Keys section lets any user create named API keys and delete keys they own. The raw key material is displayed exactly once immediately after creation with a one-click copy button, then never shown again.
-
Guided empty states: Each automation table shows a contextual prompt when no data is present. Cloud-dependent sections (Workflows, Schedules, Workflow Runs, Browser Sessions) surface a copyable Libretto Cloud setup prompt. The Self-Healing Playwright section walks through the ordered steps: create an API key → copy the PR agent prompt → connect a GitHub repository.
-
Updated homepage copy: The homepage hero now reads "Automate the work that happens in your browser" with an updated description reflecting the full product breadth (Chrome extension, CLI, SDKs, cloud browsers).
Improvements
- Simplified sign-in flow: After signing in or verifying an email, users with an existing organization are sent directly to
/dashboardinstead of a setup wizard. New users create their organization first, then enter the dashboard. - Simplified navbar: The account dropdown in the navbar has been replaced with a single Dashboard button for signed-in users.
- Legacy dashboard URLs redirect:
/dashboard,/dashboard/cloud-browsers,/dashboard/pr-agent, and/dashboard/chrome-extensionall redirect into the equivalent new dashboard section without breaking existing links. - Static prerendering for dashboard routes: All dashboard section pages are now prerendered at build time, so direct links, page refreshes, and auth redirects resolve correctly on Vercel without a client-side navigation round-trip.
- Removed setup wizard: The
/setuproute has been removed. Any links that previously pointed there now redirect to the dashboard.
v0.6.37: release: libretto 0.6.37 and browser-tools 0.1.2 (#504)
Features
-
startUrlworkflow launch option: Workflows can now declarestartUrl,gpu, andviewportdirectly in their definition. Libretto opensstartUrlbefore the handler runs — on Kernel and Libretto Cloud it is sent at browser create time so the page loads before CDP attach, avoiding a double navigation that can trigger bot detection. Browserbase and Steel navigate tostartUrlimmediately after connect.export default workflow("bookFlight", { startUrl: "https://www.example.com/", gpu: true, viewport: { width: 1440, height: 900 }, handler: async ({ page }) => { // Browser is already on startUrl — no page.goto needed here. }, });
-
MCP adapter for Browser Tools SDK:
libretto-browser-tools/mcpexposes all six browser tools to any MCP-compatible client or gateway. Register tools on a caller-ownedMcpServerand connect your transport of choice. Screenshots are returned as MCP image content; failures setisError: truewith actionable error text. Safety annotations are published for each tool.import { registerMcpBrowserTools } from "libretto-browser-tools/mcp"; const { dispose } = registerMcpBrowserTools( server, new LocalBrowserProvider({ headless: true }), );
-
Cloud job and schedule browser launch overrides:
libretto cloud jobs createandlibretto cloud schedules createnow accept--start-url,--gpu, and--viewport WIDTHxHEIGHTflags to override workflow launch options at run time. -
Browser Tools SDK product page: The
/browser-toolsmarketing page is now live with benchmarks, tool examples, integration grid (AI SDK, Pi, MCP, and coming-soon adapters), and FAQ. -
Browser Tools SDK
ProviderSessionCreateOptions:startUrl,gpu, andviewportare now part of thecreateSessioncontract for all built-in providers (LocalBrowserProvider,KernelBrowserProvider,LibrettoCloudBrowserProvider,BrowserbaseBrowserProvider,SteelBrowserProvider,BrowserUseBrowserProvider). Kernel and Libretto Cloud preloadstartUrl; others navigate after connect.ProviderSessionCreateOptionsandProviderSession.startUrlPreloadedare exported from the package root.
Improvements
-
Playwright debugger package renamed to
libretto-playwright-debugger: The npm package is now published aslibretto-playwright-debugger(previouslylibretto-playwright-debug). ThecreatePlaywrightDebugger()anddebugFailure()API is unchanged.pnpm add libretto-playwright-debugger
-
Streamlined PR agent setup: GitHub repository connection is now the first setup step; the local-agent step has been removed from the wizard. Authenticated users with an incomplete PR agent setup are routed to
/setup; users with a completed setup go to/dashboard. -
libretto statusoutput simplified: When no sessions are open, the command now printsNo open sessions.without the precedingOpen sessions:header. -
libretto setuphelp text updated: Thesetupcommand description now points users toupdatefor existing installations. -
Docs migrated to Holocron: The documentation site has moved from Mintlify to the Holocron runtime. The
/docsproxy now points to the new deployment atlibretto-docs.vercel.app. -
Browser Tools docs section: A new top-level Browser Tools tab is live in the docs, covering quickstart, tools reference, advanced topics (domain policy, borrowed pages, CDP attach), adapters (AI SDK, Pi, MCP, Custom), and providers (Local, Libretto Cloud, Kernel, Browserbase, Browser Use, Steel, Custom).
-
Docs Open Graph images: Every docs page now has a branded 1200×630 social card using Satori for precise Flexbox layout. A
pnpm docs:ogscript regenerates all images deterministically. -
Chrome extension auth return flow preserved: The cloud browsers dashboard now redirects signed-out visitors to sign-in with their original destination URL, so the Local Chrome Agent flow returns correctly after authentication.
-
Browser Tools SDK README refreshed: The
packages/browser-toolsREADME now includes a centered header, install steps, quick example, cloud provider list, and links to docs and the product page.
Merge pull request #474 from saffron-health/release-v0.6.36
Features
-
New website product pages: The Libretto website now has dedicated pages for each product in the family — the Libretto CLI (
/cli), Playwright PR Agents (/debug-agents), and an upcoming Browser Tools SDK (/browser-tools). The homepage has been redesigned around a product listing that previews all three, and navigation (desktop dropdown, mobile menu) and the footer have been updated with links to each page. -
Renamed Playwright debugger API: The
libretto-playwright-debugpackage now exposescreatePlaywrightDebugger()(replacingcreateLibrettoDebugger()) andplaywrightDebugger.debugFailure()(replacingdebugPlaywrightFailure()). Public types are renamed to match:PlaywrightDebuggerOptions,DebugFailureOptions,DebugFailureResult, andPlaywrightDebugger.import { createPlaywrightDebugger } from "libretto-playwright-debug"; // Initialize once at module scope const playwrightDebugger = createPlaywrightDebugger({ github: { owner: "acme", repo: "automations", baseBranch: "main" }, agent: { model: "openai/gpt-5.4" }, }); try { await runAutomation(page); } catch (error) { await playwrightDebugger.debugFailure(error, page); throw error; }
Improvements
-
Playwright debugger documentation: The
libretto-playwright-debugpackage README has been expanded with installation steps, authentication setup (Libretto API key, model provider keys), and precise integration guidance covering module-scope initialization and callingdebugFailure()before Playwright teardown. The runtime reference doc and conceptual autofix guide have been updated to match the new API names. -
Updated website copy: The site-wide call-to-action has been updated from "Book a demo" to "Talk to a dev", and the sign-in/sign-up page now uses generalized account copy covering both hosted workflows and PR agents.
-
YouTube quick link in README: A YouTube link has been added to the Quick Links section of the README.