Browser extension for AI-assisted macros on Chromium browsers (Chrome, Edge, Arc, Helium, etc.). Record a workflow once, then run it again from a command palette (⌘⇧P / Ctrl⇧P).
Fully local: no accounts, no Overline servers, no database, no analytics. Macros and settings live in extension storage. Recording uses bring your own key (BYOK). Requests go from your browser straight to the LLM provider you configure (OpenAI, xAI, Anthropic, Google, or any OpenAI compatible endpoint).
Requires Bun.
bun install
bun run devThen in your browser:
- Open the extensions page (i.e.
chrome://extensions) - Enable Developer mode
- Load unpacked → select the
dist/folder - After code changes, reload the extension on that page
Open Overline extension options to add your LLM provider API key before recording.
bun run build # production build → dist/
bun typecheck
bun test
bun lintPipeline: record → compile → sanitize → playback.
| Area | Role |
|---|---|
src/background/ |
Service worker: messaging, recording/compile LLM calls, playback orchestration, CDP trusted-click fallback |
src/content/ |
In-page DOM capture, element matching, step execution, shortcuts, overlay host |
src/window/ |
Command palette UI (record, run, review) |
src/options/ |
Macro list + BYOK LLM settings |
src/shared/ |
Types, storage clients, script sanitize/match, timing, LLM helpers |
src/ui/ |
Shared UI primitives and styles |
Recording and compile use LLMs, but sanitize + playback stay deterministic. Running a macro after generation does not call any LLMs and therefore behaves consistently across runs.
You give an intent (e.g. “open the owner’s profile”). Overline demonstrates that workflow once with the LLM, then compiles a reusable script.
flowchart TD
A[User intent] --> B[Record]
B --> C[Capture live DOM]
C --> D[LLM: next click / fill / wait / done]
D -->|not done| E[Execute action in page]
E --> C
D -->|done| F[Compile]
F --> G[LLM: generalize matches + run scope]
G --> H[Sanitize - deterministic cleanup grounded to the demo]
H --> I[Saved macro]
- Record: one LLM turn per step from the live DOM and intent. No separate planning pass.
- Compile: one compiled step per demo step, same order; generalizes selectors and may rewrite clicks to navigate steps where reasonable.
- Sanitize: deterministic only; drops hallucinated match fields.
Playback is separate, with no LLM: match + perform action with timing waits.
- TypeScript 7 (strict)
- React 19 for options / settings UI
- Vite +
vite-plugin-web-extension(Manifest V3) - Bun for install, scripts, and tests
- Vercel AI SDK (
ai+ provider packages) for BYOK LLM calls - Zod for schemas; Base UI + Lucide for UI