Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion content/0.welcome.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ seo:
**Basic Memory** is real memory for your AI — a knowledge base you own. Built-in AI memory is small, vendor-owned, and usually invisible. Basic Memory is large, structured, and inspectable: a knowledge graph written in plain Markdown. Open it in any editor, hand it to any AI tool, and keep it forever.

::note{icon="i-lucide-megaphone"}
**New in v0.23:** the search release — reranking, Milvus, and a deadlock-free indexing core. See [What's New in v0.23](/whats-new/v0-23). Also new in Basic Memory Cloud: [Comments and Suggestions](/whats-new/comments-and-suggestions) and the [Interactive MCP App](/whats-new/interactive-mcp-app) for ChatGPT and Claude.
**New in v0.23:** the search release — reranking, Milvus, and a deadlock-free indexing core. The latest patch, v0.23.2, adds complete PostgreSQL full-text search and prevents case-duplicate folders. See [What's New in v0.23](/whats-new/v0-23). Also new in Basic Memory Cloud: [Comments and Suggestions](/whats-new/comments-and-suggestions) and the [Interactive MCP App](/whats-new/interactive-mcp-app) for ChatGPT and Claude.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Attribute PostgreSQL full-text search to v0.23.1

This attributes complete PostgreSQL full-text search to v0.23.2, but the release page and changelog identify it as a v0.23.1 fix; v0.23.2 only adds case-insensitive destination-folder resolution. Readers comparing patches or deciding which release introduced the search migration will get the wrong version boundary, so describe these as cumulative v0.23 patches or name v0.23.1 explicitly.

Useful? React with 👍 / 👎.

::

## Pick your path
Expand Down
2 changes: 1 addition & 1 deletion content/02.whats-new/01.v0-23.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,4 @@ Five database migrations run automatically on first start, including a one-time
Before upgrading an integration or automation, read [Upgrade to v0.23](/whats-new/v0-23-upgrade) for the breaking changes, required actions, and known issues.
::

For the complete list of changes, see the [Changelog](/whats-new/changelog) and the [v0.23.0 release on GitHub](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.0).
For the complete list of changes, see the [Changelog](/whats-new/changelog) and the GitHub release notes for [v0.23.0](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.0), [v0.23.1](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.1), and [v0.23.2](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.2).
6 changes: 5 additions & 1 deletion content/02.whats-new/02.comments-and-suggestions.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,18 @@ The note toolbar shows the number of unresolved comments and suggestions. Open i

## Review with an AI assistant

Comments and suggestions are stored with the Markdown using portable CriticMarkup. That means a connected assistant can review a note without immediately rewriting it, and the same open items remain available in the Cloud editor and the interactive MCP App.
Connected assistants now use the Cloud `review_note` MCP tool to add comments or insertion, deletion, and replacement suggestions without immediately rewriting the note. The same attributed threads appear in the Cloud editor and the interactive MCP App, where people and assistants can reply, resolve comments, and accept or reject suggestions.

Cloud's `read_note`, `edit_note`, and `search_notes` tools are review-aware too: reads return clean prose and structured threads by default, ordinary edits preserve active review work and reject overlapping changes, and search hides CriticMarkup while reporting review-attention counts.

Try asking:

```text
Review this note with comments and suggestions. Keep the original prose in place so I can accept each change individually.
```

The assistant reads the current note first, anchors each item to exact prose, and uses revision checksums before accepting or rejecting a proposal. It should use `review_note` rather than writing CriticMarkup directly.

## Learn more

:::card-group
Expand Down
6 changes: 4 additions & 2 deletions content/02.whats-new/05.changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Notable changes in each Basic Memory release, most recent first. For complete pa

## v0.23 — Search that ranks and scales

*[v0.23.0](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.0)*
*[v0.23.0](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.0) · [v0.23.1](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.1) · [v0.23.2](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.23.2)*

Semantic search takes a major step forward in v0.23. Opt-in cross-encoder reranking can rescore vector and hybrid candidates locally with FastEmbed or through LiteLLM, while Postgres deployments can move vector storage from pgvector to Milvus, Milvus Lite, or Zilliz Cloud. File-watcher writes now receive embeddings, non-BGE FastEmbed models are normalized correctly, SQLite full-text search covers complete long notes and relaxes non-Latin queries (CJK, Cyrillic, and other scripts), and reindex failures are reported honestly.

Expand All @@ -21,6 +21,8 @@ The reliability tail is substantial too: incremental full-text reindexing clears

Underneath those features, the indexing and persistence core moves to generation-versioned relations and observations, compare-and-swap materialization, consistent lock ordering, and batched resolution. Observations and relations now land with accepted writes, eliminating the deadlock and stale-projection failures that appeared under concurrent agent workloads.

**The v0.23.1 patch** brings PostgreSQL full-text search to parity with SQLite by indexing complete note bodies, scopes search reindexing to the selected project, adds `#bm:links_to` for forcing an ambiguous prose wikilink to use the generic relation type, and hardens `bm doctor` and in-place `bm update` runs. **v0.23.2** prevents `write_note` and `move_note` from creating case-duplicate folders when a requested path uniquely matches an existing folder case-insensitively.

This release also removes MCP tools and legacy API routes and changes several CLI, config, sync, edit, and pagination contracts. Read [What's New in v0.23](/whats-new/v0-23) for the highlights and [Upgrade to v0.23](/whats-new/v0-23-upgrade) before upgrading an integration or automation.

---
Expand All @@ -31,7 +33,7 @@ This release also removes MCP tools and legacy API routes and changes several CL

Two new Cloud collaboration surfaces make it easier to work with people and AI assistants without leaving your notes or conversation:

- **[Comments and Suggestions](/whats-new/comments-and-suggestions)** — add attributed comments or propose insertions, deletions, and replacements. Reviewers can reply, resolve comments, and accept or reject each suggestion individually.
- **[Comments and Suggestions](/whats-new/comments-and-suggestions)** — add attributed comments or propose insertions, deletions, and replacements. The Cloud `review_note` MCP tool gives connected assistants the same reply, resolve, accept, and reject workflow with checksum conflict protection.
- **[Interactive MCP App](/whats-new/interactive-mcp-app)** — browse, search, graph, read, edit, and review Basic Memory inside ChatGPT and Claude on web or desktop. Set an active writing folder or add a specific note to the conversation as context.

These are Basic Memory Cloud product updates. The versioned Core release notes continue under [All releases](#all-releases).
Expand Down
23 changes: 20 additions & 3 deletions content/02.whats-new/06.v0-23-upgrade.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ description: Breaking changes, migrations, and required actions when upgrading B

v0.23 applies database migrations automatically, but integrations and operator scripts need review. Complete the actions below before relying on existing automation.

::note{icon="i-lucide-package-check"}
Install **v0.23.2 or later** rather than stopping on v0.23.0. The two patch releases fix PostgreSQL search coverage and reindex safety, `bm doctor` and `bm update` reliability, and case-duplicate folder creation.
::

## Rebuild vectors after changing indexes

If you change `semantic_vector_index` between `pgvector` and `milvus`, rebuild the configured vector store:
Expand Down Expand Up @@ -74,15 +78,16 @@ Several v0.23 fixes require no migration or configuration change but affect oper

## Let migrations finish

Five revisions run automatically on first start:
Six revisions run automatically when upgrading from v0.22.1 to the latest v0.23 patch:

1. A durable note-file vacate record distinguishes moves from byte-identical copies.
2. The semantic manifest gains vector-index identity and readiness state.
3. Relation-derived search refreshes become durable, retryable work items.
4. Relations and their search refreshes gain generation ownership.
5. A one-time repair removes duplicate observations and orphaned observation rows from full-text search.
6. On PostgreSQL, a child full-text index stores bounded, overlapping chunks of complete note bodies and backfills existing notes. SQLite needs no equivalent schema change because it already indexes full content.

The final repair is not reversible through a downgrade. Markdown files remain the source of truth and the index is rebuildable, but back up `memory.db` before the upgrade if you want a pre-migration database snapshot.
The observation repair is not reversible through a downgrade. Markdown files remain the source of truth and the index is rebuildable, but back up `memory.db` before the upgrade if you want a pre-migration database snapshot. Let the PostgreSQL migration and index build finish before testing deep full-text matches.

## Configure custom FastEmbed model prompts

Expand All @@ -99,7 +104,17 @@ bm reindex --embeddings

The trailing spaces are meaningful and preserved. Rebuild embeddings after changing the model, dimensions, or either prefix so stored document vectors and new query vectors use the same contract. The symmetric default model (`bge-small-en-v1.5`) needs no prefixes.

## Known issues in v0.23.0
## Review the v0.23.1 and v0.23.2 fixes

The patch releases do not add breaking API changes, but they correct several behaviors worth knowing about:

- **PostgreSQL searches complete note bodies.** v0.23.1 backfills the new full-text chunks automatically. Boolean queries and punctuated terms work across the complete text, not only titles and capped content stems.
- **Reindexing is project-scoped.** Rebuilding search for one project no longer drops search rows belonging to sibling projects in the same database. The migration also repairs a missing shared search table if the old destructive path removed it.
- **Use `#bm:links_to` to disambiguate prose.** End a list item with the directive when a single word before a wikilink is prose rather than a relation type: `- Mother [[Alice]] #bm:links_to`. The directive remains readable in Markdown but is removed from indexed content.
- **`bm doctor` and `bm update` are safer.** Doctor waits for deferred materialization and can create its disposable project under `BASIC_MEMORY_PROJECT_ROOT`; update status output survives an in-place package replacement.
- **Folder casing resolves consistently.** In v0.23.2, `write_note(directory="schemas")` and note moves land in an existing unique `Schemas/` folder instead of creating a case-duplicate sibling. Resolution happens segment by segment for nested folders and behaves the same locally and in Cloud.

## Known issues in v0.23

### macOS file-identity edge cases

Expand All @@ -110,6 +125,8 @@ Two open issues can produce duplicate entities for a single file on macOS:

Workarounds: avoid case-only and normalization-only renames from MCP tools (rename through an intermediate name instead), and run `bm reindex --full -p <project>` to collapse duplicates if they appear.

The v0.23.2 folder-casing fix applies to the destination folders used by normal note writes and moves. It does not rename existing folders, merge existing case-variant siblings, or fix case-only and Unicode-normalization-only renames.

## Continue setup

- [Semantic Search](/concepts/semantic-search) — enable and tune reranking.
Expand Down
2 changes: 1 addition & 1 deletion content/03.cloud/04.ai-collaboration.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Click **Connect Agent** in the editor to start or resume an agent session for th

Select text in the editor and it appears in the agent pane, where you can send a request about it — a rewrite, a summary, or a next step. The agent's changes stream into the note as it works.

If you want to review changes before applying them, ask the agent to leave **CriticMarkup comments and suggestions** instead of rewriting the passage. Basic Memory renders that feedback in the review rail, where you can reply to comments, resolve threads, and accept or reject each proposed edit. See [Comments and Suggestions](/cloud/comments-and-suggestions).
If you want to review changes before applying them, ask the agent to leave **comments and suggestions** instead of rewriting the passage. Cloud-connected assistants use the `review_note` MCP tool to create attributed threads; Basic Memory renders them in the review rail, where you can reply to comments, resolve threads, and accept or reject each proposed edit. See [Comments and Suggestions](/cloud/comments-and-suggestions).

## The agent pane

Expand Down
35 changes: 33 additions & 2 deletions content/03.cloud/14.comments-and-suggestions.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,37 @@ The review rail keeps every unresolved item beside its highlighted passage. Sugg

## Review with an AI assistant

Because review feedback is stored as Markdown, a connected assistant can comment on a note without directly rewriting it. Ask it to:
Cloud-connected assistants use the `review_note` MCP tool to create and manage the same attributed threads you see in the editor. Ask one to:

```text
Review this note with comments and suggestions. Keep the original prose in place so I can accept each change individually.
```

The supported workflow is:

1. Call `read_note` with `review_mode="structured"` (the Cloud default) to get clean note prose, typed review items, and a `revision_checksum`.
2. Call `review_note(command="comment")` or `review_note(command="suggest")` with an exact, single-line prose anchor copied from that read.
3. Use the returned review IDs to `reply` or `resolve` a comment, or to `accept` or `reject` a suggestion.
4. Pass the latest checksum when accepting or rejecting. If the note changed, read it again instead of applying a decision to stale text.

For example:

```text
review_note(
identifier="Launch plan",
command="suggest",
anchor={"exact": "Ship the beta on Friday."},
suggestion_kind="replacement",
replacement="Ship the beta after the security review."
)
```

Anchors can include exact `prefix` or `suffix` context, or a one-based `occurrence`, when the same sentence appears more than once. New threads are attributed to the detected MCP client.

::warning
Do not ask an assistant to write CriticMarkup directly. Raw markup does not create the structured thread records used for attribution, replies, resolution, and accept/reject controls. Use `review_note`; reserve `read_note(review_mode="raw")` for inspecting exact persisted Markdown.
::

The common CriticMarkup forms are:

```markdown
Expand All @@ -103,7 +128,13 @@ The common CriticMarkup forms are:
{~~original text~>replacement text~~}
```

Basic Memory adds stable IDs and attributed review records when it creates a thread. Let the editor manage that metadata rather than changing it by hand. The metadata stays out of the editor body and is removed from public shared-note output.
Basic Memory adds stable IDs and attributed review records when it creates a thread. Let the editor and `review_note` manage that metadata rather than changing it by hand. The metadata stays out of the editor body and is removed from public shared-note output.

### Edit prose while review work is open

Cloud's normal `edit_note` tool preserves active review records. When a note contains review work, first read it in structured mode and pass that read's `revision_checksum` as `expected_checksum`. An edit that intersects reviewed prose is rejected with the blocking review ID; resolve the comment or accept/reject the suggestion before changing that passage. `write_note(overwrite=true)` remains an intentional full replacement and can remove review state.

Search results also hide CriticMarkup storage bytes. JSON results include `review_summary` counts so an assistant can see that a matching note still needs review without loading every thread.

---

Expand Down
3 changes: 3 additions & 0 deletions content/03.cloud/15.mcp-app.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ Choose **Edit** from the note reader to open the rich editor. It includes headin

The same editor supports shared review markup. You can add attributed comments, suggest insertions, deletions, or replacements, and open any unresolved thread. Suggestions remain inline with the note until someone **Accepts** or **Rejects** them; comments can be resolved or deleted without changing the note text.

Notes and search results show pending comment and suggestion counts, so review work is visible before you open the editor. Excerpts remain clean prose and never expose the underlying CriticMarkup storage.

::theme-image{light="/screenshots/mcp-app/mcp-app-review-light.png" dark="/screenshots/mcp-app/mcp-app-review-dark.png" alt="A replacement suggestion with Accept and Reject actions in the MCP App editor"}
::

Expand All @@ -133,6 +135,7 @@ The interactive app is for something you want to **see or operate**. Normal MCP
| Read note content for an answer or summary | `read_note` |
| Search for information the assistant will use | `search_notes` |
| Get a directory listing as data | `list_directory` |
| Add, reply to, resolve, accept, or reject review work | `review_note` |

For example, “What did we decide about authentication?” should use search and read tools. “Open my authentication notes so I can browse them” should use the interactive app.

Expand Down
4 changes: 3 additions & 1 deletion content/07.concepts/1.knowledge-format.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,9 @@ Relations can link to notes that don't exist yet. When those notes are created l

Basic Memory tries exact identities first: permalink, title, and file path. At the project root, a filename-stem link such as `[[alpha_note]]` can resolve `alpha_note.md` even when the note's frontmatter title is different.

If no exact identity matches, Basic Memory can try a Unicode case-insensitive file-path alias that treats underscores and hyphens as equivalent. The fallback must identify exactly one note; `[[alpha-note]]` remains unresolved when multiple files collapse to the same alias. This forgiving lookup applies only to link resolution—writes and updates keep their exact identity rules and never use the alias to choose a file to overwrite or move.
If no exact identity matches, Basic Memory can try a Unicode case-insensitive file-path alias that treats underscores and hyphens as equivalent. The fallback must identify exactly one note; `[[alpha-note]]` remains unresolved when multiple files collapse to the same alias. This forgiving lookup applies only to link resolution—writes and updates keep their exact note identity rules and never use the alias to choose a file to overwrite or move.

Directory casing is handled separately. Since v0.23.2, each destination-folder segment on a note write or move resolves to an existing folder when there is exactly one case-insensitive match, so `schemas/drafts` can land in `Schemas/Drafts`. Unknown folders are created with the requested spelling, existing case-variant siblings remain ambiguous, and the note's basename is never case-corrected by this folder rule.

For relation-type conventions and how inline references index, see [Observations and Relations](/concepts/observations-and-relations).

Expand Down
10 changes: 10 additions & 0 deletions content/07.concepts/3.observations-and-relations.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,16 @@ Relations are directional. `System Design - depends_on -> Caching Layer` creates
**Quote multi-word relation types.** A relation type is a single token (`depends_on`, `relates_to`). If you want a multi-word type, **quote it** — `"depends on" [[Caching Layer]]`. Unquoted prose before a wikilink is no longer treated as a relation type: a bare or prose list item like `- [[Caching Layer]]` or `- see also [[Caching Layer]]` is indexed as a generic `links_to` connection. (Changed in [v0.21.0](https://github.com/basicmachines-co/basic-memory/releases/tag/v0.21.0).)
::

### Force a generic relation from single-word prose

A single token before a wikilink normally looks like an explicit relation type. When that token is prose instead, end the list item with `#bm:links_to`:

```markdown
- Mother [[Alice]] #bm:links_to
```

This creates the generic `links_to` relation instead of a `Mother` relation. The directive stays in the Markdown source so the intent is visible, but Basic Memory removes it from the indexed observation and relation text. This syntax was added in v0.23.1.

### Inline references

You can also link to other notes anywhere in a note's body text using `[[wiki links]]`:
Expand Down
Loading
Loading