Notte logo

Notte

OrganizationPopular
Bitterbot-AI
notte

Deploy browser automations as scheduled, API-callable serverless Functions — plus stealth sessions, vault-backed login, captcha solving, and natural-language agent runs via the Notte CLI. Turns any browser flow into a deterministic Bitterbot-callable endpoint, ideal for crystallized skills + dream-engine cron schedules.

Overview

PublisherBitterbot-AI
Repositorybitterbot-desktop
Skill namenotte
Stars
2.5K
Forks
418
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by Bitterbot-AI on GitHub. Read the source before you install it.

Installation

Install the Notte AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git /tmp/bitterbot-desktop
mkdir -p .claude/skills
cp -r /tmp/bitterbot-desktop/skills/notte .claude/skills/notte
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Notte in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Notte on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Notte is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Notte

Hosted browser infrastructure with a CLI that does three things the bundled browser tool and Firecrawl cannot:

  1. Functions — deploy a browser automation script as a serverless, API-callable endpoint with built-in cron scheduling. The natural fit for crystallized skills and dream-engine cycles.
  2. Vault-backed login — passwords auto-fill on matching URLs without ever entering the model's context.
  3. Stealth sessions — residential proxies + inline captcha solving, for sites where the bundled Chromium gets locked out.

Functions — deploy a browser flow as a callable API

Crystallized skills and dream-cycle automations both want the same thing: a stable, repeatable browser action the agent can call by name on a schedule. Notte Functions is exactly that.

bash
# 1. Capture an agent's run as deterministic Python (or hand-write it).
notte agents workflow-code   # exports the latest agent's steps as Python
notte sessions workflow-code # or export from a CLI session

# 2. Deploy the script as a Function (one-shot — no servers, no infra).
notte functions create --file workflow.py
# → returns function_id

# 3. Run on demand, or schedule.
notte functions run                                # one-off
notte functions schedule-set --cron "0 */2 * * *"  # every 2h, matches dream cycles
notte functions runs                               # invocation history
notte functions fork                               # version forward without losing the original

# 4. Or invoke via HTTP from anywhere (skill scripts, gateway hooks, channels).
curl -X POST https://api.notte.cc/functions/{function_id}/runs/start \
  -H "Authorization: Bearer $NOTTE_API_KEY" \
  -d '{"url":"https://example.com","query":"laptop"}'

Why this matters for Bitterbot:

  • A crystallized skill that ends in "open this URL and grab the data" can be backed by a Function — fast, deterministic, no LLM tokens per execution.
  • Function schedule-set aligns directly with dream-engine cron triggers (every 2h consolidation, daily syncs, hourly monitors).
  • notte agents workflow-code is structurally the same pattern as Bitterbot's dream engine crystallizing execution paths — the agent figures out the steps, then the deterministic Function takes over for production.
  • Functions auto-inherit Notte's session capabilities: vault credentials, stealth proxies, captcha solving — without re-deploying anything.

When to use Notte vs the bundled tools

NeedUse
Open a tab, click around, take a snapshotBundled browser tool (src/browser/)
Pull a single page through a stealth fetchFirecrawl via web_fetch (docs/tools/firecrawl.md)
Crystallize a recurring browser flow into a callable API endpointnotte functions
Schedule a browser flow on a cron (dream-cycle aligned)notte functions schedule-set
Run a multi-step task on an authenticated sitenotte session
Log in without exposing the password to the LLMnotte vault
The bundled browser is being challenged with captcha / Cloudflare / DataDomenotte (--solve-captchas, --proxy)
Need a residential / geo-located IPnotte
Hand a browsing goal to an agent and get a structured answernotte agents

notte does not replace the bundled browser. It's the deployment + infrastructure layer for browser flows that need to outlive a single agent run.

Setup

bash
# Install (handled by the install metadata above).
brew tap nottelabs/notte-cli https://github.com/nottelabs/notte-cli.git && brew install notte
# or:
go install github.com/nottelabs/notte-cli/cmd/notte@latest

# Authenticate. Stores the API key in the system keyring.
notte auth login
# or: export NOTTE_API_KEY=...

Quick start

bash
notte sessions start --proxy --solve-captchas
notte page goto "https://news.ycombinator.com"
notte page observe
notte page scrape --instructions "Top 10 story titles, points, and URLs as JSON"
notte sessions stop -y

observe returns interactive element IDs (@B3, @I1, @L9). Use those with click / fill, or fall back to Playwright selectors (#submit, button:has-text('Submit')) — both are accepted.

Vault-backed login (the biggest UX win over the bundled browser)

docs/tools/browser-login.md recommends manual login because automated logins trigger anti-bot defenses and can lock the account. Notte fixes this: store credentials in a vault and the browser auto-fills on matching URLs. The agent never sees the password.

bash
notte vaults create --name "myservice"
notte vaults credentials add --vault-id <vault-id> \
  --url "https://myservice.com" \
  --email "user@example.com" \
  --password "..." \
  --mfa-secret "<TOTP_BASE32_SECRET>"   # optional TOTP

notte sessions start
notte page goto "https://myservice.com/login"
# Credentials auto-fill from the matching vault entry.

This unblocks autonomous flows during dream cycles where there's no user available to log in manually.

Agent runtime (delegate the whole task)

For multi-step goals, hand the task to a Notte agent:

bash
notte agents start --task "Find the cheapest non-stop SFO→CDG flight on Sep 14 and return the URL"
notte agents status
notte agents replay     # session recording / step trace

Agents are cheaper than authoring step-by-step CLI calls when the task has many branches.

Stealth flags worth knowing

FlagEffect
--proxyRoute through Notte's residential proxy pool
--proxy-country <c>ISO country code (us, gb, fr, de, …)
--solve-captchasAuto-solve reCAPTCHA / hCaptcha / Cloudflare turnstile
--user-agent <ua>Pin a specific UA string
--cdp-url <url>Bring-your-own remote browser (e.g. Lightpanda)
--headless=falseRequired when --cdp-url points to Lightpanda Cloud

Page actions (cheat sheet)

bash
notte page click "@B3" | "#submit-button"
notte page fill "@I1" "hello"        # add --enter to submit
notte page check "#tos"
notte page select "#country" "France"
notte page upload "#file" --file ./report.pdf
notte page download "@L5"
notte page eval-js 'document.title'
notte page screenshot
notte page wait 500
notte page press "Enter" | "Escape" | "Tab"
notte page scroll-down [px] | scroll-up [px]

Navigation: goto, back, forward, reload, new-tab, switch-tab, close-tab.

Structured extraction

bash
notte page scrape --instructions "Every job posting: title, company, location, salary range" -o json
notte page scrape --instructions "Article body and author" --only-main-content

Note: for routine single-page extraction without auth or anti-bot needs, web_fetch (with Firecrawl) is the lighter path. Use notte page scrape when extraction lives behind login or after a multi-step navigation.

MCP path (no install required)

Notte ships an MCP server (notte-mcp). It can be called through the existing mcporter skill without installing the Notte CLI:

bash
NOTTE_API_KEY=... mcporter call --stdio "uv run --with notte-mcp python -m notte_mcp.server" \
  notte_scrape url=https://example.com instructions="Extract pricing tiers"

Use the CLI by default — the MCP path is mainly useful inside flows already orchestrating MCP calls.

Live viewer (debugging)

bash
notte sessions start -o json | jq -r '.viewer_url'
# or
notte sessions viewer

Environment variables

VariablePurpose
NOTTE_API_KEYAPI key (alternative to notte auth login)
NOTTE_SESSION_IDDefault session for page commands
NOTTE_API_URLOverride API endpoint
NOTTE_MCP_SERVER_PROTOCOLstdio or sse (only for the MCP server)

Tips

  • Always observe before click / fill / scrape. Element IDs come from observe output.
  • After every navigation, observe again — IDs are scoped to the current DOM snapshot.
  • Stop sessions you start. notte sessions stop -y skips the prompt. Idle sessions cost API budget.
  • Lightpanda + --cdp-url requires --headless=false. Otherwise the CDP server returns 500.
  • @B3 clicking the wrong element? Fall back to a Playwright selector.
  • Modals blocking clicks? notte page press "Escape" then notte page wait 500.

Troubleshooting

SymptomFix
Site keeps blocking / shows captchaRestart with --proxy --solve-captchas
Empty / partial scrapeAdd notte page wait 1000 then re-observe before scrape
@B3 clicks the wrong thingUse a Playwright selector (button:has-text('Submit'))
Lightpanda CDP returns 500Add --headless=false to sessions start
Agent stuck on a captchaStop session, restart with --solve-captchas
401 / auth errorsRe-run notte auth login or set NOTTE_API_KEY

Frequently asked questions

What does the Notte AI skill do?

Deploy browser automations as scheduled, API-callable serverless Functions — plus stealth sessions, vault-backed login, captcha solving, and natural-language agent runs via the Notte CLI. Turns any browser flow into a deterministic Bitterbot-callable endpoint, ideal for crystallized skills + dream-engine cron schedules.

Why use Notte on TypingMind?

Because you install it once and use it with any model. Notte is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Notte in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/notte. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Notte?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Notte?

As many as you like. As long as a model supports skills, you can use Notte with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Notte AI skill free?

Yes. It is published on GitHub by Bitterbot-AI under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇