Overview
Surface matrix
Which surface has what, feature by feature. Red Pen is one note model on six components at six different maturity levels, and "free on every surface" has never meant "identical on every surface". This page is the honest version: every cell below was read out of the shipping code, not out of a feature list.
How to read it
Versions checked: WordPress 0.26.0, Express 0.3.1, static 0.1.1, Blender 0.4.0, Ableton 0.9.5, Hub 0.9.1. The Hub is not a note-authoring surface - it aggregates and writes status back - so several rows read "display only" there, and that is the intended design rather than a gap.
The table scrolls sideways on a narrow screen.
| Feature | WordPress | Express | Static | Blender | Ableton | Hub |
|---|---|---|---|---|---|---|
| Anchoring and navigation | ||||||
| Pin to an element / spatial anchor | ShippedCSS selector plus x/y fraction. Re-found by querySelector; no fallback if the DOM moves. |
ShippedSame selector plus x/y model. | ShippedSame model locally; only the bare selector is sent to the Hub. | ShippedObject or timeline frame, with a local-space position so a moved object still resolves. A rename breaks it. | ShippedClip, track, scene, device, sample or an arrangement range. Clip and track renames self-heal. | Not yetNot applicable - the Hub displays anchors, it does not author them. |
| Numbered markers on the work | ShippedNumbers are a per-render ordinal, not a permanent note number. | ShippedNumbered by creation order across open and in-progress notes. | ShippedPlus a custom pin colour, and pins re-place on DOM changes. | Not yetViewport gizmos carry a type icon and colour, no number. | Not yetLocators carry the note text, not an index. | Not yetThe board is a table, not an overlay. |
| Locate - and what it actually does | ShippedScrolls the element to centre and outlines it for about three seconds. It does not repair a broken selector. | ShippedScrolls to centre and flashes an outline. | ShippedScroll plus flash, and j cycles to the next pin on the page. |
ShippedSelects the object or sets the frame, then restores the note's bookmarked viewport if it has one. | PartialCalled Flash - it blinks the clip's colour. Live's SDK exposes no scroll, selection or transport control to jump with. | Not yetOffers an "open" link when the note carries a browser-navigable URL, and nothing when it does not. |
| The note itself | ||||||
| Typed notes | ShippedNote, Idea, Problem, Question. | ShippedThe same four. | ShippedThe same four. | ShippedThe same four. | ShippedThe same four, with ! ? * shorthand while typing. |
PartialDisplays and filters by type; cannot author one. |
| Custom note types | ShippedSite-wide, defined as Label|#hex lines in settings. |
Not yetThe four built-ins only. | ShippedPer browser, label and colour, defined in Settings. | Not yetThe add-on preferences have no type editor. | Not yetThe type list is fixed in code. | PartialRenders a custom type's own label and colour when a surface sends them, and humanizes the slug when it does not. It cannot define one. |
| Priority | ShippedLow / normal / high, plus a separate severity axis. | ShippedLow / normal / high. | ShippedLow / normal / high. The repository view has no priority filter yet. | ShippedLow / normal / high; high renders red in the viewport. | PartialOnly normal and high are settable - a high toggle, not a three-way control. | PartialFilters and sorts by priority; cannot set it. |
| Three-state status | ShippedOpen, in progress, resolved. | ShippedStores and emits the family's in_progress. |
ShippedStores progress internally and emits the spec's in_progress. Since 0.1.1 an import accepts every spelling, so a note no longer loses its middle state on the way in. |
ShippedEmits progress; the Hub buckets it correctly. |
ShippedOpen, in progress, resolved, with clip tinting per state. | ShippedAll three settable from the board and written back to the source. |
| Replies | ShippedOne level deep; replies are child posts. | ShippedThreaded under the note in the overlay. | ShippedKept locally; only the reply count is pushed to the Hub. | Not yetNot built. | ShippedReplies sent with the Enter key are currently unsigned; the Send button signs them. | PartialShows a reply count; no thread view and no way to post. |
| Assignee | ShippedAny user with the capability, or an AI agent. | Not yetIn the family spec, not in the port. | Not yetNot built. | Not yetNot built. | Not yetNot built. | PartialDisplays and exports an assignee; cannot assign. |
| Author identity | ShippedThe WordPress user. A note filed through a review link carries the reviewer's typed name instead. | ShippedFrom git config user.name, falling back to the OS user; each browser can override it. |
ShippedA name you set once in Settings. Blank until you do - it is never guessed. | Not yetThe preferences have no name field. | ShippedA name you set once in the board's settings. | PartialDisplays whichever author a surface sends. The Hub has no identity of its own. |
| Screenshots or snips | ShippedDrag a region, then annotate it freehand before attaching. | Not yetDeclared screenshots: false in its own capability block. |
Not yetNot built. | ShippedViewport snapshots, saved beside the .blend and shown on the note in the sidebar. | Not yetAudio snips are planned; there is no image capture in a DAW. | PartialRenders the viewport snapshot Blender pushes, in the Location cell. It captures nothing of its own. |
| Getting other people in | ||||||
| Client or guest reviewer intake | ShippedA revocable, expiring review link. No login, rate-limited, and reviewers cannot assign, resolve or attach screenshots. Since 0.26.0 a note reaches the link only if its author ticked Visible to client reviewers; a reviewer also sees their own reports at any status. | PartialTurning off the loopback guard lets someone else on the network use the same overlay. There is no guest mode, link or role. | PartialAnyone loading the page can write notes, but they stay in that browser - the handoff is a JSON export or a Hub push. | Not yetThe add-on runs inside your own Blender session; there is nothing to invite a reviewer into. | Not yetSame - the board only exists inside your own copy of Live. | Not yetLoopback only and token-gated by design. It is your board, not a shared one. |
| Getting your notes out | ||||||
| Export JSON | Not yetNo JSON export. The agent brief file is scoped to one agent and is not a substitute. | PartialThe store writes a JSON snapshot you can take, but there is no export command. | ShippedDownloads every note from every page. | PartialThe sidecar beside the .blend is already JSON; there is no export operator. | ShippedWrites the Set's notes to the store folder and opens it. | PartialThe aggregate is available over the local API; there is no Export JSON button. |
| Export CSV | ShippedHonours the status and assignee filters. | Not yetNot built. | Not yetNot built. | Not yetNot built. | ShippedEight columns; it drops replies, timestamps of status changes and the anchor, so it does not round-trip. | ShippedExports whatever the board is currently filtered to. |
| Export Markdown | Not yetA printable HTML client report ships instead. | Not yetNot built. | Not yetNot built. | Not yetNot built. | Not yetNot built. | ShippedA grouped checklist you can copy or download, built for a vault or a ticket. |
| Import | Not yetNo import path of any kind. | PartialA one-time, verified migration of its own older store. Not a general import. | ShippedPick a file, then choose replace-all or merge by id. | Not yetNot built. | PartialReads a fixed filename from the store folder and only adds notes it has never seen. Live's sandbox blocks a file picker. | Not yetSources push or are read from disk; there is no file import. |
| The Hub connection | ||||||
| Push to the Hub | ShippedBatched once per request whenever notes change. | Not yetNot needed - the Hub reads the app's store off disk instead. There is no push code. | ShippedAuto-pushes on every change once a Hub URL and token are set. | ShippedManual, or automatic on every change. | ShippedOpt-in, one push per Live Set. | Not yetNot applicable - the Hub is the destination. |
| Hub write-back | PartialWorks when the Hub pulls the site over REST with an Application Password. A push-connected site never reads the reply, so a board-side change is only held on the board. | ShippedA status the Hub writes into the snapshot is folded back into the log. Status only. | ShippedApplies the changes the Hub returns on the next push. | ShippedA Pull button fetches the board's statuses back. | ShippedApplied from the push response, with a guard against a stale board echo. | ShippedResolve, reopen and start from the board; routed to the right adapter per source. |
statusAt reporting |
ShippedStamped in UTC on every status change; sent on both the push and the pull shape. | ShippedUTC, on every status change. | ShippedUTC, through one choke point for every status change. | ShippedUTC since 0.4.0. Sidecars written in the old local-offset shape are converted as they are read. | ShippedUTC everywhere it is minted. A note that has never changed status carries none yet. | PartialReads it and never invents one. The Hub does not emit notes, so it has nothing of its own to stamp. |
| Housekeeping and platform | ||||||
| Orphan or stale detection | PartialThe pin disappears and Locate says so, per page view. Nothing is recorded or filterable. | Not yetA pin with no element silently does not render. | ShippedA counted banner, a "show only orphans" filter and a per-note flag. Nothing is auto-deleted. | PartialDetects a deleted or renamed object and flags it. There is no re-link - you unpin and pin again. | PartialClip and track anchors heal or get a Missing chip. Device, sample and scene anchors do neither. | PartialAges open notes and reports unreadable sources. It cannot check an anchor - it never opens your project. |
| Mobile and touch | ShippedTouch pinning with tap-slop, coarse-pointer sizing and safe-area insets. | Not yetFixed-width panel, mouse events only. | ShippedBottom-sheet layout under 600px, touch pinning, larger pins and tap targets. | Not yetNot applicable - Blender is a desktop application. | Not yetNot applicable - the board only exists in Live's desktop window. | PartialThe layout is responsive; there are no touch gestures. |
| Keyboard shortcuts | Partialj jumps to the next open pin, plus Escape and focus handling. Not configurable. |
PartialCtrl or Cmd with Enter to submit, Escape to cancel pinning. Not configurable. | PartialCtrl or Cmd with Enter, Escape, and j to jump. Not configurable. |
ShippedCtrl+Shift+N to capture, registered in Blender's keymap so you can remap it there. | PartialShortcuts inside the board only. Live's SDK offers no way to bind a global hotkey - every entry point is a right-click. | PartialEscape, focus trapping and keyboard sorting. No board-wide shortcuts. |
Caveats worth reading
Two cells above carry a qualifier that matters more than the badge does. They are written out here rather than buried in a table cell.
statusAt the Hub can parse, it can tell which side acted last and the hold simply stands. If it does not - an older build, a stamp in a shape the Hub cannot read, or a note whose status has never moved - the hold is blind: it counts down and the source takes the note back after a few syncs. The board says which kind you are looking at on the pill. Every hold now expires after seven days regardless, so nothing overrides a source forever.
What this changes
Two claims elsewhere were broader than the code. The product site's feature grid used to be introduced as "everything below is free, on every surface" - it now points here, because screenshots, import and export are genuinely not on every surface. The roadmap promised this page in June and now links to it. The commitment underneath both is unchanged and is the one worth holding us to: everything that ships is free wherever it ships, with no account, no key and no tier. The gaps in this table are unbuilt work, never a paywall.