Web UI (P3) and semantic recall (P4) - #1
Merged
Merged
Conversation
Note, topic and topic-list reads; topic rename and merge, annotation edit and delete, and conflict resolution that sets the losing copies aside outside the vault. View types derive ts-rs so the web UI's API types are generated. Co-Authored-By: Claude Opus 5.5 <[email protected]>
A loopback-only HTTP server at http://distill.localhost:<ui.port>: session cookie from a one-time link, Host and Origin checks, a JSON API over the core browse and edit operations, server-sent change events from a vault watcher, and the embedded web app. distill mcp starts it in the background before it hands out note links; `ui.autostart = false` turns that off. Co-Authored-By: Claude Opus 5.5 <[email protected]>
React single-page app in apps/web, embedded into distill and served by distill ui: home, notes search, note page with annotations and session reopen links, topic timelines with rename and merge, tags, stats and sync conflict resolution. API types are generated from Rust by ts-rs; mise run check now covers lint, types, tests and a build of the web app. Co-Authored-By: Claude Opus 5.5 <[email protected]>
A local multilingual embedding model (paraphrase-multilingual-MiniLM-L12-v2, quantized, on ONNX Runtime via fastembed) is fetched once with `distill model pull`. Recall then fuses keyword and embedding rankings, so reworded and translated questions come back; without the model it stays keyword-only. Topic pairs that are probably one question are offered for merging in the web UI, and can be dismissed. Vectors are cached in the index and survive reindex. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Records the answers to Q5, Q11, Q13 and Q15, the embedding model choice, why vectors are not in sqlite-vec, the measured thresholds, how the UI server differs from D7 as written, and what is still unverified. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Note and topic vectors now live in vec0 tables with cosine distance, and recall, similar topics and duplicate suggestions are KNN queries instead of in-memory scans, as spec D3 planned. Registering the statically linked extension needs one unsafe call, so the workspace lint goes from forbid to deny with a single audited exception in index/vec.rs. Migration 0002 is rewritten in place; it has not shipped. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The sidebar now has two tabs with every tag listed below them. Distill is a timeline of notes grouped by day: the question and the first two lines of the conclusion, expanding in place to the whole note, filtered by the chosen tag. Review is a dashboard: week-over-week notes, repeat rate, annotation coverage, active days, a 26-week activity calendar, notes per week, most-asked and unannotated topics, duplicate suggestions, and notes by tag, project and agent. The core gains a cursor-paged timeline and per-day and per-agent counts. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
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 join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Implements P3 and P4 of the foundation spec. Decisions made along the way are recorded as dated notes in the spec.
P3: web UI
distill uiserves a local web app athttp://distill.localhost:<ui.port>. It listens on loopback only, checksHostandOrigin, and requires a session cookie that a one-time link sets.distill ui stopstops it.distill mcpstarts it in the background before handing out note links;ui.autostart = falseturns that off. Details: docs/web-ui.md.apps/web, React 19 + TanStack Router/Query + Tailwind v4), embedded into the binary:<data dir>/discarded/, not deleted), a paged timeline, and extra stats.apps/web/src/api/generated. CI fails if the committed files drift.P4: semantic recall
distill model pulldownloads a local multilingual embedding model: paraphrase-multilingual-MiniLM-L12-v2, quantized, about 257 MB, run through fastembed on ONNX Runtime.vec0tables with cosine distance. Registering the extension needs oneunsafecall, so the workspace lint changes fromforbidtodeny, with a single exception incrates/distill-core/src/index/vec.rs.Things to know
mise run installbuilds the web UI, then installs the binary with it embedded.#[ignore]d and CI does not run them. Run them locally after pulling the model:DISTILL_TEST_MODEL_HOME=<home with model> cargo test -p distill-core --test semantic -- --include-ignoredTesting
mise run checkpasses: Rust fmt, clippy, tests, plus Biome, tsc, Vitest and a build of the web app.*.localhostresolution on Linux and Windows;🤖 Generated with Claude Code