mindin

io.github.gronarePublished by GitHub account gronarev0.15.0Updated Nov 6, 2026

Indexed search, schema-checked writes and session hooks for a markdown notes vault

Overview

AI-generated overview

Indexed markdown notes vault for coding agents: full-text search, schema-checked writes, and session hooks tying notes to git history.

What you can do
  • Search and read notes: full-text search over a local SQLite index, read a note with its etag, list paths, and pull session context (system notes, open tasks, references, repo log tail).
  • Write and edit notes: create or overwrite with schema validation and conditional etags, append dated lines, move or rename notes.
  • Manage note lifecycle: set status (backlog, active, draft), close finished work into the archive, delete notes.
  • Track deferred work: file backlog notes with area and priority, list the backlog sorted by priority and age.
  • Log and maintain: append one dated line per repo per session with commit shas, lint the vault for drift, initialize a vault schema and views, check identity and…
When to use it
Use it when an assistant should keep durable project memory across sessions — plans, decisions, gotchas and open tasks — as plain markdown you own, and when you want that memory tied to the code and commits it describes.
Requirements
Runs locally as a Python package (uvx or uv tool install) over stdio. Needs a vault: either VAULT_PATH pointing at a folder, or the S3_* settings (endpoint, bucket, region, prefix, access key, secret key) for an S3 or MinIO bucket. Optional settings include VAULT_CACHE_DIR, VAULT_SCHEMA and the stop-hook variables. Setup writes a schema into the vault.
Before you install
Requires storage credentials S3_ACCESS_KEY and S3_SECRET_KEY when the vault lives in a bucket. The assistant can write, move and permanently delete notes, and close archives them; writes are refused only when they break the schema. A stop hook can prompt the agent to save unsaved work. Anonymous usage data is sent only after you opt in.

Installation

In SourceWeft

  1. Open mindin in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

mindin

Memory for Claude and coding agents, kept as markdown notes you own, with a schema that holds and a tie to your git history.

Install

sh
curl -fsSL https://mindin.dev/install.sh | sh

It installs the mindin command with uv, asks where your vault lives (a folder, an S3 bucket or a vault server), and offers to add the vault to Claude Code, Codex and Cursor; it changes nothing in them without a yes. mindin was called notes-vault-mcp: the notes-vault-mcp package and command still work, and install and run mindin.

A vault server

A vault server with Docker Compose, for claude.ai, Claude Desktop, mobile and every machine you work on. You need a domain pointing at the machine, ports 80 and 443 open, and an SMTP account for sign-in links.

sh
mkdir notes-vault && cd notes-vaultcurl -fsSL -O https://github.com/gronare/mindin/releases/latest/download/compose.yml -O https://github.com/gronare/mindin/releases/latest/download/Caddyfilecurl -fsSL -o .env https://github.com/gronare/mindin/releases/latest/download/example.envdocker compose run --rm --no-deps vault master-key generate   # paste into .env, with VAULT_HOST and SMTPdocker compose up -ddocker compose exec vault mindin accounts invite [email protected]

Then open https://VAULT_HOST/account and sign in. Install with Docker walks through each step.

Without the script, on one machine: uv tool install mindin, then mindin setup.

mindin asks before it shares anonymous usage data, and sends nothing until you say yes: then, once a day, a random install id, mindin's version, the OS and CPU type and how mindin runs (plugin, CLI or server) go to signals.mindin.dev, never notes, names, paths or your vault's address. mindin setup --signals yes|no changes the answer. The install signal has the details.

Use

Add the server's address, https://VAULT_HOST/mcp, as a custom connector in claude.ai. Claude searches, reads and writes your notes. The same search from a shell on a signed-in machine:

console
$ mindin search "signing in"1 note · archive and superseded hidden
myapp  system  3 daysAreas/myapp.md  ## Sign-in Users sign in with passkeys; email links are the fallback.

What you get

  • Notes you own. Plain markdown in a folder or an S3 bucket; open them in Obsidian, keep them in git.
  • A schema with teeth. Required fields, legal statuses and kinds, a tag vocabulary; a write that breaks the contract is refused. Start from PARA, a simple vault, a journal or your own layout.
  • A lifecycle. close archives finished work, backlog_add files what was deferred, log_append writes one line per repo per session, lint reports drift.
  • Memory tied to code. A note names the paths it describes; the session-start hook prints the commits newer than the note.
  • Search that reads your languages. Stemming, folded diacritics, synonyms, and optional search by meaning that runs on your machine.
  • Your own vault server. Accounts with passkeys, email links, GitHub or your identity provider, several vaults each, shared vaults, sealed in storage.

Documentation

docs/ has the install guides, the how-tos for each client, the reference for every tool, command and setting, and how it works.

License

MIT. See LICENSE.

Source: README.md at commit dad1c8b

Tools

16

read_file

MODERATE — one round trip to storage. Returns the note with an `etag:` first line; pass that etag back to write_file to refuse a write over someone else's change. Search first. `.vault/schema.yml` reads the vault's schema.

Parameterspathrequired

write_file

WRITE — validates the frontmatter against the vault schema and refuses the write if it does not hold. Stamps `updated` with today and fills `date` when missing. Pass expected_etag from read_file to make the write conditional, or "*" to create a note that must not exist yet.

Parameterspathrequiredcontentrequiredexpected_etag

append_file

WRITE — appends to an existing note and bumps `updated`; the note must still satisfy the schema. A missing note is refused: create it with write_file.

Parameterspathrequiredcontentrequired

move_file

WRITE — moves or renames a note; the note must satisfy the schema at the destination. Use `close` to archive finished work.

Parametersdestrequiredsourcerequired

delete_file

WRITE — deletes a note for good. Prefer `close`, which keeps it.

Parameterspathrequired

list_files

CHEAP — paths only, no metadata and no bodies. `search` answers context questions better.

Parametersprefix

set_status

WRITE — changes a note's status without rewriting it: backlog (with a priority: urgent, high, medium, low) parks it, active picks it up again, draft. The triage list at session start is settled with this, append_file or close.

Parameterspathrequiredsourcestatusrequiredpriority

close

WRITE — finishes a note: sets status complete (or superseded with superseded_by when merged_into is given) and moves it into the archive. Run it in the same pass as the last commit of the work; a note left open is what makes the vault drift.

Parameterspathrequiredstatusmerged_into

backlog_add

WRITE — files an idea as a backlog note in the task folder: title, area (stem or [[stem]]), one line saying what and why, optional priority (urgent, high, medium, low) and source (who said it and when, or a sha). Call it the moment something is deferred, in so many words or in passing; picking the idea up later is setting its status to active.

Parametersarearequiredlinerequiredtitlerequiredsourcepriority

backlog

CHEAP — the backlog sorted by priority then age. Filter by area (a stem, or the prefix a family of stems shares) and by priority.

Parametersarealimitpriority

log_append

WRITE — appends one dated line to the repo log, with the commits it produced. Run once at the end of a session per repo. Creates the log note when it is missing. repo is the main checkout's name, also from a worktree; branch is the branch the commits were made on. area is the stem of the system note (or [[stem]]); it defaults to the repo name.

Parametersarealinerequiredreporequiredbranchcommits

context

CHEAP — the session-start call. Returns the system notes covering the code at `path`, the open tasks for it, the reference notes and the tail of the repo log, in one answer. Use it before searching blind. format "json" adds the system notes' paths and dates and the triage keys, for hooks that read it.

Parameterspathrepolimitqueryformat

whoami

CHEAP — who this connection signs in as and whether it may write. Answers JSON.

Takes no parameters.

lint

MODERATE — reads every note to report drift: broken frontmatter, missing required fields, missing area, unresolved wikilinks, orphans, stale open tasks, archived notes still marked active, duplicate stems and superseded targets that do not exist.

Takes no parameters.

init

WRITE — sets a vault up: writes `.vault/schema.yml` and the Obsidian Bases views into the vault root. Run once per vault, right after installing. preset picks the layout of a vault without a schema: default, para, simple, journal, custom; without it, the vault gets default. On a vault that has a schema, it only writes the views that are missing and keeps the rest; a layout is switched with the CLI (`init --preset <name> --force`) or on the account page, never through this tool.

Parametersforcepreset

Version history

4
  1. v0.15.0LatestNov 6, 2026
  2. v0.14.3Nov 5, 2026
  3. v0.14.2Nov 5, 2026
  4. v0.14.1Nov 5, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts