Collect fragments from across your tabs. Weave them into cited reports, rewrites, diagrams and fact-checks.
An open-source, LLM-native Chrome extension for researchers, analysts, and knowledge workers.
Features · Workflow · Install · Providers · Under the hood · Docs · FAQ
Weft does not silently turn the active tab into your research topic. Webpages are collection points; the user-curated Session is the research scope. Every synthesized claim is traceable back to its exact source passage.
Weft was created by @Wotchin to solve a painful, daily reality: collecting data snippets across many browser tabs is slow, error-prone, and un-citable. Weft fixes that — and adds an LLM-native synthesis layer on top.
Every synthesized fact carries a citation marker back to the exact snippet and source page.
[S#] points to a passage you saved; [W#] points to a verified web-search excerpt.
Click any marker to jump straight to the source. No more "where did the model get that from?"
A Session is your curated research scope. Ask questions across what you intentionally saved, then extend it via Deep Search to find primary sources, counterpoints, and updates. Weft never silently promotes the active tab into scope.
Sessions can be exported as readable HTML and imported back into Weft. New exports carry a versioned, inert data envelope that preserves portable text, source, PDF and Smart Read metadata; external image references are restored as safe links instead of being fetched automatically. Older Weft HTML exports are accepted in a safe best-effort mode when their visible structure can be recognized.
Works with OpenAI, Anthropic, Gemini, DeepSeek, Moonshot, Qwen, local Ollama, any OpenAI-compatible endpoint, or Chrome's built-in on-device AI (no key needed). Your key and your snippets stay on your machine — they only ever travel to the endpoint you choose.
Deep Search now runs a bounded, provider-neutral JSON action loop. It starts
with local Session retrieval, can use a dependency-free calculator, and only
asks for an external search when it finds a material evidence gap. Every
external query is shown for review or editing before it runs. There is no
general browser automation, arbitrary clicking, or form submission; without a
search provider, it remains Session-only and makes no web-search request (model
calls still follow the LLM configured in Settings). External excerpts
are cited as [W#] alongside [S#] Session evidence.
Run Smart Read on an article or a text-layer HTTP(S) PDF to build a new focused
Session from key passages. Every quoted passage is checked against the extracted
source before it is saved, so hallucinated evidence is silently dropped. PDF
passages retain their page number and citations reopen that page in Chrome. On
link-heavy pages, tell Weft what matters first and it shortlists only the visible,
relevant links. Weft coexists with Chrome's built-in viewer; a replacement viewer
that changes the tab to another extension's private chrome-extension:// URL
cannot be read across Chrome's extension boundary.
One-click scenarios turn raw snippets into specific deliverables: Report · Rewrite · Verify · Summarize · Compare · Extract · Table · Translate · Diagram (Mermaid).
Snippets live in chrome.storage.local / IndexedDB.
No telemetry, no account, no third-party tracking. Weft talks only to the
provider endpoint you configure — there is no Weft server in the path.
See PRIVACY.md.
Interface available in English and 简体中文. AI replies can be requested in 9 languages (adds French, German, Spanish, Japanese, Korean, Portuguese, Russian) — picking one of those keeps the English interface and only changes the answer language.
flowchart LR
A[1. Smart Read<br/>verified extraction] --> B[2. Collect<br/>text · image · link]
B --> C[3. Synthesize<br/>Report · Rewrite · Verify · Diagram]
C --> D{Need more<br/>evidence?}
D -- yes --> E[4. Deep Search<br/>review each web query]
E --> C
D -- no --> F["5. Trace<br/>click [S#]/[W#] to source"]
C --> F
- Read —
Smart Readan article or text-layer PDF to seed a focused Session. Web passages can be highlighted in place; PDF passages reopen at their source page because Chrome's native PDF viewer cannot accept Weft DOM highlights. - Collect — right-click or use the selection toolbar to save more text / image / link snippets.
- Synthesize — open the Workbench side panel; ask the Session a question, or pick a scenario.
- Deep Search — start from a Session question; if the Agent needs outside evidence, review or edit each proposed web query before it runs.
- Trace — click any citation to open its source passage or external link.
The installer also embeds this clip on the welcome page so new users can watch the core flow before configuring anything.
Available soon on the Chrome Web Store. Until then, use the dev build below.
- Download the latest
weft-<version>.zipfrom Releases and unzip it, or clone this repo. - Open
chrome://extensions→ enable Developer mode. - Click Load unpacked → select the unzipped folder (or this repo).
- Open Settings → pick a provider → paste your key (or pick Ollama / Chrome built-in AI) → Test Connection.
💡 Pin Weft to the toolbar, then open it via the side panel (right-click the icon → Open side panel) for a persistent Workbench.
| Provider | Key needed | Notes |
|---|---|---|
| OpenAI | ✅ | GPT-4o / o-series, vision supported |
| Anthropic | ✅ | Claude 3.5 Sonnet / Haiku |
| Google Gemini | ✅ | Multimodal |
| DeepSeek | ✅ | Cheap reasoning |
| Moonshot (Kimi) | ✅ | Long context |
| Qwen (Alibaba) | ✅ | via DashScope OpenAI-compatible mode |
| Ollama | ❌ | Local, fully offline |
| OpenAI-compatible | ✅ | Any endpoint exposing the OpenAI schema |
| Chrome built-in AI | ❌ | On-device; nothing leaves your browser |
Base URL and model name are pre-filled per provider and fully overridable in Settings.
Weft is intentionally vanilla JS, Manifest V3, no build step, no framework. What you see is what runs in the browser.
| Layer | Files | Role |
|---|---|---|
| UI / Workbench | chat.js, popup.js, settings.js, onboarding.js |
Side panel, popup, settings, onboarding |
| Rendering | markdown.js, lib/render.js, lib/diagram-generator.js |
Markdown + citation + Mermaid rendering |
| LLM layer | lib/llm-client.js, lib/providers.js |
Multi-provider chatting, JSON mode, streaming |
| Retrieval | lib/rag-engine.js, lib/rag-indexer.js, lib/bm25.js, lib/vector-index.js, lib/tokenizer.js |
Hybrid BM25 + embedding RAG |
| Extraction | lib/page-extractor.js, lib/pdf-extractor.js, lib/smart-read.js, lib/highlighter.js |
Web/PDF extraction, source verification, on-page highlighting |
| Agent | lib/agent-runner.js, lib/agent-tools.js |
Bounded JSON actions, local Session retrieval and deterministic calculations |
| Search | lib/search-provider.js |
User-approved SearXNG / Tavily / Brave searches |
| Persistence | lib/store.js, lib/idb.js |
chrome.storage + IndexedDB sessions, chat, images |
| i18n | lib/i18n.js, _locales/ |
UI + AI-output language |
| Safety | lib/sanitize.js, lib/citations.js |
HTML sanitization, citation contract |
| Background | background.js, content-assist.js |
Service worker, page-level content scripts |
- Hybrid RAG with token-budget-aware retrieval (
rag-engine.js) — picks the right evidence without blowing the context window. - Source verification before any Smart Read snippet is saved —
smart-read.jsrejects quoted passages not found in the rendered source, so hallucinated evidence never enters your Session. - Concurrency-safe storage —
lib/store.jsserializes all session writes via Web Locks (+ a cross-context promise queue), so the side panel, popup, and service worker cannot trample each other. - Stream-safe, recoverable chat —
processStreaminchat.jshandles truncation recovery and maps streaming tokens to citation indices without re-parsing per token. - Citation contract —
lib/citations.jsenforces a strict marker grammar ([S#],[W#]), keeping every AI claim auditable. - Prompt hygiene — internal scenario prompts are never persisted or echoed back; only the user-facing intent label is stored (see
chat.js↔lib/store.js).
| Topic | File |
|---|---|
| 📜 Privacy policy | PRIVACY.md |
| 🤝 Contributing guide | CONTRIBUTING.md |
| 📋 License (AGPL-3.0) | LICENSE |
| 🚦 CI / CD | .github/workflows/ci.yml, .github/workflows/release.yml |
Does Weft send my data to anyone?
No. Snippets and your key stay in chrome.storage.local / IndexedDB. The only time snippet/text content leaves your machine is when you run a synthesis action — and it goes only to the LLM provider you configured. See PRIVACY.md.
Can I use this without an API key? Yes — pick Ollama (local LLM) or Chrome built-in AI (on-device) in Settings. Nothing leaves your machine.
Does it work in Firefox / Edge? Currently Chrome/Chromium-only. We track MV3 cross-browser compatibility and will add Edge/Firefox when their side-panel APIs stabilize.
Is it free? Yes. The extension is free and open source under AGPL-3.0, and the bring-your-own-key workflow will stay that way. The only thing you pay for is your own model provider.
PRs and issues are very welcome! Weft is vanilla-JS MV3, so the dev loop is fast:
npm install # dev tooling only (eslint, prettier)
npm run check # validate manifest + lint + unit tests
npm run format # prettier
npm run pack # build the store-ready zip (needs the `zip` command)See CONTRIBUTING.md for details, and open an issue if you want to discuss a feature before coding.
If Weft saves you time, please star this repo — it helps other researchers discover it, and keeps the project maintained.
GNU Affero General Public License v3.0 © @Wotchin.
You can use, modify and self-host Weft freely. AGPL-3.0 asks that if you distribute a modified version — or run one as a network service — you publish your changes under the same licence.
If your organisation cannot accept copyleft terms, a separate commercial licence is available: get in touch.
Built with ❤️ for everyone who collects evidence across too many tabs.