Markdown in · map out
You already wrote the map.
md2hd reads the frontmatter you are already writing and draws the graph hiding inside it. Point it at a folder of notes and the topology you have been holding in your head becomes something you can look at.
Free, and there is no account. Your notes are parsed in the browser and never uploaded.
--- type: map title: Partnerships inverse: { works_at: employs } --- --- id: riverside-council type: org weight: lead title: Riverside City Council rel: employs: [dana-whitfield, marcus-oyelaran] --- --- id: dana-whitfield type: person title: Dana Whitfield subtitle: City Clerk works_at: "[[riverside-council]]" rel: owns: open-records-portal ---
Hover a block on the left to find it on the right. Colour is the node's type, and the stroke's strength is its weight.
Nothing new to learn
Three parts of a note, three parts of a map.
md2hd does not ask you to adopt a format. It reads the one you are almost certainly already using, and every file stays a plain markdown file you can open anywhere else.
Frontmatter
Every block becomes a node
A YAML block opens a card. type gives it a colour,weight gives it a volume, and any key md2hd does not recognise becomes a labelled row in the panel.
Links
Four ways to draw an edge
rel: maps, wikilinks in any field,[[bare links]] in the prose, andowns:: [[inline fields]]. Use whichever fits how you already write.
Prose
The rest is the note
Everything under the frontmatter renders in the detail panel — headings, tables, emphasis, and bare URLs, phone numbers and addresses that become clickable on their own.
One fact, one line
An organisation employs a person. That personworks at the organisation.
It is the same fact, and you will write it from both ends. Drawn naively that is two lines between the same pair, which reads as two different relationships. md2hd turns every link to face one way before drawing it, then lets each node state it in its own voice.
Reading from the Council
Reading from Dana
Passive voice flips on its own — anything ending in _by is stored the other way round. For pairs that use different words, declare them once underinverse:. How relationships resolve.
Reading
Focus reframes. It does not just highlight.
Highlighting a neighbourhood inside a tangle still leaves a tangle. Click a node and the map lays out its ego network instead — what points at it on the left, what it points at on the right, itself in the middle, and no crossings by construction. Click the background and the full map comes back exactly as you arranged it.

Three surfaces
A map raises three questions. map ▸type ▸ node answers all of them.
What is this? What else is like it? What is in here? The panel is one hierarchy rather than a detail view with lists bolted on, and the breadcrumb is the lift between the levels. Every surface renders its own ancestors, so there is no back stack to get wrong.

- The strip is the map's breadcrumb
- The chips along the top of the canvas select rather than hide. A type hidden from the canvas still appears there, struck through — the control that hid something must not also remove the way back to it.
- Each type carries a config dock
- What a card draws beyond its title — type, link count, subtitle, tags — is set per type, so terse people can sit beside verbose programs on one canvas.
- Off anywhere means off
- The map surface can silence an artifact everywhere; a type can only turn its own off, never override the map back on. An overruled chip stays visible and disabled, so the reason it is not applying stays legible.
Weight
Not every node deserves the same attention.
weight is a tier, not a score: five steps, named or numbered, independent of type. A lead node holds its colour at full strength and picks up a halo; a faint one recedes to a hairline.
- The tier is the whole control
- Write
weight: leadorweight: 5. Also accepted:critical,primary,key— and their equivalents at every other step. - Geometry never changes
- Cards are the same size at every tier, because the layout depends on it. A map whose card sizes shift is a map that reflows every time you edit a sentence.
- It says nothing about the graph
- Weight changes how hard a card pushes back at you, not what connects to what. Use it to separate the handful that matter from the supporting cast.
Where your notes live
On your machine. That is the entire architecture.
The material people map is usually private and half-formed — deals, sources, people, systems that are not supposed to be public yet. The cost of a backend is not the infrastructure, it is the question of where the notes now live. So there isn't one.
- No upload
- Files are read by the browser and parsed there. Nothing is sent anywhere, because there is nowhere to send it.
- No account
- Open the app and start. There is no sign-up, no email, and no session to expire.
- Your files stay yours
- Plain markdown in a folder you already own. md2hd reads it; your editor, your git repo and your backups keep working exactly as before.
- Maps persist locally
- Arrangements and edits are kept in this browser's local storage, so a reload picks up where you left off. Clearing site data clears them.
The honest limits are written down too — see what md2hd does with dataand what it deliberately does not do.
What people map
Node types are yours to invent.
md2hd knows nothing about organisations, services or characters. It draws whatever types your notes declare, which is why the same canvas reads as an org chart, a service map or a plot outline without being told which one it is.
Partnerships
Who actually decides
Organisations, the people inside them, and the one relationship every other one routes through.
Systems
What depends on what
Services, queues and the legacy box nobody wants to touch, drawn from the notes you took while learning them.
Research
How the evidence connects
Sources, claims and the threads between them, with the argument itself in the panel.
Writing
Who knows what, and when
Characters, places and the plot beats that tie them together — a canvas that never asks you to leave your drafts.
Two sample maps are already loaded.
Open the app and read one before you import anything of your own. Or drop a folder straight onto the canvas — whichever tells you faster whether this is useful.