Phase 1: Command palette (⌘K), editor autosave with quiet auto-saves, dashboard saved views from API + quick links + onboarding seed CTA, explicit task scan panel. Phase 2: Context pack formatter with YAML frontmatter, copy on note + workspace .md export. Phase 3: ADR for hybrid search without embeddings; POST /notes/search (lexical + ranked hybrid); search UI mode toggle. Phase 4: POST copilot + suggest-title; in-editor copilot actions; /chat retrieval answers with citations (backend chat.rag_enabled). Phase 5: Settings MCP snippet, offline queue note, API token deferral; DEEP_LINKS.md. Phase 6: Note shares + public GET; share page; POST onboarding-seed. Phase 7: note_versions on PATCH; version panel; create-note templates; PWA manifest. Flags: search.hybrid_enabled, copilot.enabled, chat.rag_enabled, onboarding.seed_enabled. Made-with: Cursor
13 KiB
NoteLett — Web “AI-fast” Product Roadmap
Date: March 31, 2026
Product: NoteLett (notelett) — structured notes for humans + AI agents
Repo: learning_ai_notes
Scope: Web app (web/) first; calls out backend/platform dependencies explicitly.
Companion docs: PRD.md, AGENT_TASK_ROADMAP.md (agent execution / CI / platform blockers), roadmaps/03_WEB_ROADMAP.md (historical web phases), roadmaps/05_MCP_AGENT_ROADMAP.md (MCP tooling).
1. Goals
| Goal | Signal |
|---|---|
| Fast | Fewer clicks to capture, find, and ship context to an LLM or agent. |
| Trustworthy | Human-in-the-loop for AI suggestions; visible provenance for agent edits. |
| Spreadable | Obvious paths to share context and onboard teammates + external tools (MCP, exports). |
Non-goals for this doc: Mobile-specific work (see MOBILE_DELEGATION_ROADMAP.md); re-litigating stack choices.
2. Phase overview
| Phase | Theme | Outcome |
|---|---|---|
| 1 | Velocity & clarity | Command palette, editor autosave, real dashboard views, explicit task extraction UX |
| 2 | Context out | Markdown “context pack” export/copy; optional workspace-scoped bundles |
| 3 | Smarter retrieval | Semantic or hybrid search + basic match explainability (backend + web) |
| 4 | Copilot surfaces | In-editor AI actions; optional workspace chat (RAG) behind feature flag |
| 5 | Agent connection | In-app MCP / API connection guidance; deep links and safe key UX |
| 6 | Distribution | Read-only share links; onboarding sample workspace |
| 7 | Depth | Note history / diff for agent edits; templates library; PWA/sync affordances |
Phases 1–2 are mostly web-only or small backend additions. 3–4 usually need platform or backend (embeddings, LLM, or existing shared services). 5–7 mix product, security, and infra.
Phase 1 — Velocity & clarity (web-first)
Objective: Match power-user expectations (keyboard, save state) and remove “fake” dashboard data; make extraction legible.
-
1.1 Command palette (⌘K / Ctrl+K)
- AC: Opens from anywhere in
(app); fuzzy match on note titles + workspace names + static actions (New note, Search, Reviews, Settings, Dashboard). - Files:
web/src/components/CommandPalette.tsx(new), wire inweb/src/app/(app)/layout.tsxorKeyboardShortcuts.tsx, reuselistNoteSummaries/listWorkspaceSummariesor lightweight search endpoint. - Tests: Unit for reducer/filter; optional Playwright happy path.
- AC: Opens from anywhere in
-
1.2 Note editor autosave + save status
- AC: Debounced persist after idle (e.g. 1–2s) with “Saving / Saved / Error” indicator; manual save still available; avoid duplicate concurrent PATCH.
- Files:
web/src/components/NoteEditor.tsx,web/src/app/(app)/notes/[noteId]/page.tsx. - Tests: Vitest for debounce/abort behavior (mock API).
-
1.3 Dashboard: backend-backed saved views
- AC: “Saved views” / quick links on dashboard use
saved-viewsAPI (or derived queries) instead of hardcoded cards only; empty states when none. - Files:
web/src/app/(app)/dashboard/page.tsx,web/src/lib/saved-views-client.ts. - Depends on: Saved view scopes already supported by API (
search, etc.); extend if workspace scope needed.
- AC: “Saved views” / quick links on dashboard use
-
1.4 Explicit “Scan for tasks” on note detail
- AC: Button runs extraction (
extractSuggestedTasks); shows proposed rows with Accept (createsnote-taskvia API) / Dismiss; does not silently inflate task list on every load unless user opts in or a setting enables auto-merge. - Files:
web/src/lib/notes-client.ts(splitgetNoteDetailvs optional extraction),web/src/components/TaskReviewPanel.tsxor newExtractedTasksPanel.tsx,web/src/app/(app)/notes/[noteId]/page.tsx. - Note: Aligns UX with
/reviewshuman-in-the-loop story.
- AC: Button runs extraction (
Verification (Phase 1):
cd web && pnpm run typecheck && pnpm test && pnpm run build
Phase 2 — Context out (export for LLMs & agents)
Objective: One-click packaging of notes for Cursor, Claude, ChatGPT, or custom agents.
-
2.1 “Copy context pack” from note
- AC: Produces markdown with title, tags, body (plain or markdown strip), links to related note titles/IDs, optional tasks list; copies to clipboard; toast on success.
- Files:
web/src/lib/context-pack.ts(pure formatter), button onnotes/[noteId]/page.tsx.
-
2.2 “Export workspace context pack”
- AC: From workspace page or modal: select max notes / depth; download
.mdor.zip(if artifacts included later); respect pagination (chunked fetch). - Files:
web/src/app/(app)/workspaces/page.tsx, client helper calling existingexportNotesor new backend if limits hit.
- AC: From workspace page or modal: select max notes / depth; download
-
2.3 Optional: frontmatter convention
- AC: Stable YAML frontmatter (
notelett_version,workspace_id,exported_at) so downstream tools can parse reliably. - Files: shared builder in
context-pack.ts.
- AC: Stable YAML frontmatter (
Verification: Manual smoke + unit tests for formatter (no network).
Phase 3 — Smarter retrieval (backend + platform)
Objective: Move beyond lexical search where product promises “retrieval.”
-
3.1 Discovery
- Document choice: embeddings in NoteLett backend vs shared search/RAG platform; latency and cost model.
- Output: short ADR in
docs/roadmaps/or appendix in this file.
-
3.2 Indexing pipeline
- AC: On note create/update (or batch job): chunk + embed + store; workspace-scoped ACL matches REST.
- Files:
backend/new module or integration with existing platform indexer. - Shipped (MVP): Query-time candidate fetch + in-memory ranking on decrypted text (no separate embed store). Vector pipeline deferred per ADR.
-
3.3
POST /notes/search(semantic/hybrid)- AC: Accepts
q, optionalworkspaceId, returns ranked hits withscore+ snippet +noteId; falls back to lexical when flag off. - Files:
backend/src/modules/notes/routes.ts, repository, feature flag.
- AC: Accepts
-
3.4 Web search UI
- AC: Toggle or auto hybrid mode; show why matched (e.g. “semantic” vs “title”); preserves saved searches.
- Files:
web/src/app/(app)/search/page.tsx,web/src/lib/notes-client.ts.
Verification:
cd backend && pnpm run typecheck && pnpm test
cd web && pnpm run typecheck && pnpm test && pnpm run build
Phase 4 — Copilot surfaces (editor + optional chat)
Objective: AI actions where users already work; keep approvals explicit.
-
4.1 In-editor toolbar actions
- AC: Selection-based: shorten, expand, bulletize, fix grammar (call platform LLM or extraction-service pattern); insert as replacement or new block; undo.
- Files:
web/src/components/NoteEditor.tsx, newweb/src/lib/copilot-client.ts(platform route). - Depends on: Authenticated API on platform with rate limits.
-
4.2 “Generate title” from body
- AC: One click; user confirms before apply.
- Files: note detail page + small client.
-
4.3 Workspace chat (RAG) — feature-flagged
- AC: Side panel or
/chat: asks question, returns answer + citation links to notes; no write without explicit user action. - Files: new route
web/src/app/(app)/chat/page.tsx(or drawer), backend or platform RAG endpoint. - Depends on: Phase 3 indexing + prompt/tooling policy.
- AC: Side panel or
Verification: E2E for one happy-path copilot action; contract tests for API.
Phase 5 — Agent connection (MCP & keys in-product)
Objective: Close the gap between “MCP exists in common platform” and “users know how to connect.”
-
5.1 Settings → “Connect your agent”
- AC: Steps + copyable MCP config snippet; link to docs; product ID and base URLs from env.
- Files:
web/src/app/(app)/settings/page.tsx,web/src/lib/product-config.ts.
-
5.2 Scoped API tokens (if platform supports)
- AC: Create/revoke token for MCP or automation; never show full token twice.
- Depends on: platform-service APIs.
- Shipped: Settings documents current limitation; wire-up when platform exposes token APIs.
-
5.3 Deep links
- AC:
notelett://note/:idorhttps://app.../notes/:iddocumented for agent tools. - Files: docs + optional handler page.
- AC:
Phase 6 — Distribution & onboarding
Objective: Viral and activation loops.
-
6.1 Read-only share links
- AC: User generates link for a note (optional expiry/password); unauthenticated read view with clear branding; audit logged.
- Files:
backendshare-token module +web/src/app/share/[token]/page.tsx(public layout).
-
6.2 Onboarding workspace
- AC: New user seed workspace with 2–3 sample notes + one pending review item; tooltip tour optional.
- Files: backend bootstrap or platform hook +
webfirst-login detection.
Phase 7 — Depth & polish
Objective: Auditability, templates, offline clarity.
-
7.1 Note version history / diff
- AC: List revisions; diff view for agent-proposed changes (tie to
note-agent-actions). - Depends on: backend storing versions or reconstructing from actions.
- Shipped:
note_versionssnapshots before each title/body PATCH; expandable plaintext in web. Side-by-side diff + agent-action join is follow-up.
- AC: List revisions; diff view for agent-proposed changes (tie to
-
7.2 Note templates
- AC: Create note from template (meeting, decision, spec); stored as markdown/HTML snippets.
- Files:
webmodal + backendtemplatesor static config v1.
-
7.3 PWA + offline status
- AC: Install prompt optional; visible sync queue state using existing offline-queue patterns.
- Files:
web/next.config.ts, manifest, settings indicator. - Shipped:
public/manifest.json,metadata.manifest, settings offline-queue blurb + verify button. Icons/service worker optional follow-up.
Execution order (recommended)
- Land Phase 1 entirely (low dependency, high daily value).
- Run Phase 2 in parallel with 3.1 discovery if two streams exist.
- Implement Phase 3 before 4.3 (RAG needs an index).
- Phase 5 can start after 2.1 (docs/snippets) even if tokens wait on platform.
- Phase 6 after auth/public-route security review.
- Phase 7 as ongoing polish.
Task summary
| Phase | Tasks | Primary owner |
|---|---|---|
| 1 — Velocity & clarity | 4 | Web |
| 2 — Context out | 3 | Web (+ small backend if export limits) |
| 3 — Retrieval | 4 | Backend + platform + Web |
| 4 — Copilot | 3 | Web + platform |
| 5 — Agent connection | 3 | Web + platform |
| 6 — Distribution | 2 | Backend + Web |
| 7 — Depth | 3 | Full stack |
| Total | 22 | — |
When a task ships, check the box here and optionally add a commit hash in AGENT_TASK_ROADMAP.md style.
Implementation summary (March 31, 2026)
| Area | What shipped |
|---|---|
| Web | CommandPalette, editor autosave + quiet saves, dashboard API saved views + onboarding seed CTA, ExtractedTasksPanel, context pack copy + workspace .md export, hybrid/lexical search UI, /chat, note templates, copilot toolbar + suggest title, share link + public /share/[token], NoteVersionsPanel, sidebar chat link, settings MCP/offline/token guidance, PWA manifest. |
| Backend | POST /notes/search, POST /notes/chat, POST /notes/:id/copilot, POST /notes/:id/suggest-title, POST /notes/:id/share, GET /notes/:id/versions, version append on PATCH, POST /workspaces/onboarding-seed, GET /api/public/note-shares/:token, note_shares / note_versions collections, feature flags, ranking + copilot helpers. |
| Docs | DEEP_LINKS.md, ADR-2026-03-31-hybrid-search-without-embeddings.md. |
Open questions for reviewers
- Scale: At what workspace size should hybrid search move from in-memory ranking to a dedicated index or vector store?
- Shares: Do we need expiry, password, revoke list, and audit export for compliance?
- Platform tokens: Exact API paths and UI for MCP/CI token lifecycle?
- PWA: Add maskable icons and an offline service worker (
next-pwaor equivalent)? - Copilot output: Prefer structured ProseMirror JSON from the extraction service instead of escaped HTML paragraphs?
- Telemetry: Should new events (
note.share_created,note.chat_query,workspace.onboarding_seeded, etc.) be registered in a central schema?
Verification commands (standing)
cd web && pnpm run typecheck && pnpm test && pnpm run build
cd backend && pnpm run typecheck && pnpm test
cd web && pnpm exec playwright test # when E2E touched
Changelog
| Date | Change |
|---|---|
| 2026-03-31 | Initial roadmap (table fix, meta sections, checkbox maintenance note); companion link to PRD.md. |
| 2026-03-31 | Full implementation pass: all phases marked complete; summary + reviewer questions. |