fancive140 downloadsAI-powered split-view reading: source note on the left, LLM-generated summary cards on the right with scroll-sync highlighting.
Split-view reading for Obsidian — your original note on the left, AI-generated summary cards on the right, with scroll-sync highlighting.
English · 中文
Inspired by this reading workflow demo.
MarkdownRenderer, so tables, bold, code, and wikilinks all work natively..obsidian/plugins/ (create it if it doesn't exist), and create a new folder called parallel-readerTip: Can't see the
.obsidianfolder? On macOS pressCmd+Shift+.in Finder; on Windows enable "Show hidden files" in File Explorer.
That's it! Open any note and run the command "Parallel Reader: Generate" from the command palette (Cmd/Ctrl+P).
| Provider | Notes |
|---|---|
| Anthropic | Default, recommended |
| OpenAI | GPT models |
| Google Gemini | Gemini models |
| OpenRouter / Groq / DeepSeek / Moonshot / ... | OpenAI-compatible |
| Ollama / LM Studio | Local models, no API key needed |
| Custom endpoint | Any OpenAI or Anthropic compatible API |
If you have Claude Code or Codex installed locally, you can use them as backends instead of API keys. Just switch the backend in settings — the plugin automatically detects common install locations. If auto-detection fails, you can manually enter the path in settings.
| Action | Effect |
|---|---|
| Click a card | Jump editor to that section |
| Right-click a card | Context menu: copy, edit, delete, jump to source |
| Scroll the editor | Right-side card auto-highlights |
Alt+↑ / Alt+↓ |
Navigate between cards |
Enter in summary pane |
Jump to active card's source line |
| Ribbon icon | Open the parallel reader pane |
| File context menu | Generate / regenerate / clear cache |
The LLM returns structured JSON:
{
"cards": [
{
"title": "Short heading",
"anchor": "Verbatim quote from source for positioning",
"gist": "One-sentence lead-in",
"bullets": ["Supporting detail 1", "Supporting detail 2"]
}
]
}
Anchor is the key mechanism — a verbatim quote that the plugin locates via indexOf with multi-level fallbacks, keeping scroll-sync working without relying on headings.
Gist + bullets gives both overview and scannable detail — pure prose felt like a wall of text, pure bullets felt fragmented.
npm install
npm run dev # watch mode
npm run build # production build
npm run typecheck # TypeScript strict mode
npm run lint # Biome
npm test # build + typecheck + tests
npm run test:unit
npm run test:component
npm run test:contract
npm run test:e2e # packaged plugin + disposable Vault smoke
For CI / release evidence, run the contract gate:
bash .e2e/gate.sh --json # writes .e2e/artifact.json (gitignored)
Add TEST_LIVE=1 to opt into real local Vault / provider checks.