|
| 1 | +# v0.19.0 Release Notes |
| 2 | + |
| 3 | +## Overview |
| 4 | + |
| 5 | +v0.19.0 is a major release that introduces semantic vector search, a schema validation system, |
| 6 | +project-prefixed permalinks, per-project cloud routing, and a significant upgrade to FastMCP 3.0. |
| 7 | +It includes 66 commits since v0.18.0 spanning new features, architectural improvements, and |
| 8 | +stability fixes across both SQLite and Postgres backends. |
| 9 | + |
| 10 | +--- |
| 11 | + |
| 12 | +## Major Features |
| 13 | + |
| 14 | +### Semantic Vector Search |
| 15 | + |
| 16 | +Full vector and hybrid search for SQLite (via sqlite-vec) and Postgres (via pgvector). |
| 17 | + |
| 18 | +- **Hybrid search mode** combines full-text search (FTS) with vector similarity for best results |
| 19 | +- **Default search mode** is now `hybrid` when semantic search is enabled, `text` when disabled |
| 20 | +- Embedding providers: FastEmbed (local, default) or OpenAI API |
| 21 | +- Configurable similarity threshold via `semantic_min_similarity` (default 0.55) |
| 22 | +- Per-query `min_similarity` override on `search_notes` tool |
| 23 | +- Auto-backfill: existing entities get embeddings generated on first startup |
| 24 | +- Backend-specific distance-to-similarity conversion (cosine for SQLite, inner product for Postgres) |
| 25 | +- FTS fallback: if semantic dependencies are missing, search gracefully degrades to text-only |
| 26 | + |
| 27 | +**Configuration:** |
| 28 | +```json |
| 29 | +{ |
| 30 | + "semantic_search_enabled": true, |
| 31 | + "semantic_embedding_provider": "fastembed", |
| 32 | + "semantic_embedding_model": "bge-small-en-v1.5", |
| 33 | + "semantic_min_similarity": 0.55 |
| 34 | +} |
| 35 | +``` |
| 36 | + |
| 37 | +**Usage:** |
| 38 | +``` |
| 39 | +search_notes("machine learning concepts", search_type="hybrid") |
| 40 | +search_notes("similar to my notes on coffee", search_type="vector") |
| 41 | +search_notes("exact phrase match", search_type="text") |
| 42 | +search_notes("broad search", min_similarity=0.3) # lower threshold for more results |
| 43 | +``` |
| 44 | + |
| 45 | +### Schema System |
| 46 | + |
| 47 | +Validate note structure against user-defined schemas with frontmatter-based rules. |
| 48 | + |
| 49 | +- Define schemas as YAML in note frontmatter with field types, required fields, and constraints |
| 50 | +- Frontmatter validation during sync — malformed notes get clear error messages |
| 51 | +- Schema inference from existing notes to bootstrap schemas from your content |
| 52 | +- Schema diff to compare two schemas and see changes |
| 53 | +- Available via MCP tools and CLI |
| 54 | + |
| 55 | +### Project-Prefixed Permalinks |
| 56 | + |
| 57 | +Permalinks now include the project name for unambiguous cross-project references. |
| 58 | + |
| 59 | +- Memory URLs like `memory://project-name/folder/note` route to the correct project |
| 60 | +- Existing non-prefixed permalinks continue to work (backwards compatible) |
| 61 | +- Controlled by `permalinks_include_project` config (default: true) |
| 62 | +- `build_context` and `search_notes` auto-detect project from URL prefix |
| 63 | + |
| 64 | +### Per-Project Cloud Routing |
| 65 | + |
| 66 | +Individual projects can be routed through the cloud while others stay local. |
| 67 | + |
| 68 | +- Set a project to cloud mode: `bm project set-cloud research` |
| 69 | +- Revert to local: `bm project set-local research` |
| 70 | +- Uses API key authentication: `bm cloud set-key bmc_abc123...` |
| 71 | +- MCP tools automatically route based on each project's mode |
| 72 | +- Local MCP server (`bm mcp`) still uses local routing for all projects by default |
| 73 | +- `--local` and `--cloud` CLI flags override per-command |
| 74 | + |
| 75 | +### Workspace Selection |
| 76 | + |
| 77 | +Cloud projects can target specific workspaces for multi-tenant environments. |
| 78 | + |
| 79 | +- `workspace` parameter on MCP tools for explicit workspace targeting |
| 80 | +- CLI workspace-aware project listing with `bm project list` |
| 81 | +- Spinner feedback while fetching cloud projects |
| 82 | + |
| 83 | +--- |
| 84 | + |
| 85 | +## New Tools and Capabilities |
| 86 | + |
| 87 | +### JSON Output Mode |
| 88 | + |
| 89 | +All MCP tools now support `output_format="json"` for machine-readable responses. |
| 90 | + |
| 91 | +- Default remains `"text"` for human-readable output (no breaking changes) |
| 92 | +- `build_context` defaults to `"json"` with slimmed payloads (redundant fields stripped) |
| 93 | +- CLI tool commands support `--format json` flag |
| 94 | + |
| 95 | +### `bm watch` Command |
| 96 | + |
| 97 | +New CLI command for real-time file watching and sync. |
| 98 | + |
| 99 | +```bash |
| 100 | +bm watch # Watch default project |
| 101 | +bm watch --project research # Watch specific project |
| 102 | +``` |
| 103 | + |
| 104 | +### Structured Metadata Search |
| 105 | + |
| 106 | +New `search_by_metadata` tool for searching by frontmatter fields. |
| 107 | + |
| 108 | +``` |
| 109 | +search_by_metadata({"status": "in-progress"}) |
| 110 | +search_by_metadata({"tags": ["security", "oauth"]}) |
| 111 | +search_by_metadata({"priority": {"$in": ["high", "critical"]}}) |
| 112 | +search_by_metadata({"schema.confidence": {"$gt": 0.7}}) |
| 113 | +``` |
| 114 | + |
| 115 | +### `tag:` Search Shorthand |
| 116 | + |
| 117 | +Search by tag using convenient shorthand syntax. |
| 118 | + |
| 119 | +``` |
| 120 | +search_notes("tag:security") |
| 121 | +search_notes("tag:coffee AND tag:brewing") |
| 122 | +``` |
| 123 | + |
| 124 | +### Entity User Tracking |
| 125 | + |
| 126 | +Entities now track `created_by` and `last_updated_by` fields for attribution. |
| 127 | + |
| 128 | +### Matched Chunk Text in Search |
| 129 | + |
| 130 | +Search results now include `matched_chunk` field showing the specific text that matched. |
| 131 | + |
| 132 | +--- |
| 133 | + |
| 134 | +## Architecture Changes |
| 135 | + |
| 136 | +### FastMCP 3.0 Upgrade |
| 137 | + |
| 138 | +Upgraded from FastMCP 2.12.3 to 3.0.1. |
| 139 | + |
| 140 | +- Tool annotations (`readOnlyHint`, `openWorldHint`) for better client integration |
| 141 | +- Improved MCP protocol compliance |
| 142 | +- Better error handling and context management |
| 143 | + |
| 144 | +### Prompts Call MCP Tools Directly |
| 145 | + |
| 146 | +MCP prompts (`search`, `continue_conversation`) now call MCP tools directly instead of |
| 147 | +going through API endpoints. This fixes empty results in discovery mode and ensures prompts |
| 148 | +use the same resolution logic as tools (including LinkResolver fallback). |
| 149 | + |
| 150 | +### build_context LinkResolver Fallback |
| 151 | + |
| 152 | +`build_context` now falls back to LinkResolver when an exact permalink lookup returns empty. |
| 153 | +This uses the same 7-strategy resolution pipeline as `read_note`, so callers no longer get |
| 154 | +empty results for valid note identifiers that don't match exact permalinks. |
| 155 | + |
| 156 | +### Sync Handles Semantic Dependency Errors Gracefully |
| 157 | + |
| 158 | +When sqlite-vec or another embedding provider is unavailable, `sync_file` now catches |
| 159 | +`SemanticDependenciesMissingError` separately. The entity is created and FTS-indexed |
| 160 | +successfully — only vector embeddings are skipped, with a clear warning: |
| 161 | + |
| 162 | +``` |
| 163 | +WARNING: Semantic search dependencies missing — vector embeddings skipped for path=note.md. |
| 164 | +Run 'bm reindex --embeddings' after resolving the dependency issue. |
| 165 | +``` |
| 166 | + |
| 167 | +### Unified Project Path |
| 168 | + |
| 169 | +Cloud projects with bisync now store the local filesystem path in `path` (not the Docker |
| 170 | +container path). Config migration automatically promotes `local_sync_path` → `path` for |
| 171 | +existing configs. |
| 172 | + |
| 173 | +--- |
| 174 | + |
| 175 | +## CLI Improvements |
| 176 | + |
| 177 | +### Status and Doctor Default to Local Routing |
| 178 | + |
| 179 | +`bm status` and `bm doctor` now default to local routing since they scan the local filesystem. |
| 180 | +Previously, cloud-mode projects would route these commands to the cloud API, which returned |
| 181 | +Docker-internal paths that don't exist locally. |
| 182 | + |
| 183 | +### `--format json` for CLI Tool Commands |
| 184 | + |
| 185 | +All `bm tool` subcommands support `--format json` for machine-readable output, enabling |
| 186 | +integration with scripts and plugins. |
| 187 | + |
| 188 | +### Cloud Promo and Analytics |
| 189 | + |
| 190 | +- Cloud promo panel shown on first run or version bump with OSS discount code |
| 191 | +- Anonymous usage telemetry via Umami Cloud (promo/login funnel events only) |
| 192 | +- Opt out with `BASIC_MEMORY_NO_PROMOS=1` |
| 193 | +- No PII, no file contents, no per-command tracking |
| 194 | +- See [Telemetry](https://github.com/basicmachines-co/basic-memory#telemetry) in README |
| 195 | + |
| 196 | +--- |
| 197 | + |
| 198 | +## Bug Fixes |
| 199 | + |
| 200 | +- **#582**: build_context returns empty results on valid note identifiers |
| 201 | +- **#575**: Remove hardcoded "main" default from default_project |
| 202 | +- **#595**: recent_activity dedup and pagination across MCP tools |
| 203 | +- **#593**: Backend-specific distance-to-similarity conversion |
| 204 | +- **#592**: Strip NUL bytes from content before PostgreSQL search indexing |
| 205 | +- **#562**: Use VIRTUAL instead of STORED columns in SQLite migration |
| 206 | +- **#558**: Add X-Tigris-Consistent headers to all rclone commands |
| 207 | +- **#541**: Handle EntityCreationError as conflict |
| 208 | +- **#536**: Stabilize metadata filters on Postgres |
| 209 | +- **#533**: Fix recent_activity prompt defaults |
| 210 | +- **#530**: Prevent spurious `metadata: {}` in frontmatter output |
| 211 | +- **#601**: Return matched chunk text in search results |
| 212 | +- Parameterize SQL queries in search repository type filters |
| 213 | +- Double-default display in project list |
| 214 | +- `ensure_frontmatter_on_sync` default changed to `True` |
| 215 | +- Status/doctor commands fail with cloud-mode projects (Docker path error) |
| 216 | +- Prompts return "0 projects" in discovery mode |
| 217 | + |
| 218 | +--- |
| 219 | + |
| 220 | +## Internal / Developer |
| 221 | + |
| 222 | +- **#598**: Upgrade FastMCP 2.12.3 → 3.0.1 with tool annotations |
| 223 | +- **#594**: Add `ty` as supplemental type checker |
| 224 | +- **#538**: Add fast feedback loop tooling (`just fast-check`, `just doctor`, `just testmon`) |
| 225 | +- **#600**: Rename `entity_type` to `note_type` for consistency |
| 226 | +- **#596**: Fix CLI runtime defects and audit regressions |
| 227 | +- CLI refactoring and workspace-aware cloud project listing |
| 228 | +- Split and speed up PR test matrix in CI |
| 229 | + |
| 230 | +--- |
| 231 | + |
| 232 | +## Configuration Changes |
| 233 | + |
| 234 | +| Setting | Old Default | New Default | Notes | |
| 235 | +|---------|-------------|-------------|-------| |
| 236 | +| `semantic_search_enabled` | `false` | `true` | Semantic search on by default | |
| 237 | +| `ensure_frontmatter_on_sync` | `false` | `true` | Frontmatter added during sync | |
| 238 | +| `permalinks_include_project` | `false` | `true` | Project prefix in permalinks | |
| 239 | + |
| 240 | +--- |
| 241 | + |
| 242 | +## Upgrade Notes |
| 243 | + |
| 244 | +- **Semantic search dependencies** are now included by default. If sqlite-vec fails to load, |
| 245 | + search gracefully falls back to FTS. Run `bm reindex --embeddings` to generate embeddings |
| 246 | + for existing content. |
| 247 | +- **Project-prefixed permalinks** are enabled by default. Existing notes keep their current |
| 248 | + permalinks until modified. Set `permalinks_include_project: false` to disable. |
| 249 | +- **Frontmatter on sync** is now enabled by default. Files without frontmatter will have it |
| 250 | + added on next sync. Set `ensure_frontmatter_on_sync: false` to preserve old behavior. |
| 251 | +- **Config migration** runs automatically for cloud projects with bisync — `local_sync_path` |
| 252 | + is promoted to `path` so filesystem operations work correctly. |
0 commit comments