[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80160":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":14,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":15,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":44,"readmeContent":45,"aiSummary":46,"trendingCount":16,"starSnapshotCount":16,"syncStatus":47,"lastSyncTime":48,"discoverSource":49},80160,"synto","kytmanov\u002Fsynto","kytmanov","More than just Karpathy’s LLM Wiki, 100% local with Ollama. Drop Markdown notes → AI extracts concepts → your Obsidian wiki auto-links and grows. Zero sharing. Your notes stay yours.","",null,"Python",118,8,1,6,0,17,63,59.66,"MIT License",false,"master",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"git-based-wiki","karpathy","knowledge-base","llm-knowledge-base","llm-pipeline","llm-tools","llm-wiki","local-first-ai","local-llm","markdown-wiki","obsidian","obsidian-llm","obsidian-wiki","ollama","personal-knowledge-management","pkm","rag-alternative","rag-local","second-brain","self-hosted-wiki","2026-06-12 04:01:26","# Synto\n\n\u003Cp align=\"center\">\n     \u003Ca href=\"https:\u002F\u002Fpepy.tech\u002Fprojects\u002Fsynto\">\u003Cimg alt=\"PyPI downloads\" src=\"https:\u002F\u002Fstatic.pepy.tech\u002Fbadge\u002Fsynto\">\u003C\u002Fa>\n     \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkytmanov\u002Fsynto\u002Fcommits\u002Fmaster\">\u003Cimg alt=\"GitHub last commit\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flast-commit\u002Fkytmanov\u002Fsynto?style=flat\">\u003C\u002Fa> \n     \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkytmanov\u002Fsynto\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg alt=\"CI status\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fkytmanov\u002Fsynto\u002Fci.yml?style=flat&amp;label=CI\">\u003C\u002Fa> \n     \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fsynto\u002F\">\u003Cimg alt=\"PyPI version\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fsynto?style=flat\">\u003C\u002Fa>\n     \u003Ca href=\"https:\u002F\u002Ftip.md\u002Fkytmanov\">\u003Cimg alt=\"Tip in Crypto\" src=\"https:\u002F\u002Ftip.md\u002Fbadge.svg\" height=\"20\">\u003C\u002Fa>\n     \u003Ca href=\"https:\u002F\u002Fbuymeacoffee.com\u002Fkytmanov\">\u003Cimg alt=\"Buy Me A Coffee\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBuy%20Me%20a%20Coffee-%E2%98%95-yellow?style=flat&logo=buymeacoffee&logoColor=white\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Ca href=\"#install\">Install\u003C\u002Fa> · \u003Ca href=\"#quick-start\">Quick start\u003C\u002Fa> · \u003Ca href=\"#how-it-works\">How it works\u003C\u002Fa> · \u003Ca href=\"#features\">Features\u003C\u002Fa> · \u003Ca href=\"#use-cases\">Use cases\u003C\u002Fa> · \u003Ca href=\"#provider-support\">Provider support\u003C\u002Fa> · \u003Ca href=\"#whats-in-a-pack\">What's in a pack\u003C\u002Fa>\n\u003C\u002Fp>\n\n**Turn your raw notes into a self-improving, interlinked wiki — powered by a local LLM.**\n\nYou drop Markdown notes in a folder. Synto reads them with a local LLM, extracts the concepts they contain, and writes one cross-linked article per concept. Every note you add makes the wiki richer. Every article stays on your machine unless you decide otherwise.\n\nAfter setup (~5 minutes) you have: a structured wiki built from your notes, a queryable knowledge base that works without embeddings or a vector database, and an agent-ready pack that Claude, Cursor, or any file-aware AI can install and reason over — including reading your sources' exact words on demand over MCP.\n\n\u003Cp align=center>\n\u003Cimg width=\"341\" height=\"463\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fb3e13203-bb4a-42a4-a16d-0d4d93404f71\" \u002F>\n\u003C\u002Fp>\n\n> [!NOTE]\n> Synto succeeds [obsidian-llm-wiki-local](https:\u002F\u002Fgithub.com\u002Fkytmanov\u002Fobsidian-llm-wiki-local) (608 ★, 9k+ downloads) — same proven local pipeline, redesigned for distributable knowledge packs.\n\n---\n\n## The idea\n\n[Andrej Karpathy](https:\u002F\u002Fkarpathy.ai) described it as the LLM Wiki: a personal knowledge base where the model doesn't just store what you tell it — it synthesizes, cross-references, and keeps everything current. You add raw material; it does the bookkeeping.\n\nThe key insight: **treat your notes as source material, not as the final artifact.** A raw note is a claim about the world. A wiki article is the compiled, cross-linked explanation of a concept derived from many notes. The LLM does the compilation step.\n\n```\nYou write raw notes  →  LLM extracts concepts  →  Wiki articles grow  →  Agent-ready pack\n      raw\u002F                    (automatic)              wiki\u002F                   pack\u002F\n  quantum.md           \"Qubit\", \"Superposition\"     Qubit.md\n  ml-basics.md         \"Neural Net\", \"SGD\"          Superposition.md ←── [[wikilinks]]\n  physics.md           \"Qubit\"  ← same concept      Neural_Network.md\n                              │\n                     Duplicates merge, not multiply.\n                     One article per concept, fed by all relevant notes.\n```\n\nUnlike a chatbot that forgets, the wiki **persists and compounds**. Every note you add and every draft you review makes it smarter.\n\n---\n\n## How it works\n\nFour stages. Two LLM tiers.\n\n```\n┌────────────────────────────────────────────────────────────────────────┐\n│  Stage 1: Import  Stage 2: Ingest  Stage 3: Compile  Stage 4: Export  │\n│                                                                        │\n│  synto add ─────┐                                                      │\n│  (PDF\u002Fmd\u002Ftxt)   ├─ raw\u002F*.md ──────► wiki\u002F.drafts\u002F ──────► pack\u002F       │\n│  .synto\u002Fsources\u002F┘  fast model       heavy model      agent-ready      │\n│                    (4B params)      (14B+ params)     directory        │\n│                                                                        │\n│  archives:         extracts:        writes:           produces:       │\n│  · original file   · concepts       · one article     · INDEX.json    │\n│  · segments        · summaries        per concept     · AGENTS.md     │\n│  · source type     · relationships  · cross-linked    · CLAUDE.md     │\n│                    · language         [[wikilinks]]   · articles\u002F     │\n│                                     · source-type                     │\n│                                       prompt                          │\n└────────────────────────────────────────────────────────────────────────┘\n```\n\n**Why two LLM tiers?** Analysis is pattern-matching — a 4B model running locally can extract \"this note is about Qubit, Superposition, and Entanglement\" reliably and fast. Writing a coherent, cross-linked article requires more reasoning — a 14B+ model does this well. Splitting the work keeps the pipeline cheap and fast on consumer hardware.\n\n**Your vault layout after `synto init`:**\n\n```\n~\u002Fmy-wiki\u002F\n  raw\u002F              ← drop your notes here (Synto never modifies these)\n  wiki\u002F             ← published articles (Obsidian-compatible Markdown)\n    .drafts\u002F        ← LLM-generated articles waiting for your review\n    sources\u002F        ← per-note source summary pages\n    queries\u002F        ← saved Q&A sessions\n    synthesis\u002F      ← synthesized answers published as wiki pages\n  .synto\u002F\n    state.db        ← SQLite: note lifecycle, concept registry, metrics\n    sources\u002F        ← originals archived via synto add (PDF, md, txt)\n  synto.toml        ← vault config (provider, models, pipeline settings)\n  pack\u002F             ← agent-ready export (created by synto pack export)\n```\n\n### Key mechanisms\n\n**Incremental compilation.** Change one note — only the articles derived from that note recompile. A vault with 200 notes doesn't restart from scratch on every run.\n\n**Rejection feedback loop.** Reject a draft and explain why. The reason is stored and injected into the LLM prompt the next time that concept compiles, so the model can address it. Five rejections without an approval auto-blocks the concept until you re-enable it.\n\n```bash\nsynto reject wiki\u002F.drafts\u002FQubit.md --feedback \"Too abstract, needs a hardware analogy\"\n# next compile: prompt includes your feedback → better draft\n```\n\n**Confidence scores.** Each compiled draft gets a confidence score (0–1). Approve selectively or set a threshold — drafts below it stay in `.drafts\u002F` for manual review.\n\n```bash\nsynto verify --min-confidence 0.8               # mark trusted drafts as verified\nsynto approve --min-confidence 0.8              # publish reviewed or fresh drafts to wiki\u002F\n```\n\n**Three-state lifecycle.** Drafts move through `draft` → `verified` → `published`. `synto verify` marks a reviewed draft as `verified` in place (frontmatter `status: verified`, file stays in `.drafts\u002F`). `synto approve` publishes drafts to `wiki\u002F`, preserving the existing publish workflow while allowing an explicit staged review step.\n\n**Hand-edit protection.** Edit a published article in Obsidian or any editor. Synto tracks a SHA-256 content hash and detects your change on the next run — your edits are never overwritten by a recompile.\n\n**No embeddings, no vector database.** `synto query` routes questions to relevant articles using `INDEX.json`. It works on any machine without a GPU, FAISS, or Chroma.\n\n**Source-type analysis.** Imported documents carry a type — `notes`, `textbook`, `paper`,\n`spec`, `api_docs`, `web_article`, `corp_docs`, `transcript`, or `unknown_text`. During ingest\nanalysis the fast model receives a matching system prompt: a `paper` prompt extracts\nabstract\u002Fmethods\u002Fresults structure; an `api_docs` prompt preserves parameter names; a\n`textbook` prompt follows chapter\u002Fdefinition flow. If `--type` is omitted, Synto infers it\nfrom the file extension.\n\n---\n\n## Use cases\n\n**Architectural reference from a textbook**\n\n[@dobryakov](https:\u002F\u002Fgithub.com\u002Fdobryakov) turned Tanenbaum's *Distributed Systems* into a cross-linked wiki and used it as context for Claude\u002FCursor. Instead of falling back to generic integration advice, the AI started reasoning from distributed-systems concepts like persistent messaging, idempotency, eventual consistency, and two-phase commit when designing a production-grade event-driven architecture. Read the write-up: [Book-as-context](https:\u002F\u002Fwww.dobryakov.com\u002Fhowto\u002Fbook-as-context.html). Any technical book, spec, or documentation set can become a live context layer for your AI tools.\n\n**Course material as a wiki**\n\n[Andrej Karpathy's LLM Wiki idea](https:\u002F\u002Fgist.github.com\u002Fkarpathy\u002F442a6bf555914893e9891c11519de94f) works well for learning. Start with lectures, transcripts, and notes from a course like Karpathy's neural-network series. Instead of searching through raw files every time you ask a question, Synto turns them into a linked wiki that grows as you add more material. Then an agent can answer questions about backpropagation, attention, or training using your own course material. Good answers can also be saved back into the wiki, so it becomes more useful over time.\n\n**Your own research notes**\n\nWorks today with Markdown. Drop notes in `raw\u002F`, run `synto run`, and get a cross-linked wiki exported as an agent-ready pack. Expose it via `synto serve` as a local MCP server, or ship the pack directory for any file-aware agent to use.\n\n---\n\n## Features\n\n**Incremental compiles.** Each concept gets its own article. When you change a source note, only the articles tied to that note recompile — not the whole vault.\n\n**Rejection feedback.** Reject a draft and attach a reason. The next compile of that concept includes your feedback in the prompt. Five rejections without an approval auto-blocks the concept until you run `synto unblock`.\n\n**Hand-edit protection.** Edit any published article directly. Synto tracks a content hash — if the file changed since last compile, it won't overwrite your work.\n\n**Interactive review.** `synto review` opens a terminal UI per draft: read the article, approve, reject with feedback, launch your editor, or diff against the previous version. Full control over what enters your wiki.\n\n**File watcher.** `synto watch` runs in the background and processes anything you drop into `raw\u002F` automatically. Ingest and compile happen while you keep writing.\n\n**Query and synthesize.** `synto query \"what is X?\"` answers from your published wiki without embeddings or a vector database. Add `--synthesize` to save the answer as a permanent wiki page with source citations and hand-edit protection.\n\n**Pack export.** `synto pack export --target agents` produces a portable directory any file-aware agent can read: articles, `INDEX.json` for fast concept lookup, source provenance, and agent-readable entry points.\n\n**MCP server.** `synto serve` exposes your wiki as a local MCP server with 12 tools. Eight cover the published wiki: `list_articles`, `read_article`, `find_concept`, `search_articles`, `get_concept`, `list_sources`, `trace_lineage`, and `answer_question`. Four more (below) expose the raw source text. Wire it into Claude Code, Cursor, or any MCP-compatible client in one command. Drafts are hidden by default; `answer_question` runs the same routed query as `synto query` end-to-end (uses both fast and heavy models), so it may cost money on paid providers.\n\n### Verbatim source tools\n\nFour additional MCP tools expose raw source paragraphs to frontier-model callers.\nUse them when you want the source's own words, not a synto-generated synthesis.\n(For a ready-made answer from your own local models instead, use `answer_question`.)\n\n- `read_source_segment(segment_id)` — fetch one paragraph by id.\n- `search_source_segments(query, limit=10)` — BM25 search across raw segments.\n- `get_source_passages(concept_name, max_passages=5)` — verbatim passages backing\n  a known concept.\n- `list_segments(source_id, limit=200, offset=0)` — enumerate a source's segments\n  in reading order.\n\n#### Privacy and source access\n\nRaw-paragraph access is governed by `[mcp.source_access]` in `synto.toml`:\n\n```toml\n[mcp.source_access]\nmode = \"permissive_only\"  # \"all\" returns every segment; \"deny\" disables raw-passage tools\npermissive_licenses = [\"CC-BY\", \"CC-BY-SA\", \"MIT\", \"Apache-2.0\", \"BSD-3-Clause\", \"public-domain\"]\n```\n\n- **`permissive_only`** (default) — only sources whose `license` is in\n  `permissive_licenses` return raw text; everything else is hidden.\n- **`all`** — every segment is returned. Use for a private personal vault where you\n  trust the connected MCP client.\n- **`deny`** — the four verbatim tools refuse all raw passages.\n\n**Legacy-vault behavior (important).** A vault with no declared license on any source\ncannot return anything under `permissive_only`, so to keep the feature working `synto`\ntreats such vaults as `\"all\"` until you declare a license or set `mode` explicitly. That\nmeans **all raw source text is readable by any connected MCP client.** This is surfaced as\na WARNING at `synto serve` startup and in `synto doctor`. If your vault holds private or\ncopyrighted material, declare licenses on your sources or set `mode` explicitly, then\nrestart `serve`.\n\n**Audit detail.** `[mcp] audit_detailed` (default `false`) keeps query text and resolved\nlabels as 8-char hashes in the local state DB. Set it to `true` only if you want the\n`synto doctor --backlog` report to show literal query text — it writes raw queries to the\nDB. The backlog report works either way.\n\n**SQLite without FTS5.** If your SQLite build lacks the FTS5 module, the search index is\nskipped on upgrade (with a warning) and only `search_source_segments` is unavailable; the\nother three verbatim tools and every other command keep working.\n\n**Self-maintenance.** `synto maintain` repairs broken wikilinks, creates stubs for missing targets, and reports orphans, stale articles, and missing frontmatter. `--dry-run` shows the structural-health report without changing anything.\n\n**A\u002FB model comparison.** `synto compare` runs your query set against two different models in isolated copies of your vault so you can evaluate a model switch without touching anything live.\n\n**Quality evaluation.** `synto eval` scores your wiki offline: concept coverage, citation support, link resolution, `INDEX.json` validity. Run it before a pack export or in CI.\n\n**Diagnostics.** `synto doctor` checks your configuration, provider connectivity, and vault integrity — start here when something isn't working.\n\n**Multi-language.** Each note's language is auto-detected at ingest. Articles are written in that language. No hard-coded word lists or language config required.\n\n**Git-aware.** Every automatic operation commits with a `[synto]` prefix. `synto undo` reverts the last N auto-commits. Raw notes are never modified.\n\n**Source import.** `synto add` imports PDFs, Markdown, and text files as tracked source\ndocuments. PDFs are segmented into heading-aware chunks, archived under `.synto\u002Fsources\u002F`,\nand written back as canonical `raw\u002F*.md` notes for the normal ingest flow. Pick the right\ntype for your document to get the matching ingest-analysis prompt:\n\n| Type | Use for |\n|---|---|\n| `notes` | Your own notes, meeting minutes, personal writing |\n| `textbook` | Educational material with chapters and exercises |\n| `paper` | Academic papers (abstract \u002F methods \u002F results) |\n| `spec` | Technical specifications, RFCs, standards |\n| `api_docs` | API references, SDK docs, OpenAPI specs |\n| `web_article` | Blog posts, news articles, web clips |\n| `corp_docs` | Internal wikis, runbooks, design documents |\n| `transcript` | Video\u002Faudio transcripts, interview notes |\n| `unknown_text` | Fallback when text doesn't fit a richer source type |\n\n**Compile lineage.** Every compiled article records which source notes and compile run it\ncame from. `synto trace article \u003Cname>` prints the full history: timestamp, model,\ncontributing sources.\n\n**LLM response cache.** Identical prompts reuse cached responses from a local SQLite\ntable instead of hitting the model. `synto maintain --clear-cache` flushes it;\n`--older-than N` prunes entries older than N days.\n\n**Pack extension flag.** `synto add --extend-pack NAME` is reserved for future pack-scoped\nimports. In `v0.2.0` it is intentionally a safe no-op and does not mutate `synto.toml`.\n\n---\n\n## Install\n\nRequires **Python 3.11+** and an LLM provider ([Ollama](https:\u002F\u002Follama.com) recommended for local use).\n\n```bash\npip install synto\n# or\nuv tool install synto\n```\n\nThe MCP server (`synto serve`) ships in the base install — no extras flag needed.\n\n---\n\n## Quick start\n\n### 1. Pull models\n\n```bash\n# Install Ollama: https:\u002F\u002Follama.com\u002Fdownload\nollama pull gemma4:e4b      # fast model — analysis and concept extraction\nollama pull qwen2.5:14b     # heavy model — article writing\n```\n\n> **Minimal setup:** pull only `gemma4:e4b` and assign it to both fast and heavy in the wizard below. Enough to get started.\n\n### 2. Run the setup wizard\n\n```bash\nsynto setup\n```\n\nAn interactive wizard selects your provider, configures the endpoint, picks models, and optionally sets a default vault. Takes about 30 seconds.\n\n```\n╭──────────────────────────────────────────────╮\n│         synto  ·  setup                      │\n╰──────────────────────────────────────────────╯\n\n  Step 1  Provider\n\n    Local (no API key needed):\n      1. Ollama         http:\u002F\u002Flocalhost:11434  [default]\n      2. LM Studio      http:\u002F\u002Flocalhost:1234\u002Fv1\n      3. vLLM           http:\u002F\u002Flocalhost:8000\u002Fv1\n      ...\n    Cloud (API key required):\n      9. Groq           https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\n     10. Together AI    https:\u002F\u002Fapi.together.xyz\u002Fv1\n      ...\n\n    Select provider [1]: _\n\n  Step 2  Fast model  (analysis · 3–8B recommended)\n    1  gemma4:e4b    2  phi4-mini    3  other\n    Select [1]: _\n\n  Step 3  Heavy model  (writing · 14B+ recommended)\n    1  qwen2.5:14b   2  same as fast   3  other\n    Select [1]: _\n```\n\nSettings are saved to `~\u002F.config\u002Fsynto\u002Fconfig.toml`. API keys are stored only in this user-private file, never inside your vault.\n\n### 3. Create a vault\n\n```bash\nsynto init ~\u002Fmy-wiki\n```\n\nCreates the folder structure and a `synto.toml` pre-filled with your wizard settings.\n\n### 4. Add notes and sources\n\nDrop any `.md` files into `~\u002Fmy-wiki\u002Fraw\u002F`. Web clips, book notes, meeting notes, transcripts — anything.\n\n```\n~\u002Fmy-wiki\u002Fraw\u002F\n  quantum-computing.md\n  ml-fundamentals.md\n  distributed-systems-chapter3.md\n```\n\n**To import a PDF or other structured document:**\n\n```bash\nsynto add paper.pdf --type paper --vault ~\u002Fmy-wiki\nsynto add textbook_chapter.pdf --type textbook --vault ~\u002Fmy-wiki\nsynto add api-reference.md --type api_docs --vault ~\u002Fmy-wiki\n```\n\nUse `--type` to select the matching ingest-analysis prompt (see the table in Features).\nIf omitted, the type is inferred from the file extension.\n\n`synto add --force` re-imports an existing source in place. `--extend-pack` is reserved for\nfuture pack integration and currently reports a safe no-op.\n\n### 5. Run the pipeline\n\n```bash\nsynto run --vault ~\u002Fmy-wiki\n```\n\nIngest + compile. Drafts appear in `wiki\u002F.drafts\u002F`. Then review and publish:\n\n```bash\nsynto review --vault ~\u002Fmy-wiki                    # inspect each draft: approve \u002F verify \u002F reject \u002F edit\n# or\nsynto verify --all --vault ~\u002Fmy-wiki              # mark all drafts verified in place\nsynto approve --all --vault ~\u002Fmy-wiki             # publish drafts to wiki\u002F\n```\n\n**One-command flow** (skip review):\n```bash\nsynto run --auto-approve --vault ~\u002Fmy-wiki\n```\n\n**Set-it-and-forget-it** (auto-process every time you save a note):\n```bash\nsynto watch --vault ~\u002Fmy-wiki\n```\n\n**Query your wiki** once articles are published:\n```bash\nsynto query \"what is consistent hashing?\" --vault ~\u002Fmy-wiki\nsynto query \"explain backpropagation\" --vault ~\u002Fmy-wiki --synthesize\n```\n\n**Expose as MCP server** (Claude Code, Cursor, any MCP client):\n```bash\nsynto serve --vault ~\u002Fmy-wiki\n```\n\n---\n\n## Provider support\n\n| Local (offline, no API key) | Cloud (API key required) |\n|---|---|\n| Ollama | Groq |\n| LM Studio | Together AI |\n| vLLM | Fireworks AI |\n| llama.cpp | DeepInfra |\n| LocalAI | OpenRouter |\n| TGI | Mistral AI |\n| SGLang | DeepSeek |\n| Llamafile | SiliconFlow |\n| Lemonade | Perplexity |\n| | xAI (Grok) |\n| | Azure OpenAI |\n| | Custom OpenAI-compatible |\n\nAny OpenAI-compatible endpoint works. Use `synto setup` to configure interactively, or edit `~\u002F.config\u002Fsynto\u002Fconfig.toml` directly.\n\n---\n\n## What ships now\n\n- Full ingest → compile → approve pipeline; supports Markdown notes and Obsidian vaults\n- `synto pack export --target agents` — portable knowledge pack with `INDEX.json` and agent metadata\n- `synto serve` — MCP server with 12 tools. Eight wiki tools: `list_articles`, `read_article`, `find_concept`, `search_articles`, `get_concept`, `list_sources`, `trace_lineage`, `answer_question`. Four verbatim-source tools: `search_source_segments`, `get_source_passages`, `read_source_segment`, `list_segments`. Quality signals (`status`, `confidence`, `source_count`, `single_source`) are surfaced on every article ref so agents can self-filter; `min_status` defaults to `\"published\"` to keep drafts out of agent context.\n- `synto doctor --backlog` — reads the MCP audit log to show what to ingest next: zero-result queries, single-source concepts in active demand, and the verbatim-vs-`answer_question` tool mix.\n- `synto query` — index-routed Q&A with optional synthesis to `wiki\u002Fsynthesis\u002F`\n- `synto review` — interactive draft review: approve, reject, edit, or diff before publishing\n- `synto watch` — file watcher: auto-ingest and compile on every save\n- `synto maintain` — wiki health check, stub creation, orphan cleanup\n- `synto eval` — offline structural evaluation (coverage, citation support, link resolution)\n- `synto compare` — A\u002FB model comparison without touching your vault\n- `synto doctor` — configuration and connectivity diagnostics\n- Multi-language: notes are ingested and compiled in their source language\n- 20+ LLM providers supported via OpenAI-compatible API\n- `synto add SOURCE` — import PDF, Markdown, or text files as tracked source documents;\n  PDFs are segmented automatically into heading-aware chunks and written back as canonical raw notes\n- Source-type prompts: built-in templates for `notes`, `textbook`, `paper`, `spec`,\n  `api_docs`, `web_article`, `corp_docs`, `transcript`, plus `unknown_text` fallback,\n  select the optimal ingest strategy per document type\n- Compile lineage: every article records its source notes and compile run;\n  `synto trace article \u003Cname>` shows the full history\n- LLM response cache: identical prompts reuse cached responses;\n  `synto maintain --clear-cache` manages it\n\n---\n\n## What's in a pack\n\n```\npack\u002F\n  articles\u002F           one Markdown file per concept\n  index\u002F\n    INDEX.json        machine-readable index with stable article IDs\n  agent\u002F\n    manifest.json     capabilities and pack metadata\n    concepts.json     concept registry with aliases\n    sources.json      source provenance\n  AGENTS.md           agent-readable entrypoint and usage guide\n  CLAUDE.md           Claude Code context file\n```\n\nAny file-aware agent can read the articles directly. `INDEX.json` enables fast concept lookup without a database. `synto serve` exposes 12 MCP tools — browse (`list_articles`), read (`read_article`, `get_concept`, `trace_lineage`, `list_sources`), search (`search_articles`, `find_concept`), answer (`answer_question`, which runs the full query pipeline), and read raw source text (`search_source_segments`, `get_source_passages`, `read_source_segment`, `list_segments`).\n\n---\n\n## Data & Privacy\n\n- **Local by default.** Ollama and LM Studio process all content on your machine — notes never leave it.\n- **Cloud providers.** If you configure a cloud provider, note content and wiki text are sent to that service. Review their privacy policy before use.\n- **No remote analytics.** Synto does not send usage data anywhere. Local runtime and cost metrics stay in your vault database.\n- **Pack exports.** Exported packs include raw notes, sources, wiki articles, queries, and synthesis by default. Review your vault before sharing a pack.\n- **API keys.** Stored in `~\u002F.config\u002Fsynto\u002Fconfig.toml` (user-owned, not inside the vault). Never commit that file.\n- **Verbatim MCP tools gate raw text by source license.** The four verbatim-source tools return raw paragraphs only from sources whose license is permissive (`[mcp.source_access]` in `synto.toml`). A vault with no declared licenses is treated as `\"all\"` — every segment is readable by a connected MCP client — and `synto serve`\u002F`synto doctor` warn you about it. See [Privacy and source access](#privacy-and-source-access).\n\n---\n\n## Requirements\n\n- Python 3.11+\n- An LLM provider: [Ollama](https:\u002F\u002Follama.com) (local), LM Studio, or any OpenAI-compatible endpoint\n\n**Minimum recommended:** a 4B model for ingest (e.g. Gemma 4 `gemma4:e4b`) and a 14B+ model for compilation (e.g. Qwen 2.5 14B `qwen2.5:14b`). This is the ground-floor setup for quality output — works offline on 16 GB RAM. A single 4B model for both stages works if you're just getting started.\n\n---\n\n## Migrate from obsidian-llm-wiki-local\n\n**Existing obsidian-llm-wiki-local vaults must be migrated first.** Run `migrate-olw` to convert the vault layout:\n\n```bash\nsynto migrate-olw --vault ~\u002Fmy-old-vault\n```\n\nCopies `wiki.toml` → `synto.toml` and `.olw\u002F` → `.synto\u002F`. Notes and articles are untouched. Old files are preserved — delete them once you've verified everything works.\n","Synto 是一个将你的 Markdown 笔记转化为自增长、互链式维基的工具，完全基于本地运行。它利用本地 LLM 读取笔记并提取其中的概念，为每个概念生成一篇互链的文章。随着你不断添加笔记，维基内容会越来越丰富。项目的核心功能包括自动概念提取与文章生成，无需依赖外部数据库或嵌入技术即可构建可查询的知识库。此外，Synto 还支持生成可供 AI 代理使用的知识包，方便 Claude、Cursor 等文件感知型 AI 使用。适合需要在本地高效管理和扩展个人知识体系的用户，特别适用于科研人员、学生以及任何希望通过结构化方式整理学习资料的人士。",2,"2026-06-11 03:59:28","CREATED_QUERY"]