Skip to main content

Maps overview

The maps module in LifeWell renders the relationships between your data as D3.js force-directed graphs. Each map type focuses on a different domain (people, memories, events, notes, chats) plus a "full" map that combines all of them. Nodes are entities; edges are associations — and the graph self-organises so closely-linked entities sit close together visually.

Maps are an exploration tool, not a tracking surface. They surface patterns ("which people appear in the most memories?", "which notes are linked to which events?") that flat lists obscure.

Map types

MapCentreRenders
People mapA person (or yourself)People + their memories + their notes + their events
Memory mapA memory (or all)Memories + tagged people + linked notes + locations
Event mapEventsEvents + linked notes + attendees + linked memories
Note mapA note (or all)Notes + associations to people / memories / events / chats
Chats mapChatsChats + participants + linked notes
Full mapYouEverything connected to you

Each map is a different lens on the same underlying data — your person records, memories, notes, events, chats.

Node types

Nodes can represent:

TypeVisualSource
PersonAvatar circlePerson records
MemorySquare with photo backgroundMemory records
EventTriangle / calendar iconCalendar events
NoteDocument icon, coloured by note's colourNote records
ChatSpeech-bubble iconChat threads
TagPill-shapeTag entities
LocationPin iconLocation snapshots

Different visual treatments make node type clear at a glance, especially on the full map where every type is mixed.

Edges represent typed associations:

TypeMeaning
familyPerson-to-person family relationship
friendPerson-to-person friend relationship
colleaguePerson-to-person work relationship
mentioned_inPerson mentioned in a memory or note
tagged_inPerson tagged in a memory
related_toGeneric link between any two entity types
participantPerson participated in an event
created_byNote / memory created by a user
associatedCatch-all association

Edges are rendered with different line styles (solid for direct, dashed for inferred / weak, dotted for mentions) so the relationship type is readable.

How a graph is built

For each map:

  1. Read the entities relevant to the map type from your account.
  2. Build the node set.
  3. Compute the edges by walking the association fields on each entity (e.g. memory.people[].personId → memory-person edges).
  4. Pass to D3's force simulation: forces include link-attraction, node-repulsion, centring, and (for some maps) clustering by tag or year.
  5. Render in SVG. Interactive — pan, zoom, click, drag.

The force simulation pauses once the layout settles, so static viewing has no ongoing cost.

Interactive controls

ControlWhat it does
PanDrag the background
ZoomScroll wheel / pinch
Click nodeOpen that entity's detail page
Drag nodePin to a position (releases force)
Right-clickQuick-action menu (filter, hide, focus)
Filter panelHide node types or link types
SearchFind a specific node by name
FocusRecentre the simulation on a chosen node
ResetRe-centre on yourself + 100% zoom

Performance

D3 force simulations scale to:

  • ~150 nodes smoothly on most devices.
  • 150–400 usable, layout takes a few seconds to settle.
  • 400+ start to lag; consider filtering.

The maps page has filter controls so you don't have to render everything at once. For the full map, the default filters limit to the last 12 months unless you opt to see everything.

Visualisation philosophy

The maps aren't optimised for prettiness or social-network-style hairballs — they're optimised for insight:

  • Heavy clustering means a group that shares many associations.
  • An isolated node means someone (or some memory) you haven't linked into much.
  • A "bridge" node connecting two clusters is interesting (e.g. a friend who's also a colleague).
  • Tag-clustering (when enabled) reveals themes (e.g. all "wedding" memories cluster together).

Export

FormatUse
PNGWeb-shareable raster
SVGVector, prints well
JSONRaw graph data for external processing

PDF export with surrounding context (legend, filter state) is on the roadmap.

Privacy

Maps render from your private data:

  • Per-account, private — only you see your maps.
  • Sharing: you can export a snapshot (PNG) and share the image, but the underlying graph is not shareable as an interactive view.
  • Connection visibility: even connected partners don't see your maps; they see the underlying entities (memories, people, notes) per your data-sharing matrix.

What maps are not

  • Not a social graph. No follower / following count. The graph is your private associations.
  • Not a knowledge graph in the Notion / Obsidian sense. LifeWell isn't designed for note-taking-with-backlinks as the primary use case; the maps are an exploration layer on top of the existing surfaces.
  • Not auto-generated insights. The map shows what you've linked; it doesn't infer new connections.
  • Not real-time collaborative. Single-user.

When to use a map

  • Discovery: "What memories does this person appear in?" → People map → click their node.
  • Reflection: "Who do I keep coming back to in my notes?" → Note map → tag-clustering reveals patterns.
  • Cleanup: "Which notes are unconnected to anything?" → Note map → isolated nodes are candidates for archiving.
  • Storytelling: "Map of my last trip" → Memory map filtered to the trip's date range.

Worked example

Open the Note map. The graph shows:

  • 80 note nodes.
  • ~30 person nodes (the people associated to notes).
  • ~15 memory nodes (memories that have linked notes).
  • ~120 edges.

You notice a tight cluster of 12 notes all linked to one person (your business partner). Clicking the cluster reveals it's the "project Y" notes — useful for spotting they all want to live in one folder.

Another node (your high-school best friend) has 2 isolated notes — they're stale; archive them or attach them to memories.


Last updated: 2026-05-11 Author: Ahsan Mahmood