Local-first AI chat in Chrome’s side panel. Read the current page, stream replies from LM Studio or Ollama on your machine, with optional on-device read-aloud.
- Side panel UI — click the extension icon to open; stays beside the page you’re browsing
- Multiple chat tabs — separate conversations per topic; each tab can link to a browser tab (favicon + site label)
- Browser-tab linking — new chat tabs attach to the active Chrome tab; click a chat tab to focus its linked page; linked tabs reorder with Chrome’s tab strip
- Streaming responses — tokens appear in real time with smart auto-scroll
- Markdown rendering — assistant replies render formatted text
- Profile picker — switch between enabled local AI profiles (LM Studio, Ollama) from the footer; shows profile name and loaded model when set
- Clear & refresh — reset the active chat and refresh page context
- Page context — optional URL, title, text selection, and readable DOM excerpt from the chat tab’s linked browser tab
- Context toggle — turn page reading on/off per chat from the context bar (eye icon)
- Smart inclusion — context is attached when your message implies the page (e.g. “summarize”, “this page”, “current tab”), or when you use quick actions / suggestions that request it
- Privacy ignore list — domains where page content is never read or sent (banking, etc.)
- Context-aware suggestions — starter prompts on empty chat, tuned for social, articles, docs, commerce, video, and new-tab pages
- Expandable context — view exactly what was sent to the model on user messages
Side Eye is local-only — LM Studio and Ollama on your machine. Cloud profiles (Gemini, Claude) from earlier builds are migrated away automatically.
| Profile | Where it runs | Vision (images) | MCP tools | Default |
|---|---|---|---|---|
| LM Studio | Local (localhost) |
Yes (native API) | Yes (native API) | Enabled |
| Ollama | Local (localhost) |
Yes (native API) | No | Off |
Both profiles require CORS enabled on the local server so Chrome can reach it (LM Studio: CORS toggle in Server Settings; Ollama: OLLAMA_ORIGINS env var — see setup below).
- LM Studio — OpenAI-compatible
/v1/chat/completionsfor text; vision and MCP via native/api/v1/chat - Ollama — OpenAI-compatible
/v1/chat/completionsfor text; vision via native/api/chat
- Attach up to 8 images per message (file picker or paste from clipboard)
- Images are resized to max 1536px and encoded as JPEG for smaller payloads
- Vision requires a capable local model (LM Studio or Ollama)
- On-device TTS via Supertonic 3 — models run in the browser (WebGPU when available, WASM fallback)
- Jarvis-style orb — animated speak button with audio-reactive glow while reading
- Streams speech as the assistant reply streams in
- Per-profile voice — each AI profile can use global Voice settings or its own preset, language, quality, and speed
- Models download once (~400 MB from Hugging Face); not bundled in the extension
- Dark / light theme
- Adjustable chat font size (12–22 px)
- Custom composer placeholder text
- Google Chrome 114+ (Side Panel API)
- LM Studio 0.4.0+ and/or Ollama
- For TTS: Chrome 113+ recommended (WebGPU); network access for the one-time model download
npm install
npm run buildLoad the extension:
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select the
distfolder
For development with hot reload:
npm run devThen load dist (CRXJS writes there during dev).
npm run build generates PNG icons at 16, 48, 128, 256, 512, and 1024 px in public/icons/.
- Click the Side Eye toolbar icon to open the side panel
- Pick an AI profile in the footer picker (configure profiles in Options first)
- Toggle page context (eye icon in the context bar) if you want the linked browser tab included
- Type a message and press Enter (
Shift+Enterfor a new line) - Use + in the header to add another chat tab (links to the active browser tab)
- Click a chat tab to switch conversations and focus its linked browser tab
- Open Options (right-click the extension icon → Options) for profiles, privacy, voice, and appearance
| Action | How |
|---|---|
| Send | Enter |
| New line | Shift+Enter |
| Attach images | Image button, or paste from clipboard |
| Read aloud | Speaker (orb) button — visible when TTS is enabled and models are cached |
| Quick prompts | Buttons in the context bar (configurable in Options) |
When page context is on and the domain is not ignored, Side Eye can send:
- Page URL and title
- Your text selection (if any)
- A readable excerpt from the page DOM (articles, main content, social posts, etc.)
Context tracks the linked browser tab for the active chat tab, not whichever Chrome tab happens to be focused.
Context is included when:
- You toggle it on and your message matches page-related intent (e.g. “summarize this webpage”), or
- A quick action / suggestion sends with context enabled
For local models (LM Studio, Ollama), page text is embedded in the user message so smaller models actually use it.
Open Side Eye Settings from the extension options page. A side nav jumps between sections. Changes to appearance apply live; other sections use Save settings.
| Setting | Default | Description |
|---|---|---|
| Chat font size | 14 px |
Range 12–22 |
| Chat box placeholder | What is thy bidding, my Master |
Max 120 characters |
| Theme | Dark | Dark or light |
| Setting | Default | Range | Description |
|---|---|---|---|
| Speech | Off | On / Off | Enable on-device read-aloud |
| Voice preset | M1 |
M1–M5, F1–F5 | Supertonic voice style |
| Language | en |
30+ codes | TTS language (en, ja, ko, de, …) |
| Quality steps | 4 |
4–16 | Higher = smoother, slower synthesis |
| Speech speed | 1.05 |
0.9–1.5 | 1.0 is neutral |
Setup
- Options → Voice → set Speech to On
- Wait for the download progress bar to show Ready (~400 MB, one-time)
- Adjust voice, language, steps, and speed; use Preview to test
- In the side panel, click the orb/speaker button next to Send while a reply streams
Notes
- WebGPU is used when available; WASM is slower
- Stop streaming or switch chat tabs to cancel in-progress speech
- Use Re-download models if the cache is corrupted
| Setting | Description |
|---|---|
| Ignored domains | One domain per line; subdomains match automatically |
Pages on ignored domains show a lock state in the context bar — page content is never read or sent.
Example ignore list
chase.com
mint.com
paypal.com
mail.google.com
company-internal.example.com
Rules:
- No
https://prefix needed - Lines starting with
#are ignored chase.comalso blockswww.chase.com,secure.chase.com, etc.
Enable profiles to show them in the side panel picker. Each profile has its own connection settings and optional voice override.
| Field | Default | Example |
|---|---|---|
| Server URL | http://localhost:1234/v1 |
http://localhost:1234/v1 |
| Model | (auto) | qwen2.5-7b-instruct or leave empty |
| API key | (empty) | Required if LM Studio uses API tokens |
| Temperature | 0.7 |
0.3 (focused) – 1.0 (creative) |
| Context length | 8192 |
8192, 16384, … |
| MCP servers | (none) | Toggle on in Options (e.g. Brave) |
LM Studio setup
- Open LM Studio and load a model
- Local Server → Start Server (default port
1234) - In Local Server → Server Settings, turn on CORS (required — Chrome extensions use a
chrome-extension://origin that local servers block by default) - In Side Eye Options → LM Studio → set Server URL to
http://localhost:1234/v1 - Click Load models or Test connection
LM Studio chat uses native /api/v1/chat so MCP tools can run through the same local endpoint. In Options → LM Studio → Tools, click Load from mcp.json to import server keys from LM Studio's config file (usually %USERPROFILE%\.lmstudio\mcp.json on Windows or ~/.lmstudio/mcp.json on macOS and Linux), then toggle the ones you want. Click Refresh to probe which tools are active via the API. Requires LM Studio 0.4.0+ and MCP servers configured in LM Studio.
Per-profile voice (LM Studio & Ollama)
Each profile panel includes a Voice subsection. By default it mirrors global Voice settings. Uncheck Use global voice settings to set a dedicated preset, language, quality steps, and speed for that profile.
| Field | Default | Example |
|---|---|---|
| Server URL | http://localhost:11434/v1 |
http://localhost:11434/v1 |
| Model | (select after load) | llama3.2, gemma3:12b |
| API key | (empty) | Optional |
| Temperature | 0.7 |
0.7 |
| Context length | 8192 |
8192 |
Ollama setup
ollama pull gemma3:12b
ollama serveCORS (required) — Like LM Studio, Ollama must allow browser-extension origins. Set OLLAMA_ORIGINS before starting Ollama.
Quick test from a terminal (does not persist after you stop the server):
OLLAMA_ORIGINS="*" ollama serveWindows — set OLLAMA_ORIGINS permanently
- Open Start → search environment variables → Edit environment variables for your account (or System Properties → Advanced → Environment Variables).
- Under User variables, click New (or edit an existing
OLLAMA_ORIGINS). - Variable name:
OLLAMA_ORIGINS
Variable value:* - Click OK, then fully quit Ollama (system tray → Quit) and start it again.
Or in PowerShell (current user):
[Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS", "*", "User")Restart Ollama after setting the variable.
macOS — set OLLAMA_ORIGINS permanently
-
In Terminal:
launchctl setenv OLLAMA_ORIGINS "*" -
Quit Ollama from the menu bar and reopen it.
If you run ollama serve from Terminal instead of the Ollama app:
OLLAMA_ORIGINS="*" ollama serveThe launchctl setenv value applies to GUI apps started after that command; for persistence across reboots, see the Ollama server configuration FAQ.
Vision uses Ollama’s native /api/chat. Reliable vision models include gemma3, llava, and moondream. Some gemma4 vision builds are currently broken in Ollama (issue #16597).
Configurable prompts sent immediately when clicked.
Speak button (composer orb) — default:
| Label | Prompt |
|---|---|
| Speak | tell me something random about the content of this website |
Toolbar shortcuts — defaults:
| Label | Prompt |
|---|---|
| Summarize | summarize this webpage |
| Related | list the top related websites to current tab |
| Reviews | find reviews about this webpage, service, or product |
Up to 6 toolbar quick actions. Edit labels and prompts in Options → Quick actions.
On an empty chat, Side Eye shows contextual starter chips based on the page type:
| Page type | Examples |
|---|---|
| New tab | Who is Kei?, What can you do?, Inspire me |
| Social | Summarize, Explain the discussion, What’s debated? |
| Article | TL;DR, Key takeaways, Explain simply |
| Docs | What does this cover?, How do I start? |
| Commerce | Product summary, Compare alternatives, Reviews |
| Video | Summarize video, Key points, Transcript-style summary |
Clicking a suggestion sends its prompt (with page context when appropriate).
| Data | Stays local? |
|---|---|
| Chat history | Yes — chrome.storage.local per browser window |
| Profile settings & ignore list | Synced via chrome.storage.sync |
| Optional server API keys | Yes — chrome.storage.local only (not synced) |
| Page excerpts | Read in-browser; sent only to your local model |
| LM Studio / Ollama | Traffic stays on your machine (localhost or LAN URL you configure) |
| TTS models | Downloaded once; synthesis runs on-device |
| Supertonic download | Fetched from Hugging Face when you enable Voice |
src/
├── background/service-worker.ts # LLM proxy, streaming, page context relay
├── content/page-context.ts # Content script bridge
├── sidepanel/ # Chat UI, tabs, composer, TTS orb
├── options/ # Settings page (profiles, MCP UI, voice)
└── lib/
├── agents/ # LM Studio, Ollama, OpenAI-compat clients
├── tts/ # Supertonic engine & orb visualizer
├── page-context-*.ts # Extraction, prompts, suggestions
└── storage.ts # Settings & chat persistence
public/
└── icons/ # Generated PNG icons (16–1024)
- Documentation (public): github.com/budezllc/side-eye-docs
- Extension source is maintained in a private repository.
Created by Kei Sakai — @KeiSakaiX
Public policy and support pages are hosted at getsideeye.com (privacy policy, terms, support).