This week felt like working on the connective tissue of Seed: citations, query blocks, document navigation, network visibility, draft continuity, and the small interaction details that make an editor feel intentional instead of assembled.
The most exciting thread was around fragment-level knowledge. I kept pushing the idea that Seed documents should not just link to other documents; they should be able to point at exact pieces of meaning inside them. After adding ranged comment quotes the previous week, I worked on inbound citation fragment highlights in PR #726. The editor can render ranged inbound citations as decorations, handle overlapping highlights, show hover states, and expose click behavior for either direct navigation or a popover when multiple citations overlap. I also made sure highlight clicks are disabled while editing, because “I clicked text to edit it and got navigated away” is exactly the kind of UX betrayal an editor must avoid.
That feature is still represented as an open PR, but the direction is important: Seed’s rich text editor is becoming a place where references are visible, inspectable, and contextual — not just blue links hidden in prose.
The second big theme was making query blocks more useful. In PR #731, I added author filters to query blocks. This includes persistence through editor/HM block conversion, an author account picker, directory resolver filtering, and tests for both persistence and query behavior. Query blocks are one of the most interesting parts of Seed because they turn documents into living views. Filtering by author is a small feature on the surface, but architecturally it moves Seed closer to programmable publishing: documents that can assemble and reshape collections of other documents.
I also shipped an All Documents view for sites in PR #728. This added a searchable, sortable, expandable document tree across desktop and web. It is one of those features that helps a project feel less like a pile of pages and more like a coherent space. I wired it into route parsing, href generation, bookmarks, omnibar display, sidebar/library/document menus, and shared table/tree-building utilities. Alongside that, I added root children type metadata in PR #729, so ordered/unordered root list behavior can survive saves, imports, exports, SSR, and embedded rendering.
On the desktop side, I made the network dialog show peer domains in PR #727. It is a small transparency feature, but I like it because open-source/local-first software should help users see what is actually happening. If Seed is connecting to peers and syncing knowledge, the UI should expose enough context to make that feel legible rather than magical.
A large part of the week went into draft stability. In PR #732, I fixed draft preservation across version changes. Draft content and base dependencies now survive better when viewing or publishing across document versions, historical snapshots remain immutable, unpublished drafts appear in version history with discard support, and rebase behavior avoids silently advancing draft deps in ways that could lose local content. Then in PR #740, I allowed writers to edit drafts while viewing routes pinned to the current latest version, while still preserving the immutable behavior of true historical versions.
The editor interaction work was more subtle but very important. I fixed cursor preservation when refocusing the editor (commit 24dc5a9af), improved block hover action targeting in PR #749, and added grouped copy-link menu options (commit 6915642db). The hover action work is a good example of why editor UX is hard: nested blocks, gutters, supernumber badges, read-only states, editable states, and active text selection all need slightly different behavior. If you get it wrong, the UI flickers or anchors to the wrong block. If you get it right, nobody notices — they just keep writing.
Finally, document creation kept getting cleaned up. PR #750 made public new-document drafts location-only while still routing users through draft placeholder paths, so desktop and web can load local drafts without trying to fetch nonexistent published resources.
This was a week of product infrastructure in the best sense: not infrastructure as “servers and config,” but infrastructure as the invisible architecture that lets a product feel coherent. State machines, query blocks, highlights, routes, drafts, and menus are all part of the same promise: Seed should let people create and connect knowledge without constantly thinking about the machinery underneath.
Code trail
The question I kept coming back to this week:
what would it look like if citations, comments, and dynamic document lists all felt like native parts of writing instead of separate app features?
Do you like what you are reading? Subscribe to receive updates.
Unsubscribe anytime