IWE: a Markdown knowledge base you and your AI agent work on together
Memory serverOfficial IWE project
Created by IWE
Published in iwe-org/iwe. Publisher page
1,821 GitHub stars
What it is
Markdown knowledge graph — LSP for your editor, CLI + MCP memory for your AI agents
AutoGineer overview, from the brain’s own files
IWE provides a shared workspace for humans and AI agents to collaborate on project documentation, specs, and decision logs. By treating a folder of Markdown files as a structured knowledge graph, it allows agents to read, write, and organize information that persists across sessions. It functions as a memory server via the Model Context Protocol (MCP), enabling compatibility with various AI agents while remaining accessible to users through a native Mac app, CLI, or standard text editors like Neovim and VS Code.
How it works
Memory model: Not stated
AutoGineer overview, from the brain’s own files
IWE organizes notes as a collection of Markdown files within a project folder. It uses a CLI and an MCP server to expose these files to AI agents, allowing them to perform operations like searching, creating, and updating notes. The system supports features such as backlinks, link autocomplete, and graph visualization, ensuring that both the user and the AI agent interact with the same underlying document structure.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 4 |
| docs | docs | 70 |
| .githooks | folder | 1 |
| crates | folder | 381 |
| npm | folder | 15 |
Requirements
Runtimes: Rust
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 1 script. Review .githooks/pre-commit before opening the folder in Claude Code. No step below turns a hook on for you.
.githooks/pre-commit:runs on git pre-commit
- Not scanned by AutoGineerAutoGineer could not scan everything it runs. https://www.npmjs.com/package/@iwe-org/mcp
Created by IWE. Published in iwe-org/iwe. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Connect an AI agent to your project notes using the MCP server.
- Use the CLI to search, create, or reorganize notes from the terminal.
- Write and browse notes in the native Mac app while an agent works alongside you.
- Integrate note navigation and autocomplete into your preferred text editor.
- Maintain a persistent record of project decisions and lessons learned that both you and your agent can access.
- “Explore my IWE notes and summarize what's here.”
- The agent reads the Markdown files in the designated folder and provides a summary of the project context, decisions, or documentation found.
- “Save the decision we just made about the database schema.”
- The agent creates or updates a Markdown note in the IWE folder containing the details of the decision for future reference.
Documentation by IWE
IWE: a Markdown knowledge base you and your AI agent work on together
Your notes are your agent’s memory. IWE is where you work on them together.
iwe.md · Download for Mac · Docs · Reddit
Image: Crates.io Image: License Image: Documentation
Too many AI conversations start from zero. You explain your project, your decisions, your reasoning — then find yourself explaining it all again next session. Your own notes live somewhere else, out of the agent's reach.
Or worse, the agent “remembers” something in its own internal memory, but you can't easily see what it saved or correct what it got wrong. And that memory doesn't travel with you to the other agents you work with.
IWE gives you and your AI agents one shared place to work, right inside your project: a folder of connected Markdown documents — specs, plans, decisions, and more. Keep your own ideas there, ask your agent to save what you learn together, and return to that context as your work grows. You can read, edit, and organize those documents yourself — and they stay yours.
<br/> <p align="center"> <a href="https://www.youtube.com/watch?v=D58bPkOvbxE"> <img src="https://iwe.md/images/video-thumbnail.jpg" alt="Watch the IWE intro video on YouTube" width="600"> </a> </p> <br/>
Choose how you work
There are four ways to work with IWE. Mix and match them to fit your day:
| Tool | How you'll use it |
|---|---|
| iWe for Mac | Write and browse in a native app, and connect your existing Claude/Codex agent. |
| Your own editor | Stay in Neovim, Helix, VS Code, or Zed, with note navigation, backlinks, and autocomplete. |
| CLI | Search and manage your notes from the terminal or scripts. |
| Claude/Codex | Let your agent read, write, and organize memory while you work through conversation. |
All four work with the same Markdown documents. Draft a spec in your editor, develop it with Claude/Codex, browse it in the iWe app, or search it from the CLI. Use any combination you like; each tool also works independently.
Bring your own AI. Neither the IWE CLI nor the iWe Mac app includes an AI model. Both work on their own as tools for your notes. When you want AI help, use your existing Claude/Codex agent — in terminal or directly in the Mac app.
<a href="https://iwe.md/?ref=readme-shot"><img src="https://iwe.md/images/app/GH-screen-1.1.png" alt="iWe for Mac showing project plans and connected documents" width="820"></a>
<p> <a href="https://iwe.md/?ref=readme-shot"><img src="https://iwe.md/images/app/GH-screen-2.png" alt="Bug tracking with charts" width="32%"></a> <a href="https://iwe.md/?ref=readme-shot"><img src="https://iwe.md/images/app/GH-screen-3.png" alt="Technical documents with code" width="32%"></a> <a href="https://iwe.md/?ref=readme-shot"><img src="https://iwe.md/images/app/GH-screen-4.png" alt="Release documents" width="32%"></a> </p>
Plans · Charts · Technical documents · Releases — click a screenshot to see the iWe app in action on iwe.md.
Why IWE
Shared context. Your agent can use the same notes you write for yourself. Notes link to each other, and one note can belong to several topics, so you can follow an idea wherever it connects.
Memory you can read. Decisions and lessons saved by your agent are ordinary notes you can browse, correct, or delete.
Your notes stay yours. Everything is Markdown in a folder on your machine. Back it up, sync it, or keep it in git. You don't need an IWE cloud account to keep your notes; connecting an AI agent involves that agent's own setup and account requirements.
iWe for Mac
If you'd like a dedicated space for your notes, use the native Mac app. Open a folder of notes and you get a fast, keyboard-friendly space to write and browse. You can also connect your existing Claude/Codex agent to work alongside you.
Works with your Claude/Codex agent. Connect the agent you already use, ask questions about your notes, and have it draft or reorganize them. Watch its edits appear in the document as it works.
Room to experiment. Each agent run is one undo step — try an idea, and roll it back if you don't like it.
Follow your ideas. Jump between related notes, search in a few keystrokes, and view Mermaid diagrams right in your documents. Your editor and other tools can keep working on the same files.
Open a notes folder and start with a note about something you're working on. Once Claude/Codex is connected, try asking it to summarize that note or help you develop an idea.
Your Own Editor
Keep writing in Neovim, Helix, VS Code, or Zed. IWE adds link autocomplete, backlinks, search, and safe renaming across your notes.
Follow the guide for your editor, open your notes folder, and try linking two notes with autocomplete. You can use IWE for your own writing without connecting an AI agent.
CLI
Prefer the terminal? Use IWE to search, create, and reorganize notes, or work it into your scripts. The CLI has no AI built in: these commands work on their own. Your existing Claude/Codex agent can use IWE's tools too.
Install with Homebrew, or choose another option from the installation guide:
brew install iwe-org/iwe/iweThen run these commands inside your notes folder:
iwe init
iwe find
iwe find --lexical "project decisions"iwe find lists your notes; --lexical searches their content. Explore more in the CLI reference and workflow examples.
Claude/Codex
You can use IWE entirely through your agent. Ask Claude/Codex to save decisions, look up past work, and organize what you've learned. The agent works with your notes through IWE, and you can open those files yourself whenever you want.
IWE isn't tied to one AI. The same notes work with Claude Code, Claude Desktop, Codex, Gemini, Cursor, and any tool that supports the Model Context Protocol.
Give Claude/Codex a memory — for Claude Code, install the plugin, then run /iwe:init in any project you want remembered. For Codex, follow the agent connection steps below.
/plugin marketplace add iwe-org/skills
/plugin install iwe@iwe-org
/iwe:initThen ask it to save a decision from your current work, and open the note it creates in your project.
Connect another agent — with Homebrew installed, install IWE:
brew install iwe-org/iwe/iweRun iwe init in your notes folder, then follow the agent connection guide to add the iwec MCP server with that folder as its working directory. For other installation options, see the installation guide.
Once connected, ask your agent: “Explore my IWE notes and summarize what's here.”
Or let the agent set itself up — paste this into any agent that can run commands:
Set up IWE for my notes: install it (brew install iwe-org/iwe/iwe,
npm install -g @iwe-org/iwe, or cargo install iwe iwes iwec), run `iwe init`
in my notes directory, then add the `iwec` MCP server with its working
directory set to that folder.
Docs: https://iwe.md/docs/agentic/Learn More
Getting Started — install and set up
Working with AI — connect your agents
Usage Guide — everyday workflows
Examples — how people use IWE
CLI Reference and MCP Server — for the technically curious
Ready-made workspaces: dev-workspace — project memory for a coding agent · marketing-workspace — campaign memory for a marketing agent.
Get Involved
Trying IWE with your own notes? Tell us what felt useful and where you got stuck. Questions, rough edges, and examples of how you use it are all welcome in Discussions.
IWE is open source. You can also report a bug or help improve the documentation.
Community: Twitter/X · Reddit · Discussions
Building on IWE? The CLI and MCP server are the supported ways to integrate today. Tell us what you depend on so we know what not to break.
License
docs/document-schema.md
Document Schema
A document schema declares the required shape of a page: which frontmatter
fields it carries, which sections it contains and in what order, how headers
are written, how deep the heading tree may nest, and how large each part may
grow. Schemas are checked by iwe schema validate, so a
store's conventions become machine-checked policy in the loop
write → validate → fix.
The language is JSON-Schema-aligned. Frontmatter is validated by literal
JSON Schema (draft 2020-12). The body schema mirrors the document's own
structure — a document has sections, a section has a header and its own
nested sections — and keyword names and semantics come from JSON Schema
wherever the concept maps: pattern, const, enum, minLength,
maxLength, minContains, maxContains, additionalSections (after
additionalProperties), description.
A complete schema:
$schema: https://document-schema.org/draft/2026-06/schema
frontmatter:
type: object
required: [status]
properties:
status: { enum: [draft, published] }
maxTokens: 1200
sections:
- header: { pattern: "^[A-Z]", maxTokens: 12 }
maxContains: 1
sections:
- header: { const: Summary }
maxContains: 1
description: every note opens with a summary
- header: { const: Tasks }
maxContains: 1
additionalSections: falseThis reads: the frontmatter declares a status; the page body stays under
1200 tokens; there is exactly one top-level section, its header capitalized
and at most 12 tokens; it contains a Summary section and then a Tasks
section, in that order; no other top-level sections are allowed.
1. Schema documents
Schemas live in .iwe/schemas/<name>.yaml, one schema per file. Files are
YAML 1.2, so JSON content is equally valid. The optional $schema key names
the dialect; only https://document-schema.org/draft/2026-06/schema is accepted.
A schema binds to documents through the [schemas] section of
.iwe/config.toml (see Configuration):
[schemas.note]
match = "notes/**"
[schemas.session]
match = ["journal/*", "meetings/**"]The entry name is the schema name — [schemas.note] resolves to
.iwe/schemas/note.yaml. match is a glob, or a list of globs, matched
against the document key: * stays within a path segment, ** crosses
segments, and a leading / is optional. A ! prefix negates a pattern —
within one list patterns apply in order and the last matching one decides,
gitignore-style, so ["notes/**", "!notes/index"] binds everything under
notes/ except the index. Bindings compose order-free — a document is
validated against every schema whose match hits, so overlapping
bindings compose (as JSON Schema allOf does). A document matching no entry
is unvalidated.
Every keyword in a schema is optional, and an absent keyword constrains
nothing. An empty schema ({}) passes every document.
2. What is validated
The section tree. Sections at their structural depth after normalization (
1for#,2for##). A section's subsections are itssections, in document order. Non-section content — paragraphs, lists, code blocks, tables — is invisible to the schema: it is never matched and never violates.Header text. The rendered plain text of a heading, inline markup stripped.
Token counts. The same counting as the retrieve budgets, over rendered text, frontmatter excluded.
The frontmatter mapping.
{}when the page has no frontmatter. Every field is presented to the validator, at every depth, whatever its name starts with — a stored query keyed on$includedByvalidates like any other mapping. YAML dates and datetimes are presented to the validator as ISO-8601 / RFC 3339 strings.
3. Document schema
The top level of a schema file:
| Keyword | Value | Meaning |
|---|---|---|
$schema | string | optional dialect id |
description | string | default hint for document-level violations |
frontmatter | JSON Schema | validates the frontmatter mapping |
maxTokens | integer | budget for the whole rendered body |
maxDepth | integer | maximum heading nesting (3 allows ###, forbids ####) |
allSections | reduced section schema (§6) | applies to every section at every depth |
sections | array of section schemas | ordered shapes for the top-level sections |
additionalSections | bool or reduced section schema | policy for top-level sections matching no entry; default true (open) |
blocks | array of block schemas (§8) | ordered shapes for the content above the first heading |
additionalBlocks | bool or reduced block schema | policy for that content matching no entry; default true |
allBlocks | reduced block schema (§8) | applies to every block at every depth |
The frontmatter value is standard JSON Schema, draft 2020-12, with
format assertions enabled. Only in-document references (#/...) are
allowed; external and remote $ref are rejected.
4. Section schema
An item in a sections array is always a section.
| Keyword | Value | Meaning |
|---|---|---|
header | header schema (§5) | constrains the header text; also decides binding (§7) |
maxTokens | integer | budget for this section's subtree, header included |
maxDepth | integer | maximum nesting below this section (1 allows children, forbids deeper) |
minContains | integer, default 1 | minimum occurrences of this shape; 0 makes it optional |
maxContains | integer, default unbounded | maximum occurrences |
description | string | the violation hint for anything failing in this entry |
allSections | reduced section schema | applies to every section below this one |
sections | array of section schemas | ordered shapes for the subsections |
additionalSections | bool or reduced section schema | policy for subsections matching no entry; default true |
blocks | array of block schemas (§8) | ordered shapes for this section's content blocks |
additionalBlocks | bool or reduced block schema | policy for content blocks matching no entry; default true |
allBlocks | reduced block schema (§8) | applies to every block below this section |
The occurrence defaults are JSON Schema's contains defaults: a listed
shape is required at least once and unbounded above. The recipes:
| Intent | Spelling |
|---|---|
| one or more (default) | nothing |
| optional | minContains: 0 |
| exactly one | maxContains: 1 |
| at most one | minContains: 0, maxContains: 1 |
| n or more | minContains: n |
| exactly n | minContains: n, maxContains: n |
5. Header schema
Applies to the header's plain text. The string keywords carry JSON Schema
semantics exactly; maxTokens is the one extension.
| Keyword | Meaning |
|---|---|
pattern | regex the text must match; unanchored, as in JSON Schema — write ^...$ for a full match |
const | the text equals this string |
enum | the text equals one of these strings |
minLength | minimum length in characters |
maxLength | maximum length in characters |
maxTokens | maximum tokens in the header text |
description | hint override for header violations |
const is in principle an anchored, regex-escaped pattern
(const: Tasks ≡ pattern: "^Tasks$" with metacharacters escaped), but it
is a distinct keyword for three reasons: JSON Schema alignment; escaping
safety for literal headers containing regex metacharacters (a header like
C++ (Draft) needs no escaping under const); and error naming — a
missing-section message takes the section's name from const directly.
Mind the asymmetry: pattern is unanchored, so pattern: Tasks matches
any header containing "Tasks", while const: Tasks matches exactly.
enum is a disjunction of consts. enum and const cannot be combined.
Quoting regexes in YAML. A backslash class like
\dis an invalid escape inside a YAML double-quoted string. Write patterns in single quotes —pattern: '^\d{4}$'— or double the backslashes.
6. Reduced section schemas
allSections and a schema-valued additionalSections take a reduced
section schema: header, maxTokens, maxDepth, and description only.
Occurrence keywords are meaningless there — allSections applies to every
section, additionalSections applies per leftover section — and structural
keywords (sections, additionalSections, allSections) are not allowed
inside them. When several allSections are in scope (the document's plus
enclosing sections'), all of them apply.
additionalSections is boolean or schema, matching JSON Schema's own
value form for array extras (items after prefixItems, draft-07's
additionalItems, unevaluatedItems — all schema-or-boolean, all open by
default). true allows leftover sections unconstrained, a schema validates
each leftover against it, false makes each leftover a violation.
Semantically it is closest to unevaluatedItems: it governs the sections
no listed shape claimed.
7. Matching semantics
For each node — the document, then each bound section, recursively — the
node's sections are matched against its sections entries. Matching is
ordered, sequential, and greedy, without backtracking:
Walk the instance sections in document order, holding a pointer into the entry list, starting at the first entry.
For each section, find the first entry — at the pointer or later — whose
headerschema the section's header text satisfies (an entry with noheadermatches any section). Bind the section to that entry and advance the pointer to it. Entries before the pointer are closed and never bind again.A section that satisfies no entry at or after the pointer — including one that would only match an already-closed entry, i.e. out of order — is additional and is handled by
additionalSections.After the walk, every entry's bound count is checked against
minContainsandmaxContains. An entry bound fewer thanminContainstimes reports a missing required section, named by itsconst, elseenum, elsepattern, else its position.Each bound section is then validated against the rest of its entry:
maxTokens,maxDepth,allSections, and the nestedsectionsmatching, recursively.
Consequences:
Binding is decided by
headeralone. ATaskssection missing its required subsections still binds to theTasksentry and reports the missing pieces — it does not fall through toadditionalSections.Occurrences are counted in total, not per consecutive run. A repeated entry stays open and keeps binding matching sections until the pointer advances past it — which happens only when a section binds to a later entry. An additional section (one matching no open entry) does not advance the pointer, so a matching section after it rejoins the same entry. Hence
date, date, other, datecounts as three dates: it satisfiesminContains: 3and violatesmaxContains: 2.minContains/maxContainsbound the total, not the length of an unbroken run.A headerless (wildcard) entry greedily absorbs every remaining section, so any entry after it can never bind — a wildcard must be the last entry. Placing one earlier is rejected as a schema error (§10);
maxContainsdoes not rescue it, since the wildcard still binds every match first.There is no backtracking: matching is deterministic and errors are explainable. Order entries specific-first.
8. Blocks
The schema also reaches below the section, to a section's content —
paragraphs, lists, code, quotes, tables, rules. The vocabulary
mirrors the section level one step down: where a section has sections, it
also has blocks; where a header constrains a section's title, text
constrains a block's content; the all* / additional* / occurrence machinery
and the matching algorithm are reused verbatim.
8.1 What a block is
Every piece of non-section content is a block: a type, plain text
(empty for containers), a token count, and — for containers — child blocks.
The seven types map onto the document model:
type | content | its text | type-only keywords |
|---|---|---|---|
paragraph | a paragraph | the paragraph text | — |
bullet-list | a -/*/+ list | (empty) | items, minItems, maxItems |
ordered-list | a 1./1) list | (empty) | items, minItems, maxItems |
code | a fenced / raw code block | the code body | lang |
quote | a block quote | (empty) | blocks, additionalBlocks, allBlocks |
table | a table | the cell text | — |
rule | a horizontal rule | (empty) | — |
An inclusion link (a lone reference to another document) is not a distinct
type; it is matched as a paragraph whose text is the link text.
Bullet and ordered lists are distinct types — there is no ordered flag.
A list's elements are its items; an item is itself a container (its own
text plus nested blocks), shaped through items (§8.4).
A section's children are its content blocks followed by its subsections —
subsections never interleave. The two arrays partition the children cleanly:
blocks matches the leading content, sections matches the subsections.
The document's top level works the same way — blocks there is the content
above the first heading.
8.2 Block keywords on the document and every section
| Keyword | Value | Meaning |
|---|---|---|
blocks | array of block schemas | ordered shapes for this node's content blocks |
additionalBlocks | bool or reduced block schema | policy for content blocks matching no entry; default true |
allBlocks | reduced block schema | applies to every block at every depth below this node |
allBlocks is to blocks what allSections is to sections; when several are in
scope (document, enclosing sections, enclosing containers) all apply.
8.3 Block schema — an entry in a blocks array
| Keyword | Value | Meaning | Types |
|---|---|---|---|
type | one of the seven, or a list | the block kind(s); part of the binding identity (§8.5) | all |
text | text schema (§5) | constrains the block's plain text; part of the binding identity | all |
maxTokens | integer | budget for this block's whole subtree | all |
minContains | integer, default 1 | minimum occurrences of this shape | all |
maxContains | integer, default unbounded | maximum occurrences | all |
description | string | violation hint for anything failing in this entry | all |
lang | text schema (§5) | constrains the code language; part of the binding identity | code |
items | item schema (§8.4) | schema applied to every list item | lists |
minItems | integer | minimum number of list items | lists |
maxItems | integer | maximum number of list items | lists |
blocks | array of block schemas | ordered shapes for the quote's child blocks | quote |
additionalBlocks | bool or reduced block schema | policy for the quote's child blocks matching no entry | quote |
allBlocks | reduced block schema | applies to every block inside the quote | quote |
text and lang reuse the header schema shape:
pattern, const, enum, minLength, maxLength, maxTokens,
description. A keyword used on the wrong type — lang on a paragraph,
items on a code, blocks on a table — is a load error (§10), as is an
unknown type value.
type may also be a list of type names — type: [bullet-list, ordered-list] binds a block whose kind is any one of them, the block analogue
of a header enum. A type-specific keyword is then allowed only when every
listed type accepts it (items on [bullet-list, ordered-list] is fine;
items on [bullet-list, code] is a load error).
Two token budgets, mirroring header.maxTokens vs a section's maxTokens:
text: { maxTokens } bounds the block's own text, block maxTokens bounds
its whole subtree. For a paragraph they coincide; for a list or quote the
subtree includes the children.
8.4 Lists and items
A list (bullet-list / ordered-list) bounds its length with
minItems / maxItems and shapes each item with items — one schema applied
to every item. Repetition uses this pair, not repeated entries: one-to-ten
items is { type: bullet-list, minItems: 1, maxItems: 10 }.
minItemsis notminContains. BothminItemsandmaxItemsdefault to unbounded — omittingminItemsmeans no minimum (an empty list passes). This differs fromminContains, which defaults to1. So abullet-listentry with nothing set is required to appear (viaminContains: 1) but may itself be empty until you addminItems.
An item schema is a container without type or occurrence: text (the
item's own text), maxTokens (the item's subtree), description, and its own
blocks / additionalBlocks / allBlocks for the item's nested content.
Containers nest without limit — a quote holding a list whose items hold
paragraphs is fully expressible, and an allBlocks in scope at any container
reaches every block beneath it.
8.5 Block matching
Within a node, its content blocks are matched against its blocks entries by
the same ordered, greedy, no-backtracking algorithm as sections
(§7) — the only difference is the binding identity. A
block binds to the first entry at or after the pointer whose type matches
(an entry with no type matches any block; a list type matches any of its
kinds) and whose text / lang identity (const, enum, pattern), if
present, the block satisfies. Blocks matching no open entry are additional,
governed by
additionalBlocks. After the walk, minContains / maxContains are tallied,
each bound block is validated against the rest of its entry, and every
allBlocks in scope applies to every block throughout. A missing required
block is named by its text const / enum when present, else its type,
else its position.
Every §7 consequence carries over — in particular, two entries with the same
identity are rejected at load (§10): the second could never bind. Write "two
to four lead paragraphs" as { type: paragraph, minContains: 2, maxContains: 4 },
never as repeated { type: paragraph } entries.
8.6 Reduced block schema
allBlocks and a schema-valued additionalBlocks take a reduced block
schema — text, maxTokens, description only. Type-specific keywords
(type, lang, items), structural keywords (blocks,
additionalBlocks, allBlocks), and occurrence keywords (minContains,
maxContains, minItems, maxItems) are rejected there, mirroring the
reduced section schema.
8.7 Examples
Every line short — no paragraph, list item, table cell, or code body over 40
tokens, anywhere. text is the block's own text, so this never trips on a
long list's total:
allBlocks:
text: { maxTokens: 40 }A hub page — one lead paragraph, then a bulleted index of short links, nothing else:
sections:
- header: { pattern: ".+" }
blocks:
- type: paragraph
maxContains: 1
- type: bullet-list
minItems: 1
items:
text: { maxTokens: 40 }
additionalBlocks: falseA code-sample section — exactly one fenced block in an allowed language:
blocks:
- type: code
lang: { enum: [rust, toml, bash] }
maxContains: 19. Violations
iwe schema validate reports one line per violation, <key> › <breadcrumb>: <message> (or <key>: <message> when the breadcrumb is empty). The
breadcrumb is built from the matched header texts — a position like
sections[2] where no header text is available, blocks[1] / items[3] for
content blocks and list items, a frontmatter path like frontmatter › status.
A hint: line follows when a hint is present:
journal/2026-01-05 › Tasks: header is 18 tokens (limit 12)
hint: keep section headers short
notes/intro: required section 'Summary' missing
hint: every note opens with a summary
notes/intro › frontmatter › status: not one of 'draft', 'published'The hint is the nearest description walking outward from the failing
keyword — header schema, then entry, then enclosing entries, then the
document schema. Without one, no hint line is shown.
-f json output is an array of { key, schema, violations } objects; each
violation additionally carries the machine paths schemaPath (a JSON Pointer
into the schema file, e.g. /sections/0/sections/1/header) and the failing
keyword. A document bound to several schemas yields one report per schema.
The command exits 1 when any document has a violation, 0 when the store is
clean.
10. Schema errors
These are configuration errors — iwe schema validate prints them to stderr
and exits 2 before validating any document, rather than reporting them as
violations:
a
[schemas]entry naming a schema file that does not exist;an invalid glob in a
[schemas]entry'smatch;a
frontmattersubschema that fails the 2020-12 meta-schema, or contains an external or remote$ref;an unknown keyword anywhere outside
frontmatter— unlike JSON Schema, unknown keywords are rejected, so a typo cannot silently validate nothing (orderedis not a keyword, so it reports as unknown);an unknown block
type, an emptytypelist, or a type-specific block keyword on the wrong type (langoffcode,itemsoff a list,blocksoffquote— for a listtype, every listed type must accept the keyword);an invalid
patternregex, a negative count,minContainsgreater thanmaxContains,minItemsgreater thanmaxItems, orenumandconsttogether;occurrence or structural keywords inside a reduced section or block schema;
an unreachable entry in a
sectionsorblocksarray — a wildcard entry (one with no identity constraint) that is not last, since it absorbs every match and starves the entries after it; or an entry whose identity exactly duplicates an earlier one, since the earlier always binds first.
11. Examples
Header discipline for a whole store — every header capitalized and short,
every section within budget, nothing deeper than ###:
maxDepth: 3
allSections:
header: { pattern: "^[A-Z]", maxLength: 60 }
maxTokens: 400A log page — at least three dated entries, each small, extra sections allowed but budgeted:
sections:
- header: { pattern: '^\d{4}-\d{2}-\d{2}$' }
minContains: 3
maxTokens: 150
additionalSections:
maxTokens: 300A docs page — Installation and Usage required in order, Configuration optional:
sections:
- header: { pattern: ".+" }
maxContains: 1
sections:
- header: { const: Installation }
- header: { const: Usage }
- header: { const: Configuration }
minContains: 0Frontmatter only — the body left free:
frontmatter:
type: object
required: [type, date]
properties:
type: { const: post }
date: { type: string, format: date }
tags:
type: array
items: { type: string, pattern: "^[a-z][a-z0-9-]*$" }See also
iwe schema validate— the command that checks schemas, its output and exit codes.Configuration — the
[schemas]section and glob binding.Query Language — the corpus model and the field names the language cannot address.
485 files · 414 not served here
- .gitattributes (not served here)
- .githooks/pre-commit (not served here)
- .github/dependabot.yaml (not served here)
- .github/workflows/release-plz.yaml (not served here)
- .github/workflows/release.yaml (not served here)
- .github/workflows/rust.yml (not served here)
- .gitignore (not served here)
- .release-plz.toml (not served here)
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CONTRIBUTING.md
- Cargo.lock (not served here)
- Cargo.toml (not served here)
- LICENSE-APACHE
- README.ko.md
- README.md
- README.zh-CN.md
- crates/diwe/CHANGELOG.md (not served here)
- crates/diwe/Cargo.toml (not served here)
- crates/diwe/src/config.rs (not served here)
- crates/diwe/src/file.rs (not served here)
- crates/diwe/src/find.rs (not served here)
- crates/diwe/src/fs.rs (not served here)
- crates/diwe/src/keys.rs (not served here)
- crates/diwe/src/lib.rs (not served here)
- crates/diwe/src/loader.rs (not served here)
- crates/diwe/src/retrieve.rs (not served here)
- crates/diwe/src/schema.rs (not served here)
- crates/diwe/src/search.rs (not served here)
- crates/diwe/src/search_query.rs (not served here)
- crates/diwe/src/stats.rs (not served here)
- crates/diwe/src/tokens.rs (not served here)
- crates/diwe/src/watcher.rs (not served here)
- crates/diwe/tests/config_migration_test.rs (not served here)
- crates/diwe/tests/djot_fs_test.rs (not served here)
- crates/diwe/tests/gitignore_test.rs (not served here)
- crates/diwe/tests/nested_keys_test.rs (not served here)
- crates/diwe/tests/query_search.rs (not served here)
- crates/diwe/tests/search_test.rs (not served here)
- crates/diwe/tests/stats_test.rs (not served here)
- crates/diwe/tests/stats_warnings_test.rs (not served here)
- crates/diwe/tests/windows_paths_test.rs (not served here)
- crates/iwe/CHANGELOG.md (not served here)
- crates/iwe/Cargo.toml (not served here)
- crates/iwe/LICENSE-APACHE
- crates/iwe/README.md (not served here)
- crates/iwe/benches/common.rs (not served here)
- crates/iwe/benches/load.rs (not served here)
- crates/iwe/benches/query.rs (not served here)
- crates/iwe/benches/similarity.rs (not served here)
- crates/iwe/docs/agent.md (not served here)
- crates/iwe/docs/config.md (not served here)
- crates/iwe/docs/index.txt (not served here)
- crates/iwe/docs/query.md (not served here)
- crates/iwe/docs/schema.md (not served here)
- crates/iwe/help/attach/about.txt (not served here)
- crates/iwe/help/attach/after_help.txt (not served here)
- crates/iwe/help/attach/long_about.txt (not served here)
- crates/iwe/help/completions/about.txt (not served here)
- crates/iwe/help/completions/after_help.txt (not served here)
- crates/iwe/help/completions/long_about.txt (not served here)
- crates/iwe/help/count/about.txt (not served here)
- crates/iwe/help/count/after_help.txt (not served here)
- crates/iwe/help/count/long_about.txt (not served here)
- crates/iwe/help/create/about.txt (not served here)
- crates/iwe/help/create/after_help.txt (not served here)
- crates/iwe/help/create/long_about.txt (not served here)
- crates/iwe/help/delete/about.txt (not served here)
- crates/iwe/help/delete/after_help.txt (not served here)
- crates/iwe/help/delete/long_about.txt (not served here)
- crates/iwe/help/docs/about.txt (not served here)
- crates/iwe/help/docs/after_help.txt (not served here)
- crates/iwe/help/docs/long_about.txt (not served here)
- crates/iwe/help/export/about.txt (not served here)
- crates/iwe/help/export/after_help.txt (not served here)
- crates/iwe/help/export/long_about.txt (not served here)
- crates/iwe/help/extract/about.txt (not served here)
- crates/iwe/help/extract/after_help.txt (not served here)
- crates/iwe/help/extract/long_about.txt (not served here)
- crates/iwe/help/find/about.txt (not served here)
- crates/iwe/help/find/after_help.txt (not served here)
- crates/iwe/help/find/long_about.txt (not served here)
- crates/iwe/help/init/about.txt (not served here)
- crates/iwe/help/init/after_help.txt (not served here)
- crates/iwe/help/init/long_about.txt (not served here)
- crates/iwe/help/inline/about.txt (not served here)
- crates/iwe/help/inline/after_help.txt (not served here)
- crates/iwe/help/inline/long_about.txt (not served here)
- crates/iwe/help/new/about.txt (not served here)
- crates/iwe/help/new/after_help.txt (not served here)
- crates/iwe/help/new/long_about.txt (not served here)
- crates/iwe/help/normalize/about.txt (not served here)
- crates/iwe/help/normalize/after_help.txt (not served here)
- crates/iwe/help/normalize/long_about.txt (not served here)
- crates/iwe/help/rename/about.txt (not served here)
- crates/iwe/help/rename/after_help.txt (not served here)
- crates/iwe/help/rename/long_about.txt (not served here)
- crates/iwe/help/retrieve/about.txt (not served here)
- crates/iwe/help/retrieve/after_help.txt (not served here)
- crates/iwe/help/retrieve/long_about.txt (not served here)
- crates/iwe/help/schema/about.txt (not served here)
- crates/iwe/help/schema/after_help.txt (not served here)
- crates/iwe/help/schema/long_about.txt (not served here)
- crates/iwe/help/squash/about.txt (not served here)
- crates/iwe/help/squash/after_help.txt (not served here)
- crates/iwe/help/squash/long_about.txt (not served here)
- crates/iwe/help/stats/about.txt (not served here)
- crates/iwe/help/stats/after_help.txt (not served here)
- crates/iwe/help/stats/long_about.txt (not served here)
- crates/iwe/help/tree/about.txt (not served here)
- crates/iwe/help/tree/after_help.txt (not served here)
- crates/iwe/help/tree/long_about.txt (not served here)
- crates/iwe/help/update/about.txt (not served here)
- crates/iwe/help/update/after_help.txt (not served here)
- crates/iwe/help/update/long_about.txt (not served here)
- crates/iwe/src/export.rs (not served here)
- crates/iwe/src/export/dot_details_exporter.rs (not served here)
- crates/iwe/src/export/dot_exporter.rs (not served here)
- crates/iwe/src/export/graph_colors.rs (not served here)
- crates/iwe/src/export/graph_data.rs (not served here)
- crates/iwe/src/filter_args.rs (not served here)
- crates/iwe/src/help.rs (not served here)
- crates/iwe/src/init.rs (not served here)
- crates/iwe/src/init/agents.rs (not served here)
- crates/iwe/src/init/fit.rs (not served here)
- crates/iwe/src/init/okf.rs (not served here)
- crates/iwe/src/init/report.rs (not served here)
- crates/iwe/src/init/schemas/okf-index.yaml (not served here)
- crates/iwe/src/init/schemas/okf-log.yaml (not served here)
- crates/iwe/src/init/schemas/okf.yaml (not served here)
- crates/iwe/src/init/screen.rs (not served here)
- crates/iwe/src/init/writer.rs (not served here)
- crates/iwe/src/internal.rs (not served here)
- crates/iwe/src/internal/claude.rs (not served here)
- crates/iwe/src/internal/claude/digest.rs (not served here)
- crates/iwe/src/internal/claude/enable.rs (not served here)
- crates/iwe/src/internal/claude/hook.rs (not served here)
- crates/iwe/src/internal/claude/hook/index.rs (not served here)
- crates/iwe/src/internal/claude/hook/post_tool.rs (not served here)
- crates/iwe/src/internal/claude/hook/store.rs (not served here)
- crates/iwe/src/internal/claude/policy.rs (not served here)
- crates/iwe/src/internal/claude/prompt.rs (not served here)
- crates/iwe/src/internal/claude/record.rs (not served here)
- crates/iwe/src/internal/claude/session.rs (not served here)
- crates/iwe/src/lib.rs (not served here)
- crates/iwe/src/main.rs (not served here)
- crates/iwe/src/new.rs (not served here)
- crates/iwe/src/projection_args.rs (not served here)
- crates/iwe/src/render.rs (not served here)
- crates/iwe/src/schema.rs (not served here)
- crates/iwe/src/stats.rs (not served here)
- crates/iwe/templates/claude/enable/queries.md (not served here)
- crates/iwe/templates/claude/enable/schemas/decision.yaml (not served here)
- crates/iwe/templates/claude/enable/schemas/gotcha.yaml (not served here)
- crates/iwe/templates/claude/enable/schemas/learning.yaml (not served here)
- crates/iwe/templates/claude/enable/schemas/memory.yaml (not served here)
- crates/iwe/templates/claude/enable/schemas/topic.yaml (not served here)
- crates/iwe/templates/claude/enable/starter.md (not served here)
- crates/iwe/templates/claude/enable/starter.toml (not served here)
- crates/iwe/templates/claude/enable/typed.md (not served here)
- crates/iwe/templates/claude/enable/typed.toml (not served here)
- crates/iwe/templates/claude/memory_index.md.jinja (not served here)
- crates/iwe/templates/claude/policy.schema.yaml (not served here)
- crates/iwe/templates/claude/prompts/distill.md (not served here)
- crates/iwe/templates/claude/prompts/init.md (not served here)
- crates/iwe/templates/claude/prompts/reflect.md (not served here)
- crates/iwe/templates/stats.md.jinja (not served here)
- crates/iwe/tests/attach_test.rs (not served here)
- crates/iwe/tests/cli_filter_test.rs (not served here)
- crates/iwe/tests/common.rs (not served here)
- crates/iwe/tests/completions_test.rs (not served here)
- crates/iwe/tests/config_test.rs (not served here)
- crates/iwe/tests/create_test.rs (not served here)
- crates/iwe/tests/delete_test.rs (not served here)
- crates/iwe/tests/docs_test.rs (not served here)
- crates/iwe/tests/export_dot_test.rs (not served here)
- crates/iwe/tests/extract_test.rs (not served here)
- crates/iwe/tests/find_test.rs (not served here)
- crates/iwe/tests/init_test.rs (not served here)
- crates/iwe/tests/inline_test.rs (not served here)
- crates/iwe/tests/internal_test.rs (not served here)
- crates/iwe/tests/main.rs (not served here)
- crates/iwe/tests/new_test.rs (not served here)
- crates/iwe/tests/normalize_test.rs (not served here)
- crates/iwe/tests/prompt_test.rs (not served here)
- crates/iwe/tests/query_schema_test.rs (not served here)
- crates/iwe/tests/rename_test.rs (not served here)
- crates/iwe/tests/retrieve_test.rs (not served here)
- crates/iwe/tests/schema_strict_test.rs (not served here)
- crates/iwe/tests/schema_test.rs (not served here)
- crates/iwe/tests/schema_validate_test.rs (not served here)
- crates/iwe/tests/squash_test.rs (not served here)
- crates/iwe/tests/stats_test.rs (not served here)
- crates/iwe/tests/stats_warnings_test.rs (not served here)
- crates/iwe/tests/tree_test.rs (not served here)
- crates/iwe/tests/update_test.rs (not served here)
- crates/iwec/CHANGELOG.md (not served here)
- crates/iwec/Cargo.toml (not served here)
- crates/iwec/README.md (not served here)
- crates/iwec/src/lib.rs (not served here)
- crates/iwec/src/main.rs (not served here)
- crates/iwec/src/watcher.rs (not served here)
- crates/iwec/tests/attach_test.rs (not served here)
- crates/iwec/tests/extract_test.rs (not served here)
- crates/iwec/tests/find_test.rs (not served here)
- crates/iwec/tests/fixture.rs (not served here)
- crates/iwec/tests/http_transport_test.rs (not served here)
- crates/iwec/tests/inline_test.rs (not served here)
- crates/iwec/tests/main.rs (not served here)
- crates/iwec/tests/normalize_test.rs (not served here)
- crates/iwec/tests/prompt_test.rs (not served here)
- crates/iwec/tests/query_test.rs (not served here)
- crates/iwec/tests/resource_test.rs (not served here)
- crates/iwec/tests/retrieve_test.rs (not served here)
- crates/iwec/tests/schema_test.rs (not served here)
- crates/iwec/tests/server_info_test.rs (not served here)
- crates/iwec/tests/squash_test.rs (not served here)
- crates/iwec/tests/stats_test.rs (not served here)
- crates/iwec/tests/stats_warnings_test.rs (not served here)
- crates/iwec/tests/tree_test.rs (not served here)
- crates/iwec/tests/watcher_test.rs (not served here)
- crates/iwec/tests/write_test.rs (not served here)
- crates/iwes/CHANGELOG.md (not served here)
- crates/iwes/Cargo.toml (not served here)
- crates/iwes/LICENSE-APACHE
- crates/iwes/README.md (not served here)
- crates/iwes/src/lib.rs (not served here)
- crates/iwes/src/main.rs (not served here)
- crates/iwes/src/router.rs (not served here)
- crates/iwes/src/router/server.rs (not served here)
- crates/iwes/src/router/server/actions.rs (not served here)
- crates/iwes/src/router/server/actions/attach.rs (not served here)
- crates/iwes/src/router/server/actions/delete.rs (not served here)
- crates/iwes/src/router/server/actions/extract.rs (not served here)
- crates/iwes/src/router/server/actions/extract_all.rs (not served here)
- crates/iwes/src/router/server/actions/inline.rs (not served here)
- crates/iwes/src/router/server/actions/link.rs (not served here)
- crates/iwes/src/router/server/actions/list.rs (not served here)
- crates/iwes/src/router/server/actions/section.rs (not served here)
- crates/iwes/src/router/server/actions/sort.rs (not served here)
- crates/iwes/src/router/server/actions/templates.rs (not served here)
- crates/iwes/src/router/server/actions/transform.rs (not served here)
- crates/iwes/src/router/server/base_path.rs (not served here)
- crates/iwes/src/router/server/extensions.rs (not served here)
- crates/iwes/src/router/server/query.rs (not served here)
- crates/iwes/src/router/server/search.rs (not served here)
- crates/iwes/tests/attach_test.rs (not served here)
- crates/iwes/tests/change_list_type_test.rs (not served here)
- crates/iwes/tests/completion_test.rs (not served here)
- crates/iwes/tests/custom_actions_test.rs (not served here)
- crates/iwes/tests/delete_test.rs (not served here)
- crates/iwes/tests/did_change_test.rs (not served here)
- crates/iwes/tests/did_save_test.rs (not served here)
- crates/iwes/tests/extract_all_test.rs (not served here)
- crates/iwes/tests/extract_test.rs (not served here)
- crates/iwes/tests/fixture.rs (not served here)
- crates/iwes/tests/folding_range_test.rs (not served here)
- crates/iwes/tests/format_document_test.rs (not served here)
- crates/iwes/tests/go_to_definition_test.rs (not served here)
- crates/iwes/tests/handler_panic_test.rs (not served here)
- crates/iwes/tests/hover_test.rs (not served here)
- crates/iwes/tests/inlay_hints_test.rs (not served here)
- crates/iwes/tests/inline_quote_test.rs (not served here)
- crates/iwes/tests/inline_section_test.rs (not served here)
- crates/iwes/tests/link_test.rs (not served here)
- crates/iwes/tests/list_to_sections_test.rs (not served here)
- crates/iwes/tests/main.rs (not served here)
- crates/iwes/tests/reconcile_test.rs (not served here)
- crates/iwes/tests/references_test.rs (not served here)
- crates/iwes/tests/rename_test.rs (not served here)
- crates/iwes/tests/sections_to_list_test.rs (not served here)
- crates/iwes/tests/sort_test.rs (not served here)
- crates/iwes/tests/transform_test.rs (not served here)
- crates/iwes/tests/unknown_method_test.rs (not served here)
- crates/iwes/tests/watched_files_test.rs (not served here)
- crates/iwes/tests/watcher_test.rs (not served here)
- crates/iwes/tests/workspace_symbols_test.rs (not served here)
- crates/liwe/CHANGELOG.md (not served here)
- crates/liwe/Cargo.toml (not served here)
- crates/liwe/LICENSE-APACHE
- crates/liwe/README.md (not served here)
- crates/liwe/src/collation.rs (not served here)
- crates/liwe/src/djot.rs (not served here)
- crates/liwe/src/djot/reader.rs (not served here)
- crates/liwe/src/djot/writer.rs (not served here)
- crates/liwe/src/format.rs (not served here)
- crates/liwe/src/fs.rs (not served here)
- crates/liwe/src/graph.rs (not served here)
- crates/liwe/src/graph/arena.rs (not served here)
- crates/liwe/src/graph/basic_iter.rs (not served here)
- crates/liwe/src/graph/builder.rs (not served here)
- crates/liwe/src/graph/graph_line.rs (not served here)
- crates/liwe/src/graph/graph_node.rs (not served here)
- crates/liwe/src/graph/index.rs (not served here)
- crates/liwe/src/graph/path.rs (not served here)
- crates/liwe/src/graph/sections_builder.rs (not served here)
- crates/liwe/src/graph/squash_iter.rs (not served here)
- crates/liwe/src/graph/walk.rs (not served here)
- crates/liwe/src/init.rs (not served here)
- crates/liwe/src/init/detect.rs (not served here)
- crates/liwe/src/init/evidence.rs (not served here)
- crates/liwe/src/init/notes.rs (not served here)
- crates/liwe/src/init/notes/tests.rs (not served here)
- crates/liwe/src/init/probe.rs (not served here)
- crates/liwe/src/init/settings.rs (not served here)
- crates/liwe/src/lib.rs (not served here)
- crates/liwe/src/locale.rs (not served here)
- crates/liwe/src/markdown.rs (not served here)
- crates/liwe/src/markdown/reader.rs (not served here)
- crates/liwe/src/markdown/writer.rs (not served here)
- crates/liwe/src/model.rs (not served here)
- crates/liwe/src/model/config.rs (not served here)
- crates/liwe/src/model/document.rs (not served here)
- crates/liwe/src/model/frontmatter.rs (not served here)
- crates/liwe/src/model/ids.rs (not served here)
- crates/liwe/src/model/inline.rs (not served here)
- crates/liwe/src/model/key_index.rs (not served here)
- crates/liwe/src/model/node.rs (not served here)
- crates/liwe/src/model/node_iter.rs (not served here)
- crates/liwe/src/model/node_pointer.rs (not served here)
- crates/liwe/src/model/projector.rs (not served here)
- crates/liwe/src/model/reference.rs (not served here)
- crates/liwe/src/model/tree.rs (not served here)
- crates/liwe/src/model/tree_iter.rs (not served here)
- crates/liwe/src/model/writer.rs (not served here)
- crates/liwe/src/operations.rs (not served here)
- crates/liwe/src/operations/attach.rs (not served here)
- crates/liwe/src/operations/changes.rs (not served here)
- crates/liwe/src/operations/config.rs (not served here)
- crates/liwe/src/operations/delete.rs (not served here)
- crates/liwe/src/operations/extract.rs (not served here)
- crates/liwe/src/operations/inline.rs (not served here)
- crates/liwe/src/operations/rename.rs (not served here)
- crates/liwe/src/operations/select.rs (not served here)
- crates/liwe/src/operations/util.rs (not served here)
- crates/liwe/src/parser.rs (not served here)
- crates/liwe/src/query.rs (not served here)
- crates/liwe/src/query/block.rs (not served here)
- crates/liwe/src/query/block_eval.rs (not served here)
- crates/liwe/src/query/block_update.rs (not served here)
- crates/liwe/src/query/builder.rs (not served here)
- crates/liwe/src/query/cli.rs (not served here)
- crates/liwe/src/query/document.rs (not served here)
- crates/liwe/src/query/edges.rs (not served here)
- crates/liwe/src/query/eval.rs (not served here)
- crates/liwe/src/query/execute.rs (not served here)
- crates/liwe/src/query/filter.rs (not served here)
- crates/liwe/src/query/graph_match.rs (not served here)
- crates/liwe/src/query/project.rs (not served here)
- crates/liwe/src/query/schemas.rs (not served here)
- crates/liwe/src/query/schemas/draft-2026-08.json (not served here)
- crates/liwe/src/query/scores.rs (not served here)
- crates/liwe/src/query/search.rs (not served here)
- crates/liwe/src/query/sort.rs (not served here)
- crates/liwe/src/query/update.rs (not served here)
- crates/liwe/src/query/wire.rs (not served here)
- crates/liwe/src/schema.rs (not served here)
- crates/liwe/src/schema/document.rs (not served here)
- crates/liwe/src/schema/infer.rs (not served here)
- crates/liwe/src/state.rs (not served here)
- crates/liwe/tests/blocks.rs (not served here)
- crates/liwe/tests/comments_test.rs (not served here)
- crates/liwe/tests/djot_roundtrip.rs (not served here)
- crates/liwe/tests/formatting_test.rs (not served here)
- crates/liwe/tests/frontmatter_title_test.rs (not served here)
- crates/liwe/tests/html_test.rs (not served here)
- crates/liwe/tests/links_test.rs (not served here)
- crates/liwe/tests/live_resolution_test.rs (not served here)
- crates/liwe/tests/main.rs (not served here)
- crates/liwe/tests/normalization_escapes.rs (not served here)
- crates/liwe/tests/normalization_headers.rs (not served here)
- crates/liwe/tests/normalization_html.rs (not served here)
- crates/liwe/tests/normalization_lists.rs (not served here)
- crates/liwe/tests/normalization_metadata.rs (not served here)
- crates/liwe/tests/normalization_misc.rs (not served here)
- crates/liwe/tests/normalization_raw.rs (not served here)
- crates/liwe/tests/operations_inline_test.rs (not served here)
- crates/liwe/tests/operations_rename_test.rs (not served here)
- crates/liwe/tests/queries.rs (not served here)
- crates/liwe/tests/query_block_update.rs (not served here)
- crates/liwe/tests/query_blocks.rs (not served here)
- crates/liwe/tests/query_content_filter.rs (not served here)
- crates/liwe/tests/query_count.rs (not served here)
- crates/liwe/tests/query_delete.rs (not served here)
- crates/liwe/tests/query_deserialize.rs (not served here)
- crates/liwe/tests/query_filter_expression.rs (not served here)
- crates/liwe/tests/query_find.rs (not served here)
- crates/liwe/tests/query_frontmatter_prefixes.rs (not served here)
- crates/liwe/tests/query_graph.rs (not served here)
- crates/liwe/tests/query_scores.rs (not served here)
- crates/liwe/tests/query_update.rs (not served here)
- crates/liwe/tests/root_keys_test.rs (not served here)
- crates/liwe/tests/roundtrip_test.rs (not served here)
- crates/liwe/tests/squash_test.rs (not served here)
- crates/liwe/tests/task_items_test.rs (not served here)
- crates/liwe/tests/toc_test.rs (not served here)
- crates/liwe/tests/wide_document_test.rs (not served here)
- crates/liwe/tests/writer_escaping_test.rs (not served here)
- docs/Makefile (not served here)
- docs/architecture.md
- docs/benchmark.md
- docs/book.pdf (not served here)
- docs/book.typ (not served here)
- docs/cli-attach.md
- docs/cli-count.md
- docs/cli-create.md
- docs/cli-delete.md
- docs/cli-export.md
- docs/cli-extract.md
- docs/cli-find.md
- docs/cli-init.md
- docs/cli-inline.md
- docs/cli-new.md
- docs/cli-normalize.md
- docs/cli-rename.md
- docs/cli-retrieve.md
- docs/cli-schema.md
- docs/cli-squash.md
- docs/cli-stats.md
- docs/cli-tree.md
- docs/cli-troubleshooting.md
- docs/cli-update.md
- docs/cli-workflows.md
- docs/cli.md
- docs/comparison.md
- docs/configuration.md
- docs/data-model.md
- docs/debug-mode.md
- docs/design-principles.md
- docs/docs-basic.dot (not served here)
- docs/docs-basic.svg (not served here)
- docs/docs-detailed.dot (not served here)
- docs/docs-detailed.svg (not served here)
- docs/document-schema.md
- docs/documents-as-binary-tree.png (not served here)
- docs/feature-ai-commands.md
- docs/feature-attach.md
- docs/feature-auto-format.md
- docs/feature-autocomplete.md
- docs/feature-delete.md
- docs/feature-extract.md
- docs/feature-hover-preview.md
- docs/feature-inlay-hints.md
- docs/feature-inline.md
- docs/feature-link.md
- docs/feature-navigation.md
- docs/feature-normalization.md
- docs/feature-overview.md
- docs/feature-renaming.md
- docs/feature-search.md
- docs/feature-subdirectories.md
- docs/feature-text-manipulation.md
- docs/feature-visualization.md
- docs/helix.md
- docs/how-to-install.md
- docs/how-to-use.md
- docs/inclusion-links.md
- docs/index.md
- docs/keys.md
- docs/mcp.md
- docs/neovim.md
- docs/okf.md
- docs/query-language.md
- docs/search-ranking.md
- docs/spec.md
- docs/vscode.md
- docs/why-it-exists.md (not served here)
- docs/zed.md (not served here)
- glama.json (not served here)
- npm/cli-darwin-arm64/package.json (not served here)
- npm/cli-darwin-x64/package.json (not served here)
- npm/cli-linux-arm64/package.json (not served here)
- npm/cli-linux-x64/package.json (not served here)
- npm/cli-win32-x64/package.json (not served here)
- npm/iwe/README.md (not served here)
- npm/iwe/bin/iwe.js (not served here)
- npm/iwe/bin/iwec.js (not served here)
- npm/iwe/bin/iwes.js (not served here)
- npm/iwe/lib/run.js (not served here)
- npm/iwe/package.json (not served here)
- npm/mcp/README.md (not served here)
- npm/mcp/bin/iwe-mcp.js (not served here)
- npm/mcp/package.json (not served here)
- npm/stamp.js (not served here)
- server.json
Advantages
- Shared context allows agents to access and build upon the same notes written by the user. evidence: README.md
- Memory is stored as human-readable Markdown files that can be easily browsed, corrected, or deleted. evidence: README.md
- Data remains under user control in local folders, avoiding dependency on proprietary cloud storage. evidence: README.md
Limitations
- Requires manual setup of the MCP server or CLI tools to enable agent connectivity. evidence: README.md
- The system does not include an AI model, requiring the user to bring their own agent. evidence: README.md
Security
Risk level: Low risk
This brain runs
Git hooks (1)
.githooks/pre-commit(pre-commit):runs on git pre-commit
- Low risk: scripts-present (.githooks/pre-commit)
Attribution and licence
- Created by
- IWE
- Publisher
- IWE (Official IWE project)
- Source
- iwe-org/iwe · commit b733afe
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by IWE.
Install from source
414 of its files are not served here, so there is no ZIP. iwe-org/iwe at b733afe