Chore roadmap v010x shift (#76)
All checks were successful
CI/CD / detect-changes (push) Successful in 4s
CI/CD / test-sqlite (push) Has been skipped
CI/CD / test-frontend (push) Has been skipped
CI/CD / test-go-pg (push) Has been skipped
CI/CD / test-runners (push) Has been skipped
CI/CD / e2e-smoke (push) Has been skipped
CI/CD / build-and-deploy (push) Successful in 30s
All checks were successful
CI/CD / detect-changes (push) Successful in 4s
CI/CD / test-sqlite (push) Has been skipped
CI/CD / test-frontend (push) Has been skipped
CI/CD / test-go-pg (push) Has been skipped
CI/CD / test-runners (push) Has been skipped
CI/CD / e2e-smoke (push) Has been skipped
CI/CD / build-and-deploy (push) Successful in 30s
Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #76.
This commit is contained in:
744
docs/DESIGN-notes-v011x.md
Normal file
744
docs/DESIGN-notes-v011x.md
Normal file
@@ -0,0 +1,744 @@
|
||||
# DESIGN: Notes Reference Extension — v0.11.x
|
||||
|
||||
## Status: Proposed
|
||||
|
||||
## Purpose
|
||||
|
||||
Notes becomes the first **reference extension** — a first-party package
|
||||
that exercises every kernel primitive and proves the platform is capable
|
||||
of delivering a production-quality application. This is not a toy demo;
|
||||
it is the answer to "what can you build on Armature?"
|
||||
|
||||
The v0.11.x series takes the existing notes package (folders, tags,
|
||||
wikilinks, graph, CM6 editor, three view modes) and builds it into a
|
||||
full-featured knowledge base comparable to Obsidian, Notion, or Logseq —
|
||||
but running on Armature's extension architecture.
|
||||
|
||||
**The UI must be clean, inviting, and genuinely enjoyable to use.** The
|
||||
current notes surface is functional but visually mechanical — no
|
||||
personality, no micro-interactions, no sense of craft. If the reference
|
||||
extension feels like a developer prototype, the platform pitch fails
|
||||
regardless of how many kernel primitives it exercises. v0.11.0 is a
|
||||
full visual redesign before any feature work begins, and every subsequent
|
||||
version ships with UX quality built in, not bolted on.
|
||||
|
||||
### What Notes Exercises
|
||||
|
||||
| Kernel Primitive | How Notes Uses It |
|
||||
|-----------------|-------------------|
|
||||
| `db.write` | Notes, folders, tags, links, shares tables |
|
||||
| `sw.renderers` | Markdown rendering pipeline, custom block renderers |
|
||||
| `sw.panels` | `notes.reference` panel (from v0.10.4) |
|
||||
| `sw.slots` | Declares `notes:toolbar-actions`, `notes:note-footer` for extension composition |
|
||||
| `sw.events` | Realtime updates, panel ↔ surface communication |
|
||||
| `sw.markdown` | Unified markdown rendering with wikilink extensions |
|
||||
| `sw.shell.topbar` | Topbar slots for navigation context |
|
||||
| `sw.storage` | Editor state, sidebar collapse, preferences |
|
||||
| `sw.actions` | Exports `notes.create`, `notes.search` for cross-package calls |
|
||||
| Resource grants | Note and folder sharing via kernel permission model |
|
||||
| Starlark sandbox | All backend logic in `script.star` |
|
||||
| Settings cascade | Per-user editor mode, default view, daily note folder |
|
||||
| Surfaces | Multi-surface: full editor + public read-only surface |
|
||||
|
||||
---
|
||||
|
||||
## What Already Exists (v0.9.0)
|
||||
|
||||
### Frontend (1,806 lines — `js/main.js`)
|
||||
|
||||
- **NotesApp** — main shell with sidebar + editor layout
|
||||
- **FolderTree / FolderNode** — tree with expand/collapse, context menu,
|
||||
drag-and-drop note→folder, rename, create sub-folder (schema has
|
||||
`parent_id`, UI renders depth)
|
||||
- **NoteCard** — list items with title, snippet, date, tags, drag handle
|
||||
- **TagInput / TagFilter** — tag CRUD with autocomplete
|
||||
- **EditorPane** — three view modes (rendered / edit / split), CodeMirror
|
||||
6 integration with textarea fallback, auto-save, frontmatter parsing
|
||||
- **BacklinksPanel** — lists notes that link to the current note
|
||||
- **SidebarTabs** — Notes / Outline tabs
|
||||
- **SidebarOutline** — heading tree parsed from markdown body
|
||||
- **GraphPane** — canvas-based force-directed graph with folder coloring,
|
||||
orphan hiding, focus mode, pan/zoom
|
||||
- **Export** — download note as `.md` with frontmatter
|
||||
|
||||
### Backend (23K — `script.star`)
|
||||
|
||||
- Full CRUD: notes, folders, tags
|
||||
- Wikilink extraction (`_extract_wikilinks`) and link resolution
|
||||
(`_sync_links`) on every note save
|
||||
- Links / backlinks queries
|
||||
- Graph data endpoint (nodes + edges)
|
||||
- Search (title + body substring)
|
||||
- Stats endpoint
|
||||
- Folder CRUD with `parent_id`
|
||||
|
||||
### Schema (4 tables)
|
||||
|
||||
- `notes` — title, body, folder_id, creator_id, updated_at, pinned, archived
|
||||
- `tags` — note_id, tag
|
||||
- `links` — source_id, target_id, link_text
|
||||
- `folders` — name, parent_id, creator_id, sort_order
|
||||
|
||||
### Current CSS (795 lines — `css/main.css`)
|
||||
|
||||
Functional but visually flat. No animations, no keyframes, no
|
||||
micro-interactions. Identical `transition: var(--transition)` on every
|
||||
hover. No typographic hierarchy beyond font-size/weight. No visual
|
||||
rhythm. Sidebar and editor feel like admin panels, not a writing tool.
|
||||
|
||||
---
|
||||
|
||||
## Version Plan
|
||||
|
||||
### v0.11.0 — UI/UX Foundation
|
||||
|
||||
**Goal:** Complete visual redesign of the notes surface. Every pixel
|
||||
intentional. Every interaction feels crafted. This is the foundation
|
||||
that all subsequent feature versions build on.
|
||||
|
||||
This is NOT a "make it pretty" pass on the existing CSS. It is a
|
||||
ground-up rethink of the notes UI with the understanding that this is
|
||||
the first thing people see when evaluating what Armature can do.
|
||||
|
||||
**Design principles for notes:**
|
||||
|
||||
- **Writing-first.** The editor area dominates. Generous whitespace.
|
||||
Nothing competes for attention with the content the user is writing.
|
||||
- **Quiet chrome, loud content.** Sidebar, toolbar, and navigation fade
|
||||
into the background. The note body is the visual anchor — clean
|
||||
typography, comfortable line height, readable measure (60–80 chars).
|
||||
- **Progressive disclosure.** Folder tree, tags, backlinks, graph — all
|
||||
there but not all visible simultaneously. Contextual — show what's
|
||||
relevant to what the user is doing right now.
|
||||
- **Micro-interactions that feel alive.** Folder expand/collapse with
|
||||
rotation animation. Note cards with subtle lift on hover. Smooth
|
||||
sidebar resize. Mode transitions that animate, not snap. Save
|
||||
indicator that pulses, not just appears.
|
||||
- **Personality without kitsch.** The UI should feel like a well-designed
|
||||
indie app, not a Material Design template and not a Bootstrap theme.
|
||||
|
||||
**Specific deliverables:**
|
||||
|
||||
**Typography overhaul:**
|
||||
- Rendered note body: system serif stack for body text (Georgia, serif
|
||||
fallback) at 16px/1.7 line height. Headings in the system sans stack.
|
||||
Comfortable reading measure — `max-width: 720px` centered in the
|
||||
editor area with generous padding. Code blocks with distinct
|
||||
background and a monospace stack.
|
||||
- Editor (CM6): matching font size and line height so switching between
|
||||
rendered/edit mode doesn't jar. CM6 theme tokens aligned with note
|
||||
design tokens.
|
||||
- Sidebar text: smaller (13px), tighter, utility font. Clear hierarchy
|
||||
between folder names, note titles, snippet text, dates.
|
||||
|
||||
**Sidebar redesign:**
|
||||
- **Resizable** — drag handle between sidebar and editor. Width persisted.
|
||||
Smooth resize with no layout jank.
|
||||
- **Collapsible** — collapse to a thin icon strip (folder + search +
|
||||
graph icons) on narrow viewports or by user choice. Expand on hover
|
||||
or click. Collapse state persisted.
|
||||
- **Folder tree polish:** Indent guides (subtle vertical lines connecting
|
||||
parent→child). Folder icons that change on expand (open folder / closed
|
||||
folder, not just a triangle). Drop target highlighting with animation
|
||||
(not just background color change). Smooth height animation on
|
||||
expand/collapse.
|
||||
- **Note cards:** Subtle left border color-coded by folder (pulls from a
|
||||
soft palette, not harsh primaries). Title, snippet, relative date
|
||||
("3h ago" not "2026-04-03T12:34"). Tag pills with rounded, muted
|
||||
styling. Pin indicator as a subtle icon, not a text label.
|
||||
- **Search:** Inline search with clear button. Results highlight matching
|
||||
text. Smooth appear/disappear.
|
||||
|
||||
**Editor redesign:**
|
||||
- **Header:** Title input styled as a large heading (not an input field
|
||||
with a border). Folder breadcrumb below title in muted text. Toolbar
|
||||
actions as icon buttons with tooltips — no text labels cluttering the
|
||||
header. Save status indicator (saved ✓ / saving… / unsaved •) as a
|
||||
small, elegant badge.
|
||||
- **Mode switcher:** Segmented control (Read / Edit / Split) replacing
|
||||
the cycling button. Clear visual state.
|
||||
- **Rendered view:** Clean markdown rendering with proper spacing between
|
||||
elements. Block quotes with a left accent border. Tables with subtle
|
||||
borders and alternating row tinting. Inline code with pill-style
|
||||
background. Links with underline on hover only.
|
||||
- **Empty editor state:** "Select a note or create a new one" with a
|
||||
softly illustrated empty state — not a plain text message.
|
||||
|
||||
**Graph visual refresh:**
|
||||
- Dark-on-light node rendering with soft shadows (not flat circles with
|
||||
outlines). Node labels that appear on hover with smooth fade-in.
|
||||
Edge rendering with slight curves (not straight lines). Background
|
||||
subtle dot grid.
|
||||
|
||||
**Transitions and animations:**
|
||||
- Sidebar expand/collapse: 200ms ease-out slide.
|
||||
- Folder tree expand/collapse: 150ms height animation with children
|
||||
fading in.
|
||||
- Note card hover: subtle translateY(-1px) + box-shadow lift.
|
||||
- View mode switch: crossfade (100ms fade out → swap → 100ms fade in).
|
||||
- Save indicator: pulse animation on "saving", check mark with brief
|
||||
scale-up on "saved".
|
||||
- Graph node hover: scale(1.2) with spring easing.
|
||||
- Panel/dialog open: 150ms slide-up + fade-in (consistent with kernel
|
||||
Dialog animation).
|
||||
|
||||
**Color and theming:**
|
||||
- Notes should work beautifully in both light and dark themes.
|
||||
Use CSS custom properties (already the pattern via `var(--bg-surface)`,
|
||||
etc.) but add notes-specific tokens for accent colors, folder palette,
|
||||
and typography:
|
||||
```css
|
||||
--notes-body-font: Georgia, 'Times New Roman', serif;
|
||||
--notes-body-size: 16px;
|
||||
--notes-body-line-height: 1.7;
|
||||
--notes-body-measure: 720px;
|
||||
--notes-accent: var(--accent);
|
||||
--notes-folder-1: #6366f1; /* indigo */
|
||||
--notes-folder-2: #8b5cf6; /* violet */
|
||||
--notes-folder-3: #ec4899; /* pink */
|
||||
--notes-folder-4: #f59e0b; /* amber */
|
||||
--notes-folder-5: #10b981; /* emerald */
|
||||
--notes-folder-6: #06b6d4; /* cyan */
|
||||
```
|
||||
|
||||
**Responsive:**
|
||||
- Below 768px: sidebar collapses to overlay (slide-in from left).
|
||||
Editor goes full-width. Split view disabled. Touch-friendly tap
|
||||
targets (44px minimum on all interactive elements).
|
||||
- Between 768px and 1024px: sidebar narrower (220px). Editor gets
|
||||
remaining space.
|
||||
- Above 1024px: full layout with comfortable sidebar width.
|
||||
|
||||
**What this version does NOT change:**
|
||||
- No new features. Same note CRUD, same folders, same tags, same
|
||||
wikilinks, same graph, same three view modes.
|
||||
- No backend changes. No schema changes.
|
||||
- The existing JS components are restructured for the new layout but
|
||||
retain their current behavior.
|
||||
|
||||
**Deliverable:** Complete CSS rewrite (`css/main.css`), targeted JS
|
||||
changes for new layout structure (resizable sidebar, collapsible sidebar,
|
||||
mode switcher component, animation hooks), and updated component
|
||||
templates where the HTML structure needs to change for the new design.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.1 — Deep Folders + Navigation
|
||||
|
||||
**Goal:** Folders become a real hierarchy with breadcrumbs, not just a
|
||||
flat tree with parent_id.
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Breadcrumb navigation** in editor header showing the folder path.
|
||||
Click any segment to navigate to that folder's note list. Styled
|
||||
consistently with the v0.11.0 muted-text breadcrumb design.
|
||||
- **Drag folder→folder** to reparent. Animated drop indicator shows
|
||||
nesting target with indent guide preview. Depth limit: 5 levels.
|
||||
- **Folder sort** — drag to reorder within a level. Smooth reorder
|
||||
animation. Persists via `sort_order` column (already in schema).
|
||||
- **Collapse/expand persistence** — expanded folder set stored in
|
||||
`sw.storage` keyed by user.
|
||||
- **Move dialog** — select destination folder from a tree picker when
|
||||
moving notes (alternative to drag for accessibility / many folders).
|
||||
Uses `sw.ui.Dialog` with the new folder tree component inside.
|
||||
|
||||
**UX standard:** All folder interactions use the animation language
|
||||
established in v0.11.0. Drop targets highlight with the folder color
|
||||
from the palette. Reparent shows a brief connection-line animation.
|
||||
|
||||
**Backend changes:**
|
||||
|
||||
- Validate `parent_id` chain on create/update (no cycles, depth ≤ 5).
|
||||
- Folder delete: require empty or offer cascade (move children to parent,
|
||||
or move contained notes to Unfiled).
|
||||
- `_list_folders()` returns full tree with `children_count` and
|
||||
`note_count` for each folder.
|
||||
|
||||
**Schema:** No changes.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.2 — Wikilinks + Backlinks
|
||||
|
||||
**Goal:** `[[wikilinks]]` become a first-class editing and navigation
|
||||
primitive with autocomplete, previews, and unresolved link handling.
|
||||
|
||||
**Features:**
|
||||
|
||||
- **CM6 autocomplete** — typing `[[` triggers a fuzzy note title picker
|
||||
with a clean dropdown styled consistently with the notes design
|
||||
language (not browser-default autocomplete). Shows note title, folder
|
||||
path, and snippet preview. Keyboard navigable.
|
||||
- **Wikilink rendering** — rendered markdown converts `[[Title]]` to
|
||||
internal links with a subtle notes-specific style (dotted underline,
|
||||
small link icon). Distinct from external URLs.
|
||||
- **Hover preview** — hovering a wikilink shows a floating card with
|
||||
the target note's title, first ~200 chars rendered as markdown, and
|
||||
folder/tag metadata. Smooth fade-in, positioned to avoid viewport
|
||||
overflow. Same visual language as graph node hover cards.
|
||||
- **Unresolved links** — `[[Nonexistent Note]]` renders with a dashed
|
||||
styling and a muted color. Click to create the note with that title
|
||||
(pre-filled). Small "+" indicator on hover.
|
||||
- **Backlinks panel improvements:**
|
||||
- Show context snippet (surrounding text with the `[[link]]`
|
||||
highlighted).
|
||||
- Group by folder with folder color indicators.
|
||||
- Count badge in sidebar tab (animated increment on new backlinks).
|
||||
- Navigate to the linking note and scroll to the link location.
|
||||
- **Aliases** — new `aliases` column on `notes` table. Autocomplete
|
||||
searches both title and aliases.
|
||||
|
||||
**UX standard:** Autocomplete dropdown uses the notes card styling.
|
||||
Hover preview card shares visual language with graph tooltips. Unresolved
|
||||
link creation is a smooth inline experience, not a navigate-away-and-back.
|
||||
|
||||
**Backend changes:**
|
||||
|
||||
- `_sync_links()` resolves aliases as well as titles.
|
||||
- New endpoint: `GET /autocomplete?q=...` — fast title+alias prefix
|
||||
search (limit 10).
|
||||
- Backlinks response includes `context_snippet` field.
|
||||
|
||||
**Schema changes:**
|
||||
|
||||
- `notes` table: add `aliases` column (text, comma-separated).
|
||||
|
||||
---
|
||||
|
||||
### v0.11.3 — Live Preview + Rich Editing
|
||||
|
||||
**Goal:** The editor becomes genuinely pleasant to write in — live
|
||||
preview that scrolls in sync, or an optional inline-formatted mode.
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Split pane scroll sync** — scrolling the CM6 editor scrolls the
|
||||
rendered preview to the corresponding position. Uses heading anchors
|
||||
for coarse sync and line-height interpolation for fine sync.
|
||||
- **Live preview debounce** — rendered pane updates as you type with
|
||||
150ms debounce. Smooth content transitions (no jarring reflow).
|
||||
- **Inline preview** (Obsidian-style) — optional mode where markdown
|
||||
syntax hides and formatting appears inline while editing. CM6
|
||||
decorations for bold, italic, headings, links, code blocks.
|
||||
Syntax reappears when cursor enters the formatted region. This is
|
||||
the "fourth mode" alongside rendered / edit / split — a true
|
||||
WYSIWYG-ish editing experience without leaving markdown.
|
||||
- **Image paste** — paste from clipboard, upload via `files` module,
|
||||
insert `` at cursor. Progress indicator during upload.
|
||||
Fallback: base64 inline if `files` module unavailable.
|
||||
- **Table editing** — tab-to-next-cell, auto-expand columns, add
|
||||
row/column with floating buttons on hover. Markdown tables become
|
||||
usable instead of a formatting chore.
|
||||
|
||||
**UX standard:** Split pane has an animated gutter with a subtle drag
|
||||
handle. Mode switcher expands to accommodate the fourth option (or
|
||||
becomes a dropdown if space is tight). Image paste shows a smooth
|
||||
inline loading skeleton.
|
||||
|
||||
**Backend changes:**
|
||||
|
||||
- Image upload endpoint: `POST /images` — receives multipart, stores
|
||||
via `files` module, returns URL.
|
||||
|
||||
**Schema:** No changes.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.4 — Note Sharing + Permissions
|
||||
|
||||
**Goal:** Notes become collaborative. Share a note or folder with
|
||||
a team, group, individual, or the public — with read-only or read-write
|
||||
permissions.
|
||||
|
||||
**Share Model:**
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Share Scope │ Granularity │ Permissions │
|
||||
├──────────────────────────┼─────────────┼─────────────┤
|
||||
│ Public (anonymous URL) │ note only │ read-only │
|
||||
│ Team │ note/folder │ ro / rw │
|
||||
│ Group │ note/folder │ ro / rw │
|
||||
│ Individual (user) │ note/folder │ ro / rw │
|
||||
└──────────────────────────┴─────────────┴─────────────┘
|
||||
```
|
||||
|
||||
**Folder sharing inherits:** sharing a folder grants access to all notes
|
||||
in that folder (and sub-folders). Individual note shares override folder
|
||||
permissions (higher wins).
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Share dialog** — clean modal (using `sw.ui.Dialog`) with scope
|
||||
selector, user/team/group picker (using `sw.ui.UserPicker` or new
|
||||
entity picker), permission toggle, and copy-link button. Share URL
|
||||
preview with visual indicator.
|
||||
- **Public notes surface** — new surface at `/s/notes/public/:share_id`.
|
||||
Renders a single note in read-only mode with clean, minimal chrome.
|
||||
Uses the v0.11.0 typography and rendered view styling. Armature
|
||||
branding footer. No authentication required.
|
||||
- **Shared-with-me view** — sidebar section (new tab) showing notes/folders
|
||||
shared by others. Grouped by owner with avatar. Visual distinction
|
||||
from your own notes.
|
||||
- **Share indicators** — shared notes show a subtle share icon on the
|
||||
note card. Folder tree shows share badge on shared folders. Hover
|
||||
reveals share scope.
|
||||
- **Permission enforcement** — Starlark backend checks share permissions
|
||||
on every read/write.
|
||||
- **Share revocation** — remove access from share dialog with
|
||||
confirmation.
|
||||
|
||||
**UX standard:** Share dialog is the most complex new UI in the series
|
||||
and must feel simple. One-click sharing for common cases (share with
|
||||
team, make public). Advanced options (specific users, groups) are
|
||||
available but not in the way. Copy-link button shows a brief "Copied!"
|
||||
toast. Public note surface is a showcase — the best the notes rendering
|
||||
can look.
|
||||
|
||||
**Backend changes:**
|
||||
|
||||
- New `note_shares` table.
|
||||
- New `folder_shares` table.
|
||||
- Access check function: `_can_access(user_id, note_id, permission)`.
|
||||
- `_list_notes()` includes shared notes with `shared_by` metadata.
|
||||
- Public note endpoint: unauthenticated GET by share_token.
|
||||
|
||||
**Schema changes:**
|
||||
|
||||
- New table: `note_shares` — note_id, share_type, target_id, permission,
|
||||
share_token, created_by, created_at.
|
||||
- New table: `folder_shares` — folder_id, share_type, target_id,
|
||||
permission, share_token, created_by, created_at.
|
||||
|
||||
**Manifest changes:**
|
||||
|
||||
- New surface: `/notes/public/:share_id` with `auth: "public"`.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.5 — Graph + Outline Hardening
|
||||
|
||||
**Goal:** The graph becomes a genuine navigation and discovery tool.
|
||||
The outline becomes a reliable TOC.
|
||||
|
||||
**Graph improvements:**
|
||||
|
||||
- **d3-force layout** — replace hand-rolled force sim with d3-force.
|
||||
Better convergence, collision avoidance, centering. ~15KB optional
|
||||
vendor (same pattern as CM6).
|
||||
- **Zoom controls** — explicit +/- buttons (styled as floating pills) plus
|
||||
scroll-to-zoom. Reset-to-fit button.
|
||||
- **Minimap** — small overview in corner with viewport rectangle.
|
||||
Draggable to navigate large graphs.
|
||||
- **Cluster by folder** — visual grouping with soft convex hulls in
|
||||
folder colors (from the v0.11.0 palette). Toggle on/off.
|
||||
- **Filter by tag** — highlight matching nodes, dim others. Smooth
|
||||
opacity transition.
|
||||
- **Search in graph** — highlight and smooth-pan to matching nodes.
|
||||
- **Hover card** — note title, snippet, folder, tag count. Same visual
|
||||
language as wikilink hover preview (v0.11.2).
|
||||
|
||||
**Outline improvements:**
|
||||
|
||||
- **Scroll sync** — active heading highlights as user scrolls. Uses
|
||||
`IntersectionObserver`. Smooth highlight transition.
|
||||
- **Click-to-scroll** — smooth scroll with brief heading highlight pulse.
|
||||
- **Indent levels** — h1→h6 with subtle indent guides matching the
|
||||
folder tree style.
|
||||
- **Collapse/expand** — heading sections collapsible in outline.
|
||||
Animated, consistent with folder tree animations.
|
||||
|
||||
**UX standard:** The graph should feel like a discovery tool, not a tech
|
||||
demo. Interactions should be fluid — pan, zoom, hover, click — with no
|
||||
jank. The outline should feel like a table of contents in a well-typeset
|
||||
book.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.6 — Quick Switcher + Commands
|
||||
|
||||
**Goal:** Keyboard-driven navigation. Power users never touch the mouse.
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Quick switcher** (`Cmd+O` / `Ctrl+O`) — centered overlay with fuzzy
|
||||
search. Clean design: large input field, results below with note
|
||||
title, folder path, and snippet. Recent notes above search results.
|
||||
Arrow keys + Enter. Smooth open/close animation. Matches the visual
|
||||
language of command palettes in VS Code / Raycast.
|
||||
- **Command palette** (`Cmd+Shift+P`) — same overlay style, listing all
|
||||
available note actions as searchable commands. Extensible via
|
||||
`sw.actions`.
|
||||
- **Keyboard shortcuts:** Registered via a central keymap.
|
||||
|
||||
| Shortcut | Action |
|
||||
|----------|--------|
|
||||
| `Cmd+O` | Quick switcher |
|
||||
| `Cmd+Shift+P` | Command palette |
|
||||
| `Cmd+N` | New note |
|
||||
| `Cmd+S` | Save (in edit mode) |
|
||||
| `Cmd+E` | Toggle edit/rendered |
|
||||
| `Cmd+Shift+E` | Toggle split view |
|
||||
| `Cmd+D` | Open today's daily note |
|
||||
| `Cmd+G` | Toggle graph view |
|
||||
| `Cmd+B` | Toggle backlinks panel |
|
||||
| `Escape` | Close active panel/dialog |
|
||||
|
||||
**UX standard:** The quick switcher is a high-frequency interaction —
|
||||
it must open instantly (no perceptible delay), search results must
|
||||
appear as-you-type, and the whole flow (Cmd+O → type → Enter) should
|
||||
take under 2 seconds for a user who knows what they want.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.7 — Daily Notes + Templates
|
||||
|
||||
**Goal:** Recurring note patterns that lower friction.
|
||||
|
||||
**Daily notes:**
|
||||
|
||||
- Auto-created daily note — navigating to "today" creates a note titled
|
||||
`YYYY-MM-DD` in a configurable daily notes folder.
|
||||
- Daily note template — configurable template body.
|
||||
- **Calendar picker** — small, beautiful calendar widget in the sidebar.
|
||||
Days with notes dot-marked. Styled as a subtle, compact component
|
||||
(not a full-page calendar). Click a date to open that day's note.
|
||||
- Previous/next day nav arrows in editor header for daily notes.
|
||||
|
||||
**Templates:**
|
||||
|
||||
- Notes in a "Templates" folder are templates. No special type.
|
||||
- "New Note" dropdown offers template selection with preview.
|
||||
- Template variables: `{{date}}`, `{{time}}`, `{{title}}`, `{{folder}}` —
|
||||
simple string replacement.
|
||||
- **Slash commands** in CM6 — typing `/` at line start shows a styled
|
||||
command menu: `/template`, `/date`, `/time`, `/todo`, `/callout`,
|
||||
`/table`, `/code`, `/divider`. Extensible via `sw.slots`.
|
||||
|
||||
**UX standard:** The calendar picker should feel like a subtle,
|
||||
integrated part of the sidebar — not a jarring widget. Template
|
||||
selection should show a live preview of the template content.
|
||||
Slash commands should appear fast and be keyboard navigable.
|
||||
|
||||
**Settings additions:**
|
||||
|
||||
- `daily_note_folder` — folder name for daily notes.
|
||||
- `daily_note_template` — template body.
|
||||
- `template_folder` — folder name for templates.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.8 — Transclusion + Embeds
|
||||
|
||||
**Goal:** Notes reference and embed each other's content.
|
||||
|
||||
**Features:**
|
||||
|
||||
- **Transclusion** (`![[Note Title]]`) — embeds referenced note content
|
||||
inline in a clean bordered container with source title as header link.
|
||||
- **Section transclusion** (`![[Note Title#Heading]]`) — embeds content
|
||||
under specified heading only.
|
||||
- **Block transclusion** (`![[Note Title^block-id]]`) — single paragraph
|
||||
by block ID.
|
||||
- **Recursion guard** — depth limited to 3. Circular references show
|
||||
a clean warning card, not an error.
|
||||
- **File attachments** — drag-and-drop files onto editor to upload.
|
||||
Non-image files render as styled download cards (file icon, name,
|
||||
size).
|
||||
- **Embed preview in editor** — CM6 decoration shows read-only preview
|
||||
below `![[...]]` line. Collapsible with smooth animation.
|
||||
|
||||
**UX standard:** Transclusions should feel like natural parts of the
|
||||
document, not foreign inclusions. The border and header link should be
|
||||
subtle. Embedded content uses the same typography as the host note.
|
||||
Collapse animation is smooth.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.9 — Composability: Slots + Actions
|
||||
|
||||
**Goal:** Notes becomes a host surface that other extensions enhance.
|
||||
|
||||
**Slot declarations:**
|
||||
|
||||
```json
|
||||
{
|
||||
"slots": {
|
||||
"notes:toolbar-actions": {
|
||||
"description": "Action buttons in the note editor toolbar",
|
||||
"context": {
|
||||
"noteId": "string",
|
||||
"getContent": "function — returns markdown body",
|
||||
"setContent": "function — replaces markdown body",
|
||||
"getTitle": "function — returns title"
|
||||
}
|
||||
},
|
||||
"notes:note-footer": {
|
||||
"description": "Content rendered below the note body",
|
||||
"context": { "noteId": "string", "content": "string — HTML" }
|
||||
},
|
||||
"notes:sidebar-tabs": {
|
||||
"description": "Additional tabs in the notes sidebar",
|
||||
"context": { "activeNoteId": "string or null" }
|
||||
},
|
||||
"notes:slash-commands": {
|
||||
"description": "Additional slash commands in the editor",
|
||||
"context": { "insertText": "function(text)" }
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Exported actions:**
|
||||
|
||||
```json
|
||||
{
|
||||
"exports": {
|
||||
"actions": {
|
||||
"notes.create": "Create note (params: title, body, folder_id)",
|
||||
"notes.search": "Search notes (params: query, limit)",
|
||||
"notes.get": "Get note by ID (params: note_id)"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**UX standard:** Slot contributions must fit visually. Toolbar action
|
||||
buttons contributed by other extensions inherit the notes icon-button
|
||||
styling. Sidebar tabs contributed by extensions match the built-in tab
|
||||
design. The notes surface should not look different when extensions
|
||||
contribute to its slots.
|
||||
|
||||
---
|
||||
|
||||
### v0.11.10 — Panel Enhancement + Quality Gate
|
||||
|
||||
**Goal:** The `notes.reference` panel (shipped in v0.10.4) inherits
|
||||
the v0.11.x features. Final quality gate.
|
||||
|
||||
**Panel updates:**
|
||||
|
||||
- Reference panel gets the v0.11.0 visual design language.
|
||||
- Search, folder filter, tag filter in panel.
|
||||
- Preview pane shows rendered note content (v0.11.0 typography).
|
||||
- Click-to-insert: emits `panel.notes.reference.selected` for host.
|
||||
- Wikilink resolution works within panel preview.
|
||||
|
||||
**Quality gate criteria:**
|
||||
|
||||
- All v0.11.x features exercised in SDK test runner.
|
||||
- Notes-runner surface tests cover: CRUD, sharing, wikilinks, daily
|
||||
notes, templates, transclusion.
|
||||
- Graph renders correctly with 200+ nodes at 60fps.
|
||||
- Public note surface renders without authentication.
|
||||
- At least one slot contribution demonstrated.
|
||||
- Panel reference works in at least one other surface.
|
||||
- **UX review:** every screen, every interaction, every empty state
|
||||
reviewed against v0.11.0 design principles. No "placeholder" UI
|
||||
surviving to this point.
|
||||
- **Responsive:** full experience on mobile (sidebar overlay, touch
|
||||
targets, no horizontal scroll).
|
||||
- **Accessibility:** keyboard navigation through all views. ARIA labels.
|
||||
Focus management on panel/dialog open/close.
|
||||
- **Performance:** virtual scrolling on note list for 1000+ notes.
|
||||
Graph 60fps with 500+ nodes. Lazy-load graph and CM6.
|
||||
|
||||
---
|
||||
|
||||
## Uniquely Armature
|
||||
|
||||
| Feature | Obsidian/Notion | Armature Notes |
|
||||
|---------|-----------------|----------------|
|
||||
| Extension slots | Plugin API (Obsidian) | Kernel-level composability — any package contributes to any slot without coupling |
|
||||
| Sharing | Obsidian Publish (paid), Notion sharing | Built on kernel resource model — same permission patterns as every other extension |
|
||||
| Panels | N/A | Notes is a panel provider — embed a notes view inside chat, dashboard, or any surface |
|
||||
| Multi-surface | Single window | Full surface + public surface + reference panel, all from one package |
|
||||
| Server-side logic | Local only (Obsidian) | Starlark backend — search, link resolution, access control run server-side |
|
||||
| Realtime | N/A (Obsidian), built-in (Notion) | Via `sw.realtime` — same primitive available to all extensions |
|
||||
| Cross-extension actions | Plugin API | `sw.actions` — any package can call `notes.create` or `notes.search` |
|
||||
| Self-hosted | Obsidian Sync (paid) | Runs on your infrastructure, your data, your rules |
|
||||
|
||||
The thesis: **Notes isn't just a note-taking app — it's proof that
|
||||
Armature's extension architecture can deliver a production-quality
|
||||
knowledge base that competes with purpose-built SaaS tools, while
|
||||
remaining decomposable and extensible.** And it has to *look and feel*
|
||||
like it competes, not just architecturally compete.
|
||||
|
||||
---
|
||||
|
||||
## Schema Summary
|
||||
|
||||
### Existing tables (no changes)
|
||||
|
||||
- `notes` — title, body, folder_id, creator_id, updated_at, pinned, archived
|
||||
- `tags` — note_id, tag
|
||||
- `links` — source_id, target_id, link_text
|
||||
- `folders` — name, parent_id, creator_id, sort_order
|
||||
|
||||
### New columns
|
||||
|
||||
- `notes.aliases` (text) — comma-separated aliases (v0.11.2)
|
||||
|
||||
### New tables
|
||||
|
||||
- `note_shares` — note_id, share_type, target_id, permission, share_token, created_by, created_at (v0.11.4)
|
||||
- `folder_shares` — folder_id, share_type, target_id, permission, share_token, created_by, created_at (v0.11.4)
|
||||
|
||||
---
|
||||
|
||||
## Settings Summary
|
||||
|
||||
### Existing
|
||||
|
||||
- `default_view` — "recent" or "pinned"
|
||||
- `editor_mode` — "rendered", "edit", or "split"
|
||||
|
||||
### New
|
||||
|
||||
| Setting | Type | Default | Version |
|
||||
|---------|------|---------|---------|
|
||||
| `daily_note_folder` | string | "Daily Notes" | v0.11.7 |
|
||||
| `daily_note_template` | string | `"# {{date}}\n\n"` | v0.11.7 |
|
||||
| `template_folder` | string | "Templates" | v0.11.7 |
|
||||
| `inline_preview` | boolean | false | v0.11.3 |
|
||||
| `graph_hide_orphans` | boolean | false | v0.11.5 |
|
||||
| `graph_cluster_by` | string | "folder" | v0.11.5 |
|
||||
|
||||
---
|
||||
|
||||
## Design Decisions
|
||||
|
||||
| Decision | Rationale |
|
||||
|----------|-----------|
|
||||
| UI redesign as v0.11.0, before features | Every subsequent version builds on the visual foundation. Shipping features on an ugly base means reworking the UI of every feature when the redesign eventually happens. Front-loading avoids double work and ensures every version screenshot looks like a real product. |
|
||||
| Notes as first reference extension | Exercises more kernel primitives than any other candidate. Complex enough to prove the platform; familiar enough to be immediately useful. |
|
||||
| Dedicated v0.11.x series (11 versions) | Notes is too large for a single version. Each v0.11.x is independently shippable and CI-green. |
|
||||
| UX quality threaded through every version | Each version specifies its UX standard, not just functionality. No "make it pretty later" — every feature ships with its final visual quality. |
|
||||
| Share model via new tables | Notes sharing needs note/folder-specific semantics (inheritance, public URLs, share tokens). Purpose-built tables beat generic resource grants for this use case. |
|
||||
| Aliases as comma-separated text | Small set (1–3 per note). Separate table adds join complexity for marginal normalization benefit. |
|
||||
| d3-force for graph | Existing hand-rolled sim has poor convergence at 100+ nodes. d3-force is battle-tested, ~15KB. |
|
||||
| Transclusion rendered on view, not live-synced | Live-sync requires WebSocket subs per embedded note. Disproportionate complexity pre-MVP. |
|
||||
| Templates are just notes in a folder | No template schema. KISS. |
|
||||
| Inline preview as fourth editing mode | Obsidian's killer UX feature. Users who want WYSIWYG-ish editing without leaving markdown get it without a ProseMirror dependency — CM6 decorations handle it. |
|
||||
|
||||
---
|
||||
|
||||
## Dependency Chain
|
||||
|
||||
```
|
||||
v0.11.0 UI/UX Foundation ← EVERYTHING depends on this
|
||||
v0.11.1 Deep Folders ← foundation for folder sharing (v0.11.4)
|
||||
v0.11.2 Wikilinks ← foundation for transclusion (v0.11.8)
|
||||
v0.11.3 Live Preview ← foundation for inline preview + embeds (v0.11.8)
|
||||
v0.11.4 Sharing ← depends on deep folders (v0.11.1)
|
||||
v0.11.5 Graph + Outline ← independent (hardening existing features)
|
||||
v0.11.6 Quick Switcher ← independent (keyboard navigation)
|
||||
v0.11.7 Daily Notes ← depends on deep folders (v0.11.1) for daily folder
|
||||
v0.11.8 Transclusion ← depends on wikilinks (v0.11.2) + live preview (v0.11.3)
|
||||
v0.11.9 Composability ← independent (slot/action declarations)
|
||||
v0.11.10 Polish + Gate ← depends on all above
|
||||
```
|
||||
|
||||
Versions v0.11.5, v0.11.6, and v0.11.9 are independent and can be
|
||||
reordered if priorities shift.
|
||||
Reference in New Issue
Block a user