Skip to content

feat(web): Index tab — surface hard-to-discover behaviors in one bundle (static surfacing) #579

@memtomem

Description

@memtomem

Why

PR #575 unified the Index tab into a segmented mode toggle (folder / upload / compose), but the three modes still trigger backend behavior that is silent to the user — a mental-model gap remains. This issue bundles the 7 items that can be resolved through static surfacing alone, with no policy decisions required, into a single PR (commit-by-commit).

Tasks

  • 4.1 Surface the difference between one-shot folder scan and persistent registration — inline hint in the folder panel ("One-shot scan. If you need automatic re-indexing, use [Sources → Add path].") plus a CTA in the result toast. Backfills user-facing text for the semantic split that ADR-0004 already merged.
  • 4.4 Surface the default path for Compose's Target file — change the placeholder from `path/to/memories.md` to `~/.memtomem/memories/{today's date}.md (leave blank for auto)`. Echo the actual saved path in the success toast.
  • 4.5a Echo the saved path in the upload result toast — `~/.memtomem/uploads/{filename}`. (Symmetric with 4.4. The cumulative-disk-usage panel is tracked separately under an ADR.)
  • Embed jump — the header chip (`onnx/bge-m3 · sqlite`) gets `cursor: pointer` and on click jumps to Settings → Config. Closes a brittle step in the "why is this slow?" mental-model journey that starts on the Index tab.
  • Prev chore(core): strip STM integration residue #3 — Compose textarea `min-height: 120 → 240px` (5 rows → 10 rows). Gives real room for memo writing.
  • Prev docs: slim READMEs, add configuration + embeddings guides #6 — drop the box styling on `#index-config-hint` → plain muted text + `ⓘ`. Corrects the visual weight of the Extensions hint at the bottom of the Folder panel.
  • Prev ci: add release workflow for PyPI publish via Trusted Publishers #9 — clarify the `Target file` label — "Target file (save location)" or helper text. Reinforces semantics together with the 4.4 placeholder.

Decisions made (locked in this issue body)

  • Single PR + commit-by-commit — 7 items is near the PR limit. One commit per item so reviewers can step through. With squash merge, this is one line in the release notes.
  • No policy decisions — everything is static surfacing (text / style / placeholder / cursor). One UX-writer pass and merge.
  • Not lockstepped with 5.1b (Compose privacy) — security review delays should not block this bundle.
  • 4.13 placeholder hot-reload is not in this bundle, it's in the docs: post-STM-extraction cleanup + ground-truth count fixes #5.NS bundle (Namespace cluster) — same NS journey, avoid splitting the function area.

References

All paths are under `packages/memtomem/src/memtomem/`.

  • Index tab markup: `web/static/index.html:
    `
  • Index tab dispatch: `web/static/app.js: setIndexMode()`
  • Add (compose) endpoint: `web/routes/system.py: add_memory()` (~888)
  • Upload endpoint: `web/routes/system.py: upload_files()` (~834)
  • Index config hint render: `web/static/settings-config.js` (Extensions hint composition logic)
  • Header chips: `web/static/index.html` header area + `app.js: loadStats()`
  • ADR-0004 (Sources vs Index): `docs/adr/0004-*.md`

Test plan

  • `uv run ruff check + format --check`
  • `uv run pytest -m "not ollama"`
  • mm web manual smoke — visual check on placeholder / toast / hint for each of the 3 modes, Korean lang-toggle consistency, both dark and light themes
  • Embed jump: clicking the chip activates the Settings → Config section correctly

Out of scope (not handled in this issue)

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions