Skip to content

reybahl/overline

Repository files navigation

Overline

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).

Local development

Requires Bun.

bun install
bun run dev

Then in your browser:

  1. Open the extensions page (i.e. chrome://extensions)
  2. Enable Developer mode
  3. Load unpacked → select the dist/ folder
  4. After code changes, reload the extension on that page

Open Overline extension options to add your LLM provider API key before recording.

Other useful commands

bun run build      # production build → dist/
bun typecheck
bun test
bun lint

Architecture

Pipeline: 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.

How the agent works

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]
Loading
  • 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.

Stack

  • 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

About

Command palette for the web. Create your own macros and map them to keyboard shortcuts, with just a prompt.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors