FAQ
wenlan is a Claude Code plugin with 25 hand-picked skills for documentation work, indexed on Flowy. Install it with the command on its page. It includes prove, run-wenlan, verify. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add 7xuanlu/wenlan> /plugin install wenlan@7xuanlu-wenlan
Repo: 7xuanlu/wenlan
Useful work with AI shouldn't disappear when a conversation ends. Wenlan builds the right pages and keeps them current as sources change, asking only when judgment is needed.
The desktop app is the fastest way to see the complete workflow: read pages, inspect their sources, and curate the knowledge system. The current macOS Apple Silicon preview is not yet notarized, so this installer verifies the GitHub release, installs Wenlan, clears quarantine for this app only, and opens it without changing macOS security settings:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/7xuanlu/wenlan/main/scripts/install-macos-app.sh)"
The installer is inspectable. It checks the release archive against GitHub's published SHA-256 before replacing an existing app. Prefer the DMG or want to inspect the app source? See wenlan-app releases and wenlan-app.
Paste this into Claude Code, Codex, or another tool that can follow a setup guide:
Set up Wenlan for this AI client by following:
https://raw.githubusercontent.com/7xuanlu/wenlan/main/docs/setup-with-ai.md
Install only what this client needs. Then verify the local runtime,
its Wenlan connection, and a capture/recall round trip.
The guide detects which client you are using and keeps client-specific commands out of this README. It does not configure every AI tool unless you ask it to.
Need only the headless runtime on macOS Apple Silicon?
npx -y wenlan setup
This downloads the prebuilt CLI, daemon, and MCP connector, starts the local runtime, and verifies it. No Rust toolchain or Cargo is required. Linux x64/ARM64 with glibc has an automated shell setup path; Windows x64 uses the matching archive from Releases. macOS Intel currently has no supported complete-runtime install.
Manual and client-specific instructions: AI-assisted setup Β· Claude Code plugin Β· Codex plugin Β· CLI and MCP.
Wenlan turns documents, notes, and past AI conversations into a source-backed knowledge base that stays current as your work evolves. Sources remain traceable; decisions, lessons, and corrections become durable memories; both can support the same maintained Pages.
Built for work that continues. Wenlan is for researchers, writers, consultants, product teams, and software teams whose knowledge is scattered across documents, notes, and AI conversations. It turns that material into inspectable Pages that can improve across projects and weeks, not another chat history or isolated memory store. It is not a life-management system or a memory SDK embedded inside another product.
One knowledge system, three roles:
The LLM-wiki foundation, extended:
Wenlan's distinctive move: Sources and atomic Memories independently support maintained Pages. Memory history preserves how knowledge changed; Page history shows which current evidence supports the synthesis. Machine-maintained Pages can rebuild from current support, while changes to human writing wait as reviewable revisions.
The entity-relation graph is one part of Wenlan's wider connected wiki. Knowledge Pages hold maintained synthesis, Entities anchor reusable people, projects, and concepts, Source Pages make imported or synchronized material inspectable, and atomic Memories preserve decisions and changes. They work through separate, explicit links: Page-to-Page wikilinks, Page evidence, Memory-to-Entity links, and directed Entity relations.
Within the entity graph, a configured enrichment model extracts typed Entities, observations, and directed relations from Memories. Entity linking and resolution reuse existing nodes instead of treating every mention as new; each Memory keeps its Source and can link to multiple Entities. How the connected model is stored ->
uses, part_of, contradicts, and replaced_by; unknown types fall back to related_to and become reviewable vocabulary proposals.During retrieval, dense entity matching finds query-relevant entities. When eligible graph links exist, the default graph-memory stream boosts linked Memories as a third RRF signal. The path is data- and scope-dependent, and Space boundaries still apply. How the graph path works ->
Wenlan's core search is a local hybrid pipeline, not a single vector lookup. Each stage has a different job:
Qdrant/bge-base-en-v1.5-onnx-Q: a quantized English model creates 768-dimensional embeddings; libSQL cosine DiskANN indexes them for approximate nearest-neighbor retrieval.k = 60): lexical and semantic rank lists are fused without pretending their raw scores share a scale; cosine similarity also weights the vector contribution.jinaai/jina-reranker-v1-turbo-en or BAAI/bge-reranker-base reads each query-candidate pair and reorders the smaller pool; reranking is off by default.Page, episodic, and fact channels are opt-in and degrade to the remaining search signals if unavailable. Space still limits the read scope. Methods, defaults, and limitations ->
A generated wiki can go stale; a memory store can fragment into disconnected facts. Wenlan links two lifecycles without collapsing them into one layer.
CAPTURE -> CLASSIFY -> ENRICH -> LINK -> RECONCILE
Capture and explicit supersession are core. Model-backed stages run only when the matching model is configured, and the reconcile pass is off by default.
| Operation | What Wenlan does |
|---|---|
| Capture | Agents write one complete, self-contained idea per Memory, following the Zettelkasten atomic-note principle instead of saving the whole conversation. |
| Classify | With the on-device model, Wenlan assigns identity, preference, decision, lesson, gotcha, or fact; a precise type supplied by the caller remains authoritative. |
| Enrich | With the on-device model, adds structured fields, retrieval cues, event dates, quality, importance, and tags when available. |
| Link | Retains provenance and, when enrichment is enabled, connects Memories to entities and relations in the knowledge graph. |
| Reconcile | Explicit replacements preserve a supersedes chain. An optional on-device pass can queue protected conflicts for review instead of overwriting history; it is off by default and must be explicitly enabled. |
Advanced configuration: set WENLAN_ENABLE_DUAL_POOL_RESOLVE=1 to enable that reconcile pass.
DISTILL -> CITE -> TRACK -> REFRESH -> REVIEW
| Operation | What Wenlan does |
|---|---|
| Distill | Compiles related Sources and Memories into one Markdown Page. |
| Cite | Retains citation records and verification status; automatic refresh discards a draft when its citation-support check fails. |
| Track | Records which evidence supports the Page, why it became stale, and a bounded changelog. |
| Refresh | When a Page is marked stale, rebuilds the eligible machine-maintained Page from current evidence. |
| Review | Turns changes to a Page you edited into a proposed revision instead of a silent rewrite. |
For example, import a design document and capture a debugging decision in Codex. Wenlan can compile one Page that cites both. When that Page is refreshed, it rebuilds from its current support; if you have edited it, the proposed change waits for review.
Your durable synthesis remains ordinary files rather than a proprietary editor format:
~/.wenlan/.~/.wenlan/pages/ into the vault or export a Page from the desktop app; your edits remain human-owned, and later machine refreshes become reviewable revisions.The local history is directly inspectable:
$ git -C ~/.wenlan log --oneline
a1b2c3d distill: 4 pages
9f8e7d6 session: embedding-work
.md, .txt, or text-extractable .pdf file; recurse through a folder of them; or index Markdown from an Obsidian vault.[[wikilinks]]; the daemon can verify and record per-claim citations.
The system above becomes a small daily loop: start with relevant knowledge, capture what matters while you work, close with a handoff, and let Wenlan refine what should return next time. Each pass leaves the same knowledge base sharper instead of creating another disconnected history.
The loop has four steps:
/recall <query>; /brief [topic] reads the current Space Brief, and a topic appends separately labeled context from that same Space. Clients without plugin commands use the equivalent page, search, recall, and brief tools./capture <thing> saves a decision, lesson, gotcha, or fact with its source. /recall <query> retrieves only what is relevant instead of loading your whole history./handoff records what changed and applies typed item-level updates to the current Space Brief./distill deliberately creates or refreshes pages. Between sessions, optional model-backed passes can enrich captures, connect related entities, and refresh eligible pages. /lint checks knowledge health; /curate brings proposed revisions and any conflict-review items created by the optional reconcile pass to you.Qwen3 4B or Qwen3.5 9B through llama.cpp. Wenlan does not download or activate a language model until you choose one.Full workflow reference: plugin/skills. Technical model roles: technical foundations.
This is a retrieval-only snapshot, not a claim about end-to-end answer quality. Method, environment receipts, and the update workflow live in docs/eval.
| Benchmark | Recall@5 | MRR | NDCG@10 |
|---|---|---|---|
| LME_Oracle (500 Q) | 93.6% | 0.857 | 0.883 |
| LME_S (deep, 90 Q) | 87.7% | 0.815 | 0.822 |
More detailed documentation, concepts, and comparisons:
Bug fixes, eval cases, docs, and features are welcome. Installing Wenlan does not require building from source. For local development, run each group from the root of the named repository:
# 7xuanlu/wenlan β runtime, CLI, and MCP
cargo build --workspace
cargo test --workspace
# 7xuanlu/wenlan-app β desktop app
pnpm install
pnpm tauri dev
pnpm build:all
Use pnpm dev:all in the app repository when you want a fresh daemon-plus-app sequence. See this repository's AGENTS.md and CONTRIBUTING.md, plus wenlan-app's AGENTS.md, for the complete development workflow. Security reports: SECURITY.md. Please also read the Code of Conduct.
Wenlan is licensed under Apache-2.0. This includes the local runtime, CLI, MCP server, shared types, and Claude Code/Codex plugin files in this repository.
Wenlan (ζηΎ) takes its name from ζηΎι£, an imperial library that held εεΊ«ε ¨ζΈ as part of one of China's largest book collections.
Wenlan's llm-wiki v2 model is its own product direction, informed by the LLM-wiki and agent-memory lineages:
.agents/
plugins/
marketplace.json
.claude/
.claude-plugin/
marketplace.json
agents/
doc-drift-auditor.md
hooks/
block-no-verify.sh
block-release-please-files.sh
pre-stop-gate.sh
test-hooks.sh
settings.json
skills/
prove/
references/
behaviors.md
daemon.md
mutprove.md
sweep.md
SKILL.md
run-wenlan/
SKILL.md
verify/
SKILL.md
.config/
nextest.toml
.gitattributes
.githooks/
pre-commit
pre-push
.github/
ISSUE_TEMPLATE/
bug_report.yml
config.yml
feature_request.yml
pull_request_template.md
workflows/
ci-benchmark.yml
ci-cache-maintenance.yml
ci-observer.yml
ci.yml
claude.yml
coverage.yml
main-canary.yml
release-candidate-observer.yml
release-please.yml
release-pr-maintenance.yml
release.yml
.gitignore
.release-please-manifest.json
AGENTS.md
app/
eval/
AGENTS.md
CLAUDE.md
fixtures/
agent_coding_session.toml
agent_growing_corpus.toml
agent_identity_profile.toml
agent_multi_tool.toml
agent_noisy_context.toml
agent_temporal_updates.toml
basic_search.toml
contradiction_detection.toml
cross_project_bleed.toml
empty_set_precision.toml
gen/
.gitignore
graph_augmented_retrieval.toml
hard_cross_agent_noise.toml
hard_distractor_density.toml
hard_domain_boundary.toml
hard_negative_vocabulary.toml
hard_temporal_decisions.toml
identity_leakage.toml
page_retrieval.toml
quality_gate/
duplicate_pollution.toml
noise_patterns.toml
noisy_db_retrieval.toml
novelty_rejection.toml
realistic_agent_session.toml
realistic/
realistic_multi_hop.toml
realistic_open_domain.toml
realistic_single_hop.toml
realistic_temporal.toml
recap_noise.toml
relevance_gradient.toml
semantic_vs_keyword.toml
store_quality_agent_naming.toml
store_quality_agent_trust.toml
store_quality_confidence_calibration.toml
store_quality_dedup_gap.toml
store_quality_domain_consistency.toml
store_quality_missing_assessment.toml
store_quality_recap_ratio.toml
structured_content_quality.toml
temporal_ordering.toml
trivial_noise.toml
kg_fixtures/
seed_decisions.toml
seed_entity_dedup.toml
seed_facts.toml
seed_identity.toml
page_fixtures/
seed_decisions.toml
seed_facts.toml
seed_hallucinations.toml
Cargo.lock
Cargo.toml
CHANGELOG.md
CLAUDE.md
clippy.toml
CODE_OF_CONDUCT.md
CONTRIBUTING.md
crates/
wenlan-cli/
Cargo.toml
npm/
.gitignore
package.json
run.js
README.md
src/
client/
client.rs
lint.rs
commands/
agents.rs
brief.rs
curate.rs
ingest.rs
lint.rs
list.rs
mcp.rs
mod.rs
pages.rs
recall.rs
search.rs
service.rs
setup.rs
space.rs
status.rs
store.rs
lib.rs
main.rs
output.rs
space_context.rs
tests/
brief_cli.rs
cli_integration.rs
distribution.rs
enrichment_cli.rs
ingest_cli.rs
lint_cli/
lint_cli.rs
support.rs
pages_cli.rs
space_cli.rs
wenlan-core/
AGENTS.md
build.rs
Cargo.toml
CLAUDE.md
eval/
data/
locomo_plus.json
examples/
cleanup-legacy-captures.rs
README.md
src/
access_tracker.rs
activity.rs
bin/
compare_baselines.rs
deep_distill_cloud.rs
deep_distill.rs
fixture_gen.rs
hard_distill.rs
m5_export_page_size_dist.rs
model_benchmark.rs
model_probe.rs
score_text.rs
briefing.rs
cache.rs
chat_import/
bulk_ingest.rs
chatgpt.rs
claude.rs
mod.rs
types.rs
chunker/
code.rs
detection.rs
fixed_size.rs
markdown.rs
mod.rs
traits.rs
citations.rs
claim_judge.rs
classify.rs
community_grouping.rs
community_partition.rs
community_routing.rs
config.rs
context_packager.rs
contradiction.rs
db/
db.rs
brief_test.rs
brief.rs
claim_derivation_test.rs
claim_derivation.rs
claim_edge_lifecycle_test.rs
claim_identity_test.rs
claim_identity.rs
community_grouping_state_test.rs
community_grouping_state.rs
count_test.rs
count.rs
derived_artifact_sweep/
derived_artifact_sweep.rs
population.rs
edges_rebuild_test.rs
edges_rebuild.rs
entity_page_adapter_test.rs
entity_page_adapter.rs
eval_lifecycle_integrity_test.rs
eval_lifecycle_integrity.rs
eval_paired_guard_test.rs
eval_paired_guard.rs
eval_pipeline_reads_test.rs
eval_pipeline_reads.rs
eval_substrate_guard_test.rs
eval_substrate_guard.rs
eval_temporal_seed_test.rs
eval_temporal_seed.rs
genesis_schema_test.rs
genesis_schema.rs
kg_quality_diagnostics_test.rs
kg_quality_diagnostics.rs
kg_quality_duplicate_candidates_test.rs
kg_quality_duplicate_candidates.rs
kg_quality_embedding_refresh_test.rs
kg_quality_embedding_refresh.rs
kg_quality_vocabulary_test.rs
kg_quality_vocabulary.rs
lint_snapshot_test.rs
lint_snapshot.rs
m5_page_size_snapshot.rs
m6_followup_schema_test.rs
main_tests.rs
maintenance_duplicate_reads_test.rs
maintenance_duplicate_reads.rs
maintenance_queue_test.rs
maintenance_queue.rs
maintenance_retro_scan_test.rs
maintenance_retro_scan.rs
memory_point_reads_test.rs
memory_point_reads.rs
migrations_v004_v009.rs
onboarding_milestones.rs
page_drafts_test.rs
page_drafts.rs
page_map_test.rs
page_map.rs
presence_review_test.rs
presence_review.rs
repair_deterministic_test.rs
repair_deterministic.rs
repair_memory_cas_test.rs
repair_memory_cas.rs
repair_page_regenerate_test.rs
repair_page_regenerate.rs
repair_page_rename_test.rs
repair_page_rename.rs
repair_receipt_test.rs
repair_receipt.rs
repair_stale_projection_test.rs
repair_stale_projection.rs
repair_target_receipt_test.rs
repair_target_receipt.rs
repair_verification_test.rs
repair_verification.rs
scoped_entities_test.rs
scoped_entities.rs
scoped_pages_test.rs
scoped_pages.rs
scoped_records_test.rs
source_sync.rs
space_context.rs
space_rename_test.rs
space_rename.rs
test_support_test.rs
truth_exposure_test.rs
truth_exposure.rs
decay.rs
derived_artifact_state.rs
document_enrichment.rs
drift_guard/
drift_guard.rs
post_write_structure_phase.txt
post_write_structure_test.rs
r4_test_support_api_manifest.txt
r4_test_support_raw_manifest.txt
r4_test_support_test.rs
edge_grounding.rs
engine.rs
env_compat.rs
error.rs
eval/
AGENTS.md
answer_quality.rs
anthropic.rs
CLAUDE.md
cli_batch.rs
context_path.rs
cost.rs
engine_throughput.rs
entity_dedup.rs
eval_judge.rs
fixtures.rs
gen.rs
goldens/
retrieval_ranking.anchor.json
retrieval_ranking.current.json
judge.rs
kg_faithfulness_llm.rs
kg_faithfulness.rs
latency.rs
layer.rs
lifecycle.rs
locomo.rs
longmemeval.rs
m5_bench_corpus.rs
metrics.rs
mod.rs
page_faithfulness.rs
paired.rs
pipeline.rs
rank_overlap.rs
report.rs
retrieval_drift.rs
retrieval.rs
runner.rs
seed_contract.rs
shared.rs
signals.rs
wall_clock.rs
events.rs
export/
knowledge.rs
mod.rs
obsidian.rs
projection_invariant_test.rs
provenance.rs
extract.rs
faithfulness.rs
importer.rs
ingest.rs
kg/
kg_quality.rs
entity_extraction.rs
mod.rs
reweave.rs
lib.rs
lint/
catalog_validation.rs
catalog.rs
context.rs
deep_test.rs
deep.rs
identity/
identity_test.rs
identity.rs
query.rs
result.rs
session.rs
kg/
kg_config_test.rs
kg_test.rs
kg_uncategorized_test.rs
kg.rs
config.rs
query/
query.rs
aggregate.rs
result.rs
memories/
memories_integration_test.rs
memories_lifecycle_regression_test.rs
memories_review_regression_test.rs
memories_test.rs
memories.rs
assessment.rs
query.rs
result.rs
... 873 moreΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic