Some checks failed
CI/CD / detect-changes (pull_request) Successful in 4s
CI/CD / test-frontend (pull_request) Has been skipped
CI/CD / test-sqlite (pull_request) Has been skipped
CI/CD / test-go-pg (pull_request) Has been skipped
CI/CD / test-runners (pull_request) Has been skipped
CI/CD / e2e-smoke (pull_request) Has been skipped
CI/CD / build-and-deploy (pull_request) Has been cancelled
Insert two new version series after v0.9.x: - v0.10.x Panels + Composable Layout (kernel primitive) - v0.11.x Notes Reference Extension (first-party extension) Renumber existing planned work: - v0.10.x Reference Extensions → v0.12.x - v0.11.x Sidecar Tier + Polish → v0.13.x Add new design docs for panels and notes v0.11.x series. Update v1.0.0 gate criteria and design decisions log. Remove stale docs (AUDIT-surfaces, USABILITY-SURVEY). Fix dangling reference in DESIGN-shell-contract. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
745 lines
32 KiB
Markdown
745 lines
32 KiB
Markdown
# 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.
|