A lightweight, Windows-native Obsidian knowledge base for Claude Code.
Drop a source into your vault's inbox. Claude reads it and files it as linked,
source-cited Markdown notes you own.
Perlite turns Claude Code into the librarian of your Obsidian vault. You collect articles, PDFs, papers and notes; Perlite reads them, writes a summary for each source, builds notes for the concepts and entities they mention, links everything together, and keeps an index, a log and a short "where things stand" page up to date. Later you can ask questions and get answers grounded in your own notes, with links to the notes behind every claim.
Why "Perlite"? Obsidian is volcanic glass. Perlite is volcanic glass too, but expanded until it is extremely light. That is the whole idea: the Obsidian-wiki workflow, with almost no weight.
- Why Perlite
- How it works
- Requirements
- Installation
- Quick start
- Choosing the vault
- Commands
- Vault layout
- Note format
- Evidence rules
- Customizing with PERLITE.md
- Everyday workflow
- Privacy and safety
- Updating and uninstalling
- Troubleshooting
- FAQ
- Repository structure
- Credits
- License
- Perlite vs claude-obsidian
Perlite exists for two reasons: it is lightweight and it runs natively on Windows.
| Perlite | |
|---|---|
| What it is | 5 skills (plain Markdown instructions), 5 note templates, 1 optional Python checker |
| Runs on | Windows (native, no WSL), macOS, Linux |
| Writes notes with | Claude Code's own file tools (Read, Write, Edit) |
| Hooks | None. Nothing runs when a session starts or stops. |
| Background processes | None |
| Network access | None, unless you explicitly ask it to fetch a URL |
| Dependencies | None. Python 3.8+ is optional and only used by /perlite:lint. |
| Lock-in | None. The vault is plain Markdown that works without Perlite. |
Many knowledge-base plugins route every write through their own runtime: a Python transaction layer, locks, journals and JSON ledgers. That machinery is powerful, but it is heavy, and some of it depends on Linux-only file system features, so on Windows it either refuses to write or requires WSL. Perlite takes the opposite approach. Every rule lives in a readable Markdown file, and Claude applies those rules with the same file tools it uses for everything else. If you can read a recipe, you can read and change how Perlite works.
The trade-off is honest: Perlite has no transactional rollback. You get safety from Claude Code's permission prompts, from Perlite's "never delete, never overwrite sources" rules, and from your own backups (Obsidian's File recovery core plugin or Git work well). See Privacy and safety.
you Perlite (Claude Code) your vault
─────── ────────────────────── ────────────
drop a PDF ──────────▶ /perlite:ingest
into inbox/ 1. reads PERLITE.md (the rules)
2. reads the source completely
3. finds existing notes on the same topics
4. writes / updates notes ─────────────▶ wiki/sources/
wiki/concepts/
wiki/entities/
5. updates the core pages ─────────────▶ wiki/index.md
wiki/log.md
wiki/hot.md
6. archives the original ─────────────▶ .raw/YYYY-MM-DD/
ask a question ───────▶ /perlite:query (read-only, cites [[notes]])
keep an answer ───────▶ /perlite:save ─────────────────────────▶ wiki/questions/
check health ───────▶ /perlite:lint (read-only report)
Obsidian watches the folder, so new notes appear immediately and show up in the Graph view as they get linked.
- Claude Code: the terminal CLI or the Code tab of the Claude desktop app.
- Obsidian (recommended, to browse the notes; Perlite itself only needs a folder).
- Python 3.8+ (optional): only for the fast, deterministic checker behind
/perlite:lint. Without Python, lint falls back to a manual check.
Perlite does not need WSL, Git, Node.js, a server, an API key or any Obsidian community plugin.
Perlite is distributed as a Claude Code plugin from this repository, which is also its
own plugin marketplace (named bozdev).
claude plugin marketplace add bozdev/perliteclaude plugin install perlite@bozdevThe plugin is installed at user scope, so it is available in every project and in the desktop app's Code tab.
/plugin marketplace add bozdev/perlite
/plugin install perlite@bozdev
- Click the + button next to the prompt box.
- Choose Plugins → Add plugin.
- Add the marketplace
bozdev/perliteif asked, select perlite, and choose a scope.
To install exactly the code you reviewed, pin the marketplace to a tag or branch:
claude plugin marketplace add bozdev/perlite#v0.1.0From a clone of this repository:
claude --plugin-dir ./perliteThe plugin loads for that session only.
-
Create a vault. In Obsidian, create a new vault (or pick an existing one).
-
Initialize it. In Claude Code, run:
/perlite:init C:\Users\you\Documents\MyVaultPerlite asks which language your notes should be written in, shows what it will create, and creates the structure after you confirm. Existing files are never overwritten.
-
Tell Perlite where the vault is (optional but recommended). See Choosing the vault.
-
Add a source. Copy a PDF, Markdown file or text file into the vault's
inbox/folder. -
Process it.
/perlite:ingest -
Ask questions.
/perlite:query What are the main trade-offs discussed in my sources? -
Check health now and then.
/perlite:lint
You do not have to type the slash commands. Claude also picks the right skill from plain requests such as "process my inbox", "what does my wiki say about X", or "save this answer to my wiki".
A Perlite vault is any folder that contains a PERLITE.md file. Every command finds
the vault in this order:
- A path in your request, for example
/perlite:lint D:\Notes\Research. - The
PERLITE_VAULTenvironment variable. - The current folder, or its nearest parent folder that contains
PERLITE.md.
If none of these works, Perlite asks you.
Recommended: set PERLITE_VAULT once in your Claude Code user settings, so every
session, in any folder, writes to the same vault. Open ~/.claude/settings.json
(on Windows: C:\Users\<you>\.claude\settings.json) and add:
{
"env": {
"PERLITE_VAULT": "C:/Users/you/Documents/MyVault"
}
}Use forward slashes, or escape backslashes as \\. If the file already has an env
block, add the line to it. Restart Claude Code afterwards.
Alternatively, start Claude Code inside the vault folder; Perlite then finds
PERLITE.md on its own.
| Command | Changes the vault? | What it does |
|---|---|---|
/perlite:init [path] |
Yes, after you confirm | Creates the Perlite structure and rules file in a folder |
/perlite:ingest [file | text | URL] |
Yes | Turns sources into linked notes and archives the originals |
/perlite:query <question> |
No | Answers from your notes, citing them |
/perlite:save [what] |
Yes | Saves a selected answer or insight from the conversation |
/perlite:lint [path] |
No | Reports broken links, orphans, missing properties and more |
Sets up a vault. It creates inbox/, .raw/, the wiki/ folders, PERLITE.md and
the four core pages (index, log, hot, overview). It asks for your note
language and shows the plan before writing. In an existing Obsidian vault it only
adds what is missing; your notes stay where they are.
Processes sources. With no argument it processes everything in inbox/. You can also
name one file, paste text, or give a URL (Perlite asks before fetching anything).
For each source, Perlite:
- reads it completely (PDFs page by page; images directly);
- extracts key claims, entities, concepts, conflicts and open questions;
- checks which notes already exist, so it updates instead of duplicating;
- writes a source note in
wiki/sources/, and concept and entity notes only when they add lasting value; - links every important claim back to its source note;
- updates
index,log,hot(andoverviewif the big picture changed); - moves the original file to
.raw/YYYY-MM-DD/. Nothing is deleted.
Large batches are split: by default Perlite proposes 5 sources at a time.
Formats Claude cannot read (audio, video, .docx and similar) are reported, never
guessed.
Examples:
/perlite:ingest
/perlite:ingest paper-on-retrieval.pdf
/perlite:ingest https://example.com/article
Answers a question only from your vault, and never changes it. Each important sentence ends with the note it rests on, so you can click through. It tells you how settled each point is, shows both sides when notes disagree, and clearly labels anything that comes from general knowledge instead of your notes.
/perlite:query How do the sources define "contextual retrieval"?
If the answer is worth keeping, it offers to save it with /perlite:save.
Saves something from the current conversation: an answer, a decision, an insight or a
short session summary. It saves only what you select, never the whole conversation,
and warns you if the content looks sensitive. Claims from the conversation that are
not backed by a source in the vault are marked provisional.
/perlite:save the comparison table above as a note
A read-only health check. It reports:
- broken
[[links]]and broken![[embeds]] - ambiguous links (two notes with the same name)
- orphan notes (nothing links to them)
- notes missing from
wiki/index.md - missing frontmatter or missing required properties
- a note whose
typedoes not match its folder - empty sections
- files waiting in
inbox/
It never fixes anything on its own; it proposes fixes and applies them only after
you approve. With Python installed, the check is done by a small, read-only,
standard-library script (skills/lint/lint.py) that you can also run yourself:
python skills/lint/lint.py "C:/Users/you/Documents/MyVault"MyVault/
├── PERLITE.md # the rules (edit me)
├── inbox/ # drop sources here
├── .raw/ # archive of processed originals (hidden in Obsidian)
│ └── 2026-01-31/
└── wiki/
├── index.md # catalog of every note
├── log.md # operation history, newest first
├── hot.md # short summary for the next session
├── overview.md # the big picture
├── sources/ # one note per source
├── entities/ # people, organizations, products, projects
├── concepts/ # ideas, methods, definitions
├── questions/ # answered questions and comparisons
├── sessions/ # content saved from conversations
└── canvases/ # Obsidian canvases
Folders that start with a dot (like .raw/) are hidden in Obsidian's file explorer
but are normal folders on disk.
Every note starts with flat YAML properties:
---
type: concept
title: "Contextual Retrieval"
status: developing
created: 2026-01-31
updated: 2026-01-31
tags:
- retrieval
aliases: []
related:
- "[[BM25]]"
sources:
- "[[Introducing Contextual Retrieval]]"
---type |
Folder | Used for |
|---|---|---|
source |
wiki/sources/ |
A traceable summary of one source |
entity |
wiki/entities/ |
A person, organization, product or project |
concept |
wiki/concepts/ |
An idea, framework, mechanism or definition |
question |
wiki/questions/ |
An answered question with visible evidence status |
comparison |
wiki/questions/ |
A criteria-based comparison |
session |
wiki/sessions/ |
Content saved from a conversation |
overview |
wiki/ |
The big picture |
meta |
wiki/ |
Index, log and hot pages |
Statuses: seed, developing, evergreen, answered, provisional,
contested, archived.
Source notes add source_type, author, date_published, url and raw_path.
Unknown values stay empty instead of being invented.
Because the properties are standard Obsidian properties, you can build
Bases views on top of them, for example a table of
all source notes sorted by date_published.
Perlite is designed to keep your knowledge base honest:
- Every important claim links to the source note it comes from.
- What a source says and what Claude concludes are kept apart; interpretation goes
in a
> [!note] Interpretationcallout. - When sources disagree, both views are kept and marked with
> [!warning] Conflict. Neither is silently chosen. - Unsourced claims are marked
provisionalor "no source". - Sources, quotes, dates and authors are never invented.
PERLITE.md in the vault root is the single source of rules. Every Perlite command
reads it first, and its rules win over the skills' defaults. Open it in Obsidian and
edit it like any note. The Settings section at the top controls:
| Setting | Default | Meaning |
|---|---|---|
| Note language | chosen at init | The language notes are written in |
| Max notes read per query | 8 | How many notes /perlite:query reads before asking |
| Max sources per ingest batch | 5 | Above this, /perlite:ingest proposes a first batch |
| Hot page word limit | 500 | Maximum length of wiki/hot.md |
You can also change the writing rules, add your own note types or statuses, or add
house rules such as "always add a ## Takeaways section to source notes".
- Collect: throughout the day, save interesting PDFs and articles into
inbox/. - Process: once in a while, say "process my inbox". Review the new notes in Obsidian's Graph view.
- Ask: "according to my wiki, …" gets you answers with links to your notes.
- Keep: when a conversation produces something useful, say "save this to my wiki".
- Maintain: run
/perlite:lintweekly and approve the fixes you agree with.
wiki/hot.md is a short summary of recent activity. Starting a session with "read my
hot page" gives Claude the context of where you left off.
- Local only. Perlite has no hooks, no background processes, no telemetry and no network code. It reads and writes files in your vault through Claude Code.
- No silent fetching. URLs are fetched only when you ask, and only after Perlite confirms with you.
- Note on Claude itself: like any Claude Code work, content Claude reads is sent to the Claude model as part of the conversation. Perlite does not send it anywhere else.
- Sources are never modified or deleted. Originals are moved from
inbox/to.raw/and never overwritten; name clashes get a suffix. - Source content is treated as data. Instructions hidden inside a PDF or web page are ignored.
- Nothing outside the vault is written.
- Permission prompts. Claude Code asks before editing files. To skip prompts for your vault only, you can add an allow rule for that folder in your Claude Code permission settings.
- Backups. Perlite has no rollback. Enable Obsidian's File recovery core plugin or keep the vault in Git if you want to undo changes.
Perlite sets a version in its manifest, so you only receive an update when a new
version is released. Auto-update is off by default for third-party marketplaces.
claude plugin marketplace update bozdevclaude plugin update perlite@bozdevOr use /plugin → Installed → perlite → Update now.
To uninstall:
claude plugin uninstall perlite@bozdevclaude plugin marketplace remove bozdevUninstalling never touches your vault. Your notes, sources and PERLITE.md stay
exactly where they are.
| Problem | Fix |
|---|---|
| "Which vault should I use?" every time | Set PERLITE_VAULT (see Choosing the vault) or start Claude Code inside the vault. |
/perlite:... commands don't appear |
Run claude plugin list to confirm it is enabled, then start a new session (or run /reload-plugins). |
PERLITE_VAULT is ignored |
Restart Claude Code after editing settings.json, and check the JSON is valid and the path uses / or \\. |
| Lint says Python is not found | On Windows, install Python from python.org or try py -3. Avoid python3 on Windows: it is often a Microsoft Store shortcut. Lint also works without Python, in manual mode. |
| A PDF was only partly processed | Very long PDFs are read in page ranges. Ask Perlite to continue from the page it stopped at. |
| New notes don't show up in Obsidian | Make sure Obsidian has the same folder open as the vault Perlite wrote to. |
| Too many permission prompts | Add an allow rule for the vault folder in Claude Code's permission settings. |
Does it work on macOS and Linux? Yes. Nothing in Perlite is Windows-specific; it is simply designed so that Windows works without extra setup.
Can I use it with an existing Obsidian vault?
Yes. /perlite:init adds only what is missing and never moves your notes. Your
existing notes can live alongside wiki/.
Do I need to use the slash commands? No. Claude picks the right Perlite skill from plain requests. The slash commands are there when you want to be explicit.
What languages are supported?
Any language Claude writes. Set the note language in PERLITE.md.
Does Perlite work in the claude.ai chat or the desktop app's Chat tab? No. Perlite needs access to a folder on your computer, which is what Claude Code provides. Use the terminal or the desktop app's Code tab.
Can I edit the notes myself? Of course. They are your notes. Perlite asks before rewriting a large part of a note you edited by hand.
perlite/
├── .claude-plugin/
│ ├── plugin.json # plugin manifest
│ └── marketplace.json # this repo as a one-plugin marketplace
├── skills/
│ ├── init/SKILL.md
│ ├── ingest/SKILL.md
│ ├── query/SKILL.md
│ ├── save/SKILL.md
│ └── lint/
│ ├── SKILL.md
│ └── lint.py # optional, read-only checker
├── templates/vault/ # files /perlite:init copies into a new vault
│ ├── PERLITE.md
│ └── wiki/ (index, log, hot, overview)
├── CHANGELOG.md
├── LICENSE
└── README.md
Validate the plugin after changes:
claude plugin validate .Perlite's vault structure and note conventions are inspired by claude-obsidian by AgriciDaniel (MIT), which in turn builds on Andrej Karpathy's "LLM wiki" idea. Perlite is an independent, from-scratch implementation that trades claude-obsidian's transactional runtime for a skills-only design that runs natively on Windows.
Developed by Boz.
MIT © 2026 Boz
Perlite started from the same idea as
claude-obsidian and uses a
similar vault layout, but makes the opposite engineering trade-off: as little
machinery as possible, so it runs anywhere Claude Code runs, including native
Windows. This comparison reflects Perlite 0.1.0 and claude-obsidian 2.2.0
(commit b0d8867), as of October 2026.
| Perlite | claude-obsidian | |
|---|---|---|
| Design goal | Lightweight, Windows-native, readable | Maximum safety, provenance and portability across agent hosts |
| Size | 18 files: 5 skills, 5 templates, ~180 lines of optional Python | ~200 files: 15 skills, ~23,600 lines of Python and ~1,300 lines of shell, plus ~19,000 lines of tests |
| How notes are written | Claude Code's own Read, Write and Edit tools | Through its own Python transaction core; skills forbid direct Write/Edit |
| Windows | Fully supported natively | Native Windows is read-only; writing to the vault requires WSL |
| Runtime requirements | None (Python 3.8+ optional, for lint only) | Python 3.11+, Bash for setup scripts, WSL on Windows |
| Hooks | None | SessionStart and Stop hooks (need python3 on PATH) |
| Rules live in | One editable PERLITE.md in the vault |
Skills, WIKI.md, and executable contracts in the plugin |
| Undo / rollback | None built in; rely on Obsidian File recovery or Git | Recoverable transactions with journals, locks and approval hashes |
| Provenance | Claims link to source notes; conflicts and unsourced claims are marked | Separate JSON source and claim ledgers with authority, freshness and review state |
| Approval flow | Claude Code's normal permission prompts | Dry-run plan, then apply with the exact approved_plan_sha256 |
| Search | Claude reads the index and searches notes with Grep | BM25 index, contextual prefixes, optional Ollama reranking |
| Network | None unless you ask to fetch a URL | Off by default; opt-in flags for Anthropic API, remote Ollama and web research |
| Supported hosts | Claude Code (CLI and desktop Code tab) | Claude Code, plus Codex, OpenCode, Gemini, Cursor, Windsurf and ZCode via skill links |
| Capability | Perlite | claude-obsidian |
|---|---|---|
| Set up or adopt a vault | /perlite:init |
wiki |
| Ingest sources from an inbox | /perlite:ingest |
wiki-ingest (with capture plan/apply) |
| Answer from the vault | /perlite:query |
wiki-query |
| Save from the conversation | /perlite:save |
save |
| Health check | /perlite:lint |
wiki-lint |
| Hybrid retrieval index | — | wiki-retrieve |
| Autonomous web research | — (ingest can fetch a URL you approve) | autoresearch |
| Web page cleanup | — | defuddle |
| Canvas authoring | A wiki/canvases/ folder; no dedicated skill |
canvas |
| Obsidian Bases authoring | Works with Bases through standard properties; no dedicated skill | obsidian-bases |
| Methodology modes (PARA, LYT, Zettelkasten) | — (edit PERLITE.md to define your own conventions) |
wiki-mode |
| Log rollups | — | wiki-fold |
| Obsidian CLI transport | — | wiki-cli |
| Structured reasoning helper | — | think |
Choose Perlite if you are on Windows and do not want WSL, you want to read and change every rule in plain Markdown, you prefer no hooks and no background code, or you want a small tool you can audit in a few minutes.
Choose claude-obsidian if you work on macOS, Linux or WSL and want transactional writes with rollback, formal source and claim ledgers, a retrieval index, autonomous research, or the same skills across several agent hosts.
Both keep your knowledge as plain Markdown in a folder you own, so a vault built with one stays readable without either.