A Chrome extension that brings Lucy to every webpage.
Injects an elastik panel into any webpage. AI sees what you see. You stay in control.
- iframe panel — bottom-right corner, draggable, resizable
- auto world switching — URL maps to elastik world (github.com → /github, gmail.com → /gmail)
- DOM sync — page content flows to
/{world}/resultso your AI knows what you're looking at - toggle — Ctrl+Shift+L to show/hide
- Clone this repo
- Open
chrome://extensions - Enable Developer mode (top right)
- Click Load unpacked → select this folder
- Done. Visit any webpage. Lucy is there.
Click the extension icon → set your elastik URL (default: http://localhost:3004)
Add custom URL → world mappings. Built-in defaults:
docs.google.com → /gdocs
github.com → /github
gmail.com → /gmail
figma.com → /figma
notion.so → /notion
* → /default
You browse a webpage
→ extension reads DOM text
→ POST to /{world}/result
→ your AI reads it via MCP or HTTP
→ AI writes analysis to /{world}/stage
→ extension panel renders stage
→ you see AI's response next to the webpage
All data stays on your machine. localhost:3004. Your universe.db. Your disk.
- Chrome (or any Chromium browser)
- A running elastik instance
Consent gate — First install opens an opt-in page. Nothing syncs until you explicitly accept. Non-localhost URLs trigger a second confirmation: "Page content will leave your device."
Two filter modes:
| Mode | Default behavior | You configure |
|---|---|---|
| Blacklist (default) | Syncs all sites | Domains to exclude |
| Whitelist | Syncs nothing | Domains to include |
Default blacklist (ships with extension):
*bank* *paypal* *stripe* *.gov.*
*login* *signin* *checkout* *payment* *billing*
How it works at runtime:
- content.js loads → reads
syncMode,blacklist/whitelistfromchrome.storage - Checks current domain against the active list
- Domain blocked → no panel injection, no DOM read, no POST. Complete silence.
Other safeguards:
- iframe loads via
bridge.html(extension page) — bypasses Private Network Access restrictions - DOM content defaults to localhost — never leaves your machine unless you configure a remote URL and confirm
- No telemetry. No analytics. No cloud calls.
- Panel runs in sandboxed iframe with
allow-scripts allow-same-origin allow-forms allow-popups
elastik → protocol + server (~200 lines)
elastik-extension → browser client (this repo)
Lucy is water. She flows into every crack.
MIT License. © 2026 Ranger Chen.