Conversation
Cuts the v0.1.35 release. Bumps `packages/memtomem/pyproject.toml` to 0.1.35, syncs the workspace pin in `uv.lock`, and dates the existing [Unreleased] section while folding in the merged-since-v0.1.34 changes. Highlights for this release: - feat(web): model-readiness banner via /api/system/model-readiness (#703, closes #696) — first search after a cold-cache boot stops feeling like a hung UI. - feat(web): i18n wired up across Export / Import / Tags sort / Auto-Tag / Timeline labels (#695) and the Sources "Load All" button (#727, closes #681). - fix(web): mm web SPA + /api/docs work fully offline — vendored DOMPurify, marked, Prism, Swagger UI; CSP tightened to drop external CDNs; ~1.7 MB minified (#706, #712, closes #693). - fix(web): Context overview badge surfaces multi-runtime divergence instead of false-green (#704, closes #692); Home bar chart shows full namespace on hover (#694). - fix(context): installed_at captured from FS max(st_mtime_ns) + µs ceiling so just-installed assets don't false-positive `dirty` on Windows (#733, closes #732). - Windows compat (refs #643, #644): mm init no longer crashes on cp1252/cp437 consoles (#728); norm_dir_prefix uses os.sep so memory_dir prefixes match (#717, closes #647); seven MCP tools' source_filter folds path separators (#722, closes #720); categorize_memory_dir handles backslash paths (#716, closes #316); ~/... path_glob expands via as_posix() (#726); mm wiki override prints consistent separators (#719). Plus a ~133-site HOME monkeypatch sweep + POSIX-only skipif markers (#714, #713, #721, #725, #729, #711, #718, #723, #724). - docs: warn that mm embedding-reset needs an idle DB to avoid the same-dim model-swap race (#710, closes #707). Co-Authored-By: Claude <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Cuts the v0.1.35 release. Three-file diff (per the split-PR pattern):
packages/memtomem/pyproject.toml—version = "0.1.35"uv.lock— workspace pin syncCHANGELOG.md—[Unreleased]→[0.1.35] — 2026-05-02, with themerged-since-v0.1.34 entries folded in by section
What's in this release
Added
mm web(feat(web): surface fastembed model load state via banner (#696) #703, closes First search is silent for 30s+ while embedding/reranker models download — surface progress #696). NewGET /api/system/model-readinessendpoint reports per-componentload state (
embedder+reranker) derived from_loading/_load_errorflags plus a fastembed cache filesystem probe. Theheader banner polls the endpoint and renders
Downloading bge-m3 (~2300 MB)…/Loading model…/Model failed to loadso the first search after a cold-cache bootno longer feels like a hung UI.
Timeline (feat(web): wire up missing data-i18n on Export, Tags sort, Auto-Tag, Timeline #695) and the Sources "Load All" button (i18n: promote "Load All" button label to chunks.load_all locale key #727, closes
i18n: promote "Load All" button label to chunks.load_all locale key #681) — Korean-mode users no longer see
Source Filter,Today,Last 7 days,Count↓,Dry run,Limit, etc. as untranslatedEnglish mid-page.
Fixed
mm webSPA +/api/docswork fully offline (fix(web): vendor cdnjs assets so the SPA works offline (#693 part 1) #706, fix(web): vendor Swagger UI so /api/docs works offline (#693 part 2) #712,closes Web UI and /api/docs depend on cdnjs/jsdelivr — vendor or fallback for offline use #693). DOMPurify, marked, Prism (5 langs + theme), and the
Swagger UI bundle/css are now vendored under
web/static/vendor/with pinned SHA-256 in
THIRD_PARTY_LICENSES.md. CSP tightens toscript-src 'self'(no'unsafe-inline'); a paired positive +negative regression guard pins it. Footprint: ~1.7 MB total
minified.
PR fix(storage): block duplicate chunk inserts via UNIQUE + INSERT OR IGNORE (#691) #705) — already in the merged
[Unreleased]section. AddsUNIQUE(namespace, source_file, content_hash, start_line)+INSERT OR IGNORE; migration is automatic on first startup —duplicate groups collapse with the highest-
access_count + use_countrow winning (
BEGIN IMMEDIATE/COMMITso two booting processesdon't both run the cleanup).
in_syncstates (fix(web): surface non-in_sync status in Context overview badge (#692) #704,closes Context overview shows '3/3 synced' green badge when missing_target > 0 #692) — the badge now sums
missing_target + missing_canonical + out_of_sync + parse_errorand displays themost actionable status, so multi-runtime divergence stops showing
as
3/3 syncedwhen half the runtimes are missing targets.titleattribute (fix(web): show full namespace on hover in Home bar chart #694).
installed_atcaptured from filesystem max(st_mtime_ns)false-positive as
dirtyon Windows under FILETIME /time.time()clock-domain skew. POSIX byte-identical for ordinary writes.
/vs\\) #643, Windows: HOME monkeypatch doesn't reachPath.home()on Windows (uses USERPROFILE) #644) — first batch landedthis release:
mm initno longer crashes on cp1252/cp437 consoles (fix(cli): force UTF-8 stdout/stderr on Windows console (#643 cluster H-1) #728,cluster H-1).
norm_dir_prefixusesos.sepso memory_dir prefixes matchchunks.source_file(fix(indexing): use os.sep for memory_dir prefix so Windows paths match (#647) #717, closes Windows: Path canonicalization in indexing —kinddetection + memory_dir comparisons #647).source_filterfolds path separators across seven MCP tools(
mem_search,mem_list,mem_consolidate,mem_decay,mem_auto_tag,mem_export_chunks,mem_entity_scan) (fix(search): normalize separators in source_filter match (#720) #722,closes Windows: search source_filter substring match ignores separator (sibling of #647) #720).
categorize_memory_dirhandles backslash paths so themm initwizard auto-detects Claude / Codex / Gemini memory folders on
Windows (fix(config): support Windows backslash paths in categorize_memory_dir (#316) #716, closes Windows: wizard fails to auto-detect Claude/Codex memory dirs (backslash path regex) #316).
~/...path_globrules expand via.as_posix()sopathspec.GitIgnoreSpecactually matches files (fix(config): use as_posix() for tilde-expanded path_glob (#643 cluster E) #726).mm wiki overrideprints consistent forward-slash separatorsin the
Seeded …line so it matches the adjacentgit add …hint (fix(wiki): use as_posix() for Seeded path display (#643 follow-up) #719).
set_homehelper + ~133 HOME monkeypatch sweep(test(windows): set_home helper + sweep ~133 HOME monkeypatch sites (refs #644) #714); POSIX-only
skipifmarkers (test: skipif POSIX-only assertions on Windows (mode bits, fcntl, signal) — Windows CI PR 2/N #713, test(windows): skipif POSIX-only pwd.getpwuid simulation in fastembed_cache (#643) #721, test(windows): skipif POSIX-only claude-projects discovery tests (#643) #725, test(windows): skipif POSIX-only unlink semantics in test_force_overrides_db_lock (#643 cluster H-2) #729);path-separator normalisation (test: normalize path separators in 7 cross-platform assertions (#643) #711, test(windows): normalize path separators in 8 wiki override assertions (#643) #718);
shutil.whichforthe
mmentry-point lookup (test(windows): use shutil.which for mm entry-point lookup (#643) #723); Windows-friendlytest_init_cmd.py(test(windows): make test_init_cmd.py Windows-compatible (#643) #724).Documentation
mm embedding-resetneeds an idle DB (docs(embeddings): warn that embedding-reset needs an idle DB #710, closes Embedding-loss race when two processes use different models on the same DB (follow-up from #691) #707) —callout in
configuration.md#reset-flowand a one-line warning inembeddings.md"Switching Models on an Existing Index" cover thesame-dim model-swap race that PR fix(storage): block duplicate chunk inserts via UNIQUE + INSERT OR IGNORE (#691) #705's
INSERT OR IGNOREpathcannot catch.
Release mechanics
This is a behavior-change release (storage migration, install-time
installed_atcapture change, CSP tightening). Perfeedback_prerelease_dry_run.md/project_release_workflow.md:test-v0.1.35a1tag from the merge sha → TestPyPI dry-run.pypienvironment for the test tag, smoke-test thewheel in an isolated worktree (fresh
uv tool install), thenpush
v0.1.35from the same sha.pypiagain ifpending_deploymentsis non-empty(default expectation per the v0.1.31 / v0.1.34 datapoints — the
v0.1.30 same-sha auto-skip was the exception).
gh release create v0.1.35with notes extracted from thisCHANGELOG section.
Test plan
uv run pytest packages/memtomem/tests/test_docs_guards.py -q— 11 passed (CHANGELOG schema).
lint,typecheck,test,notebooks,golden-path,CLAAssistant.uv tool install memtomem==0.1.35from
https://test.pypi.org/simple/, confirm the storagemigration log line emits exactly once and
mm --versionprints
0.1.35.uvx --refresh --from memtomem==0.1.35 mm --versionpolls clean.
🤖 Generated with Claude Code