← Stream
field notes Project hub

Explore page: a visual browsing UI for the garden

Design document for an /explore page that lets visitors walk through the garden visually, using semantic maps, serendipity, and trails.

The idea

What if visitors could explore the garden not just through lists and links, but by walking through it? A dedicated /explore page that makes the garden’s structure visible and browsable, using the embeddings and key phrases we’ve already computed.

Three modes of exploration, all sharing the same spatial map:

1. The garden map

A 2D map where every item is positioned by semantic similarity. Items that are about related topics cluster together. Items on unrelated topics sit far apart. You see the shape of the garden at a glance: where the conversation design cluster is, where the AI explorations live, where the book reviews gather.

Visual language:

  • Items rendered as Rough.js circles (hand-drawn, matching the garden’s sketchy icon style and feTurbulence wobble filter)
  • Size reflects maturity: seeds are small, solid articles are larger
  • Color follows the existing collection palette (WCAG AA compliant: #7A5A48 for articles, #4A7A50 for field notes, #A07030 for seeds, etc.)
  • Hover shows title + description in a tooltip
  • Click navigates to the item
  • Pan and zoom via mouse/touch
  • Cluster labels auto-generated from shared key phrases (“conversation design”, “digital gardens”, “embedding models”)

Data pipeline: Project the 1024-dim bge-m3 embeddings to 2D using UMAP (via umap-js, client-side). Pre-compute at build time and ship as a static JSON file with x,y coordinates per item.

2. Wander

A serendipity mode. Not pure randomness: constrained randomness that surfaces undervisited or sparsely connected items.

How it works:

  • A “Wander” button picks a random item, weighted toward items with fewer inbound links
  • The map smoothly pans to that item’s location
  • A sketchy circle highlights the item and its 3-4 nearest neighbors on the map
  • A small card appears: “While you’re here
” with the item title, description, and its neighbors as suggestions

Visual language:

  • The highlighted area could look like a hand-drawn magnifying glass or a garden bed outline
  • Neighbors connected by faint sketchy lines (Rough.js paths)

Design principle: Serendipity requires both unexpectedness and value (IJDesign research). Weighting toward under-linked items provides unexpectedness. Showing neighbors provides value: you don’t just land on a random page, you land in a neighborhood.

3. Garden paths (trails)

Curated or auto-generated sequences through the garden. A path connects items in an order that tells a story or follows a theme.

Types of paths:

  • Auto-generated: Shortest semantic path between two items. “How do you get from ‘Crew Resource Management’ to ‘Digital Gardens vs Blogs’?” The algorithm finds intermediate items that bridge the semantic gap.
  • Curated: Hand-picked sequences for specific themes. “The AI conversation design journey” or “How this garden was built.”

Visual language:

  • Paths drawn as Rough.js curved lines across the map, like hand-drawn garden paths
  • Active path highlighted in hot pink (#D6006C), other paths in muted earthy tones
  • Current position on the path shown as a marker
  • Path list in a sidebar or overlay: click a path to activate it

Inspiration: Vannevar Bush’s Memex trails (1945) proposed paths through linked knowledge that strengthen with use and fade without it. Mozilla’s experimental Trails browser replaced tabs with horizontal reading paths.

Visual design principles

The explore page should feel like looking at a hand-drawn map of an actual garden. Not a data visualization. Not a dashboard.

  • Rough.js for all shapes and lines (organic, imperfect, warm)
  • Earthy tones from the existing collection palette, not bright data-viz colors
  • No grid, no axes. This is a landscape, not a chart
  • Labels use Lora (the garden’s heading font) for a handwritten quality
  • Dark mode support via the existing token palette
  • The roughViz philosophy: “Use these charts where the goal is to show intent or generality, not absolute precision”

Technical approach

ComponentLibraryNotes
2D projectionumap-js (Google PAIR)Pre-compute at build time, ship as static JSON
RenderingD3.js + Rough.js157 items is well within SVG capacity
Pan/zoomd3-zoomStandard, well-tested
Hand-drawn shapesRough.js (<9KB)Matches existing garden aesthetic
TrailsD3 path generators + Rough.jsCurved lines between waypoints
HostingAstro page (/explore)Static, ships with the site

The page loads a pre-computed JSON with item metadata + 2D coordinates. No runtime ML, no server needed.

Status

  • v0 prototype: interactive layout designed in Vercel v0, then rebuilt as vanilla JS for Astro
  • UMAP spatial map: 162 items projected from bge-m3 embeddings via umap-js (scripts/build-explore-data.cjs)
  • Rough.js rendering: hand-drawn circles, connection lines, cluster labels
  • Three interaction modes: Map (pan/zoom), Wander (serendipity), Paths (trails)
  • Wander card with “While you are here
” neighborhood suggestions
  • Trail sidebar with curated path cards
  • Legend (collapsible, collection colors + maturity sizes)
  • Tooltip with maturity bar and collection indicator
  • WCAG AA color palette: all collection colors ≄3:1 contrast in both light and dark mode
  • Design system documentation (design system field note)
  • Added to main navigation
  • Auto-generated trails from hub/develops project structure
  • Named territories: semantic regions named by dominant tags, rendered as subtle italic labels
  • Topographic contour lines: KDE density iso-contours as faint hand-drawn background terrain
  • Organic trail paths: smooth Catmull-Rom curves through stops (rough.js curve) instead of straight lines
  • Stable map positions: pinned in map-roots.json, --recompute flag for full reset (field note)
  • Manual position overrides: move items to a target territory via map-roots.json
  • Library noise filter: fiction and unconnected books excluded from map
  • Enriched embeddings: keyphrases + reason fields for more accurate positioning
  • Wiki-link graph as positioning signal: nudge linked items toward each other
  • Keyboard navigation on the map
  • Mobile layout polish

Answered questions

  • Full-screen layout with header, not embedded in a container
  • Overlapping circles handled by hover-to-front + tooltip offset
  • Trails stored as static data in explore-data.json (not a content type)
  • Explore link lives in the main navigation

References

Mycelium tags, relations & arguments