| name | unbrowser |
| description | Intelligent web browsing API that learns from patterns, discovers APIs automatically, and progressively eliminates browser rendering for 10x faster data extraction. Use when you need to extract content from websites, discover APIs, handle authenticated sessions, or automate multi-step browsing workflows. |
Unbrowser - Intelligent Web Browsing
Unbrowser (npm: llm-browser) is an intelligent web browsing system that learns from every browse operation to progressively eliminate the need for slow browser rendering.
When to Use This Skill
Use Unbrowser when you need to:
- Extract content from websites - Articles, product data, structured information
- Discover and use APIs - Automatically find and cache API endpoints
- Handle authenticated sessions - Login flows, cookies, persistent sessions
- Learn browsing patterns - Save and replay multi-step workflows
- Bypass rendering - 10x faster than Playwright for repeat visits
Core Philosophy: "Browser Minimizer"
The goal is to progressively eliminate browser overhead:
- First visit: Use content intelligence or lightweight rendering (~200-500ms)
- Learning: Discover APIs, learn patterns, build procedural skills
- Future visits: Direct API calls or cached patterns (~50-200ms, 10x faster)
- Collective intelligence: Patterns learned by all users benefit everyone (cloud API only)
Quick Start
Installation
# For Claude Desktop (MCP)
npm install -g llm-browser
# For Node.js projects
npm install llm-browser
Claude Desktop Configuration
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"unbrowser": {
"command": "npx",
"args": ["llm-browser"]
}
}
}
SDK Usage (Local)
For local SDK usage (all processing runs on your machine):
import { createLLMBrowser } from 'llm-browser/sdk';
const browser = await createLLMBrowser();
const result = await browser.browse('https://example.com');
console.log(result.content.markdown); // Clean markdown content
console.log(result.apis); // Discovered API endpoints
console.log(result.meta.strategy); // How content was extracted
Key Capabilities
1. Tiered Rendering (Fastest First)
Unbrowser tries fastest strategies first, falling back only when needed:
| Tier | Method | Speed | Use Case |
|---|---|---|---|
| 1 | Content Intelligence | ~50-200ms | Framework data (NEXT_DATA), structured data (JSON-LD), API prediction |
| 2 | Lightweight Rendering | ~200-500ms | Simple JavaScript execution without full browser |
| 3 | Playwright (optional) | ~2-5s | Complex JavaScript, authentication flows, dynamic content |
Example:
// First visit: Uses tier 2 (lightweight rendering)
const result1 = await browser.browse('https://news-site.com/article');
// meta.strategy: "lightweight" (~400ms)
// Unbrowser learns the site has __NEXT_DATA__
// Second visit: Uses tier 1 (intelligence)
const result2 = await browser.browse('https://news-site.com/another-article');
// meta.strategy: "framework-extraction" (~80ms) - 5x faster!
2. API Discovery & Caching
Automatically discovers and uses APIs instead of scraping HTML:
// First visit: Scrapes HTML
const product = await browser.browse('https://shop.com/product/123');
// Unbrowser discovers: GET /api/products/123
// Future visits: Direct API call (10x faster, no rendering)
// Access discovered APIs
console.log(result.apis);
// [{
// url: "https://shop.com/api/products/123",
// method: "GET",
// pattern: "rest-resource",
// confidence: 0.95
// }]
Supported Discovery Methods:
- Framework extraction - Next.js, Nuxt, Gatsby, Remix
- OpenAPI/Swagger - Auto-detect and parse specs
- GraphQL introspection - Schema discovery via
__schemaquery - JavaScript analysis - Extract API calls from bundle code
- Pattern learning - Learn from successful API extractions
3. Procedural Memory (Skill Learning)
Learns and replays browsing workflows with versioning and rollback:
// Teach Unbrowser a skill
await browser.recordSkill('extract-job-posting', async (recorder) => {
await recorder.navigate('https://jobboard.com/post/123');
await recorder.click('.view-details');
await recorder.extract({
title: '.job-title',
salary: '.salary-range',
requirements: '.requirements ul li'
});
});
// Replay on different job postings
const job1 = await browser.replaySkill('extract-job-posting', 'https://jobboard.com/post/456');
const job2 = await browser.replaySkill('extract-job-posting', 'https://jobboard.com/post/789');
Skills include:
- Version control - Rollback if new version performs worse
- Performance tracking - Success rate, execution time
- Cross-domain transfer - Apply patterns to similar sites
- Auto-adaptation - Adjusts when selectors change
4. Session Management
Persistent authenticated sessions with encryption:
// Login once
await browser.browse('https://platform.com/login', {
session: 'my-platform-session',
actions: [
{ type: 'fill', selector: '#email', value: 'user@example.com' },
{ type: 'fill', selector: '#password', value: 'password123' },
{ type: 'click', selector: 'button[type="submit"]' }
]
});
// Reuse session for authenticated requests
const dashboard = await browser.browse('https://platform.com/dashboard', {
session: 'my-platform-session'
});
// Sessions persist across restarts (encrypted at rest)
5. Batch Operations
Process multiple URLs in parallel:
const results = await browser.batch([
'https://company1.com',
'https://company2.com',
'https://company3.com'
], {
parallel: 3, // Max concurrent requests
timeout: 10000
});
// Returns array of results
results.forEach(r => console.log(r.content.title));
6. Stealth Mode
Evade bot detection with fingerprint randomization:
export LLM_BROWSER_STEALTH=true
Features:
- Fingerprint evasion - Randomize user agent, screen resolution, fonts
- Behavioral delays - Human-like timing between actions
- WebRTC/Canvas fingerprint masking
- Proxy support - Rotate IPs (Bright Data integration)
Cloud API (Alternative to Local MCP)
For multi-tenant access or non-Node.js languages:
# REST API
curl -X POST https://api.unbrowser.ai/v1/browse \
-H "Authorization: Bearer $UNBROWSER_API_KEY" \
-d '{"url": "https://example.com"}'
# SDK (thin HTTP wrapper)
npm install @unbrowser/core
import { createUnbrowser } from '@unbrowser/core';
const client = createUnbrowser({
apiKey: process.env.UNBROWSER_API_KEY
});
const result = await client.browse('https://example.com');
Cloud API benefits:
- Collective learning - Shared pattern pool across all tenants
- No local dependencies - No Playwright, no Node.js required
- Usage-based billing - Pay only for what you use
- Multi-language support - Python, Ruby, Go, etc.
See api.unbrowser.ai/docs for full API reference.
Common Patterns
Extract Article Content
const article = await browser.browse('https://blog.com/post');
console.log(article.content.markdown); // Clean markdown
console.log(article.content.structured?.author);
console.log(article.content.structured?.publishDate);
Monitor Product Prices
// First visit: Learns pattern
const product = await browser.browse('https://shop.com/product/123');
// Set up monitoring (checks every hour)
await browser.monitor('https://shop.com/product/123', {
interval: '1h',
onChange: (result) => {
const price = result.content.structured?.price;
if (price < 100) {
console.log('Price dropped!', price);
}
}
});
Multi-step Workflow
// Record workflow
await browser.recordWorkflow('company-research', async (recorder) => {
const homepage = await recorder.browse('https://company.com');
const about = await recorder.browse('https://company.com/about');
const contact = await recorder.browse('https://company.com/contact');
return {
name: homepage.content.structured?.companyName,
description: about.content.text,
email: contact.content.structured?.email
};
});
// Replay on different companies
const intel1 = await browser.replayWorkflow('company-research', 'https://company1.com');
const intel2 = await browser.replayWorkflow('company-research', 'https://company2.com');
Discover and Call APIs
// Browse once to discover API
const result = await browser.browse('https://api-docs.com/products');
// Discovered APIs are cached
const api = result.apis[0];
console.log(api.url); // "https://api-docs.com/v1/products"
console.log(api.method); // "GET"
// Future requests use API directly (10x faster)
const products = await browser.fetch(api.url);
Advanced Options
Customize Output
const result = await browser.browse(url, {
maxChars: 10000, // Limit text length
includeTables: true, // Extract tables as CSV
includeNetwork: true, // Capture network requests
includeConsole: false, // Skip console logs
cleanMarkdown: true // Remove navigation/ads
});
Proxy Configuration
const result = await browser.browse(url, {
proxy: {
server: 'http://proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
Debugging
const result = await browser.browse(url, {
debug: {
visible: true, // Show browser window
slowMotion: 100, // 100ms delay between actions
screenshots: true, // Capture screenshots
consoleLogs: true // Collect console output
}
});
console.log(result.debug.screenshots); // Array of base64 images
console.log(result.debug.actionTrace); // Step-by-step actions
Performance Comparison
| Method | First Visit | After Learning | Speedup |
|---|---|---|---|
| Playwright | ~2-5s | ~2-5s | 1x |
| Unbrowser (first) | ~200-500ms | - | 5-10x |
| Unbrowser (learned) | - | ~50-200ms | 20-50x |
Learning happens automatically - no configuration needed.
Troubleshooting
Browser Not Rendering
Unbrowser works without Playwright by default. If you need full browser rendering:
npx playwright install chromium
Then Unbrowser will use tier 3 (Playwright) for complex sites.
API Discovery Not Working
Some sites block API access. Try:
- Use session authentication - Login first, then browse
- Enable stealth mode -
LLM_BROWSER_STEALTH=true - Use proxy - Rotate IPs to avoid rate limiting
Learning Not Persisting
By default, learning is saved to ./procedural-memory.json. Check:
ls -la procedural-memory.json
# Should show file with recent timestamp
For cloud API, learning is persisted server-side (no local files).
Environment Variables
# Local MCP/SDK
LLM_BROWSER_STEALTH=true # Enable stealth mode
LLM_BROWSER_SESSION_DIR=./sessions # Session storage directory
# Cloud API
UNBROWSER_API_KEY=ub_live_xxxxx # API key
UNBROWSER_API_URL=https://api.unbrowser.ai # Override API URL
Resources
- Documentation: https://github.com/ogoldberg/ai-first-web-client#readme
- API Reference: https://api.unbrowser.ai/docs
- Examples: https://github.com/ogoldberg/ai-first-web-client/tree/main/examples
- NPM Package: https://www.npmjs.com/package/llm-browser
- Cloud SDK: https://www.npmjs.com/package/@unbrowser/core
License
MIT License - See LICENSE