Inline
“Answers should grow where the question is asked — a single-file AI reading tool, zero dependencies, with all data kept local.”答案应该长在提问的地方 —— 单文件的 AI 阅读工具,零依赖,数据全在本地
- Stars
- 0
- Language
- HTML
- Created
- Oct 18, 2026
- Updated
- Oct 20, 2026
Introduction
Inline · Understand where you read
A single-file reading tool. Select text, a Q&A panel opens right there. Follow-ups stack into a chain. When you're done, collapse them: the article is an article again, with a few faint underlined notes left behind.
One Inline.html. No dependencies. Open it and read.
https://github.com/user-attachments/assets/92cc1d20-4f16-4cf7-af0c-b06a79ef4a08
中文 · English
Desktop: download and double-click · Phone: use the right button, no download, storage stays tied to the domain
Needs a DeepSeek API key — enter it once; it stays in your browser
What it's for
When you want to ask something mid-read, you have two options today:
- Leave and search. You come back and have to find the sentence again. Attention dropped once.
- Open a sidebar or a floating panel. The answer lives in a different plane, and you keep looking back and forth between two places.
Both ask you to do the same thing: carry your attention away from the text, then carry it back.
Inline makes a simpler assumption: the answer belongs wherever your attention already is.
Where your data lives
In your browser, and nowhere else.
- Article and every panel are stored in
localStorage. Refresh and they're still there. - Your API key lives in
localStoragetoo. Requests go straight from the browser to the API; there is no server in between. - Export writes the whole article plus its Q&A to Markdown.
- Backup / Import moves everything to another browser via JSON.
No account, no backend, no analytics.
Swapping the model
The model isn't hardcoded in the logic. There are two constants at the top of the file:
const API_BASE = "https://api.deepseek.com";
const API_MODEL = "deepseek-chat";
Any service exposing an OpenAI-compatible /chat/completions endpoint works. For example:
| Service | API_BASE | API_MODEL |
|---|---|---|
| DeepSeek (default) | https://api.deepseek.com | deepseek-chat |
| Qwen (DashScope) | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen-plus |
| Kimi (Moonshot) | https://api.moonshot.cn/v1 | moonshot-v1-8k |
| Local ollama | http://localhost:11434/v1 | qwen2.5:7b ¹ |
¹ Local ollama must allow the browser first, otherwise the request is blocked by CORS (you'll see Failed to fetch, which looks like a network problem):
# macOS / Linux
OLLAMA_ORIGINS=* ollama serve
# Windows
set OLLAMA_ORIGINS=*
ollama serve
* lets any web page call your local model. Fine for personal use; shut it down afterwards.
After switching, the key field should hold that provider's key.
Two known edges:
- Only the plain
chat/completionsis used — no provider-specific parameters. - A wrong model name is surfaced verbatim from the server inside the panel (with a retry).
Why it is a single file
Not a style choice — it follows from the entry point: this tool is meant to be downloaded, double-clicked and opened, not installed, configured and run. One extra step in that path and it stops working.
Three things follow at once:
- No infrastructure to distribute. Nothing to deploy, no domain to renew, no service that goes down. Sending it to someone is sending one file.
- "Your data stays in your browser" is a structural fact, not a promise. With no backend there is nowhere to upload it silently; the file is small enough to read through yourself.
- Its lifetime depends on no one. No dependencies means nothing to go stale. The file you send today still behaves the same three years from now.
The price is real: every capability has to be written here — range anchoring, offset serialization, markdown conversion, image pasting, persistence.
So the test for pulling anything in is two questions:
- If it breaks, can I fix it?
- Could I write this more correctly than it is written?
Two yeses: write it. Either no: depend on it.
And in some areas (crypto, time zones, PDF parsing) writing it myself would certainly be wrong — so we simply do not do them. Not doing it is the only dependency that never needs maintenance.
Optional: use it from DeepSeek Harness
If you work inside DeepSeek Harness, a small plugin removes the "prepare the material" step too.
dsh-inline-plugin
Then just say:
Turn https://example.com/some-article into an article /inline
Agent fetches, summarizes, writes the article
Plugin converts it to a snapshot → clipboard → opens Inline
You press Ctrl+V once
The article and your key both land in place — no file picking, no re-entering the key.
Importing a pasted snapshot is Inline's own feature, independent of the plugin — any
.inline.jsoncan be copied as text and pasted in directly.
What this deliberately doesn't do
No accounts. No cloud sync. No history. No mobile app. No backend.
No PDFs either — this is inline Q&A, and there are far cleverer ways to go about it.
License
MIT