Mind maps in the terminal.
Many maps, one folder, plain text.

hmx is a keyboard-driven mind mapper. Every map is a tab-indented text file. Maps link to each other. A subtree can become its own map. Nothing else is stored.

$ go install github.com/samuellawrentz/hmx@latest
Single static binary. Go 1.26+. macOS and Linux. GPL-3.0.
hmx showing the week map, opened from a link in the deep map; breadcrumb reads deep › week

What it is

A Go port of h-m-m that adds the things one map cannot do.

One folder of maps

A list screen shows every .hmm in your map folder as a tree, nested by who links to whom. inbox is always on top.

Links between maps

[[map]] or [[map#node]] in a node title. Enter follows it, Backspace comes back. A breadcrumb shows where you are.

Extract a subtree

Ctrl-E moves the node and its children into a new map and leaves a link behind. Big maps stay small.

Bodies via $EDITOR

A node can carry a few lines of notes. E opens them in your editor; they show in a pane at the bottom while the node is selected.

Plain text, git-friendly

Tabs for depth, one node per line, for body lines. No ids, no index, no database. Sync with git or anything that moves files.

Taskwarrior aware

[[task:uuid]] renders as ☐ or ☑, red when overdue. Enter on it opens task info.

Tour

Screens from the test fixtures, captured in a 120-column terminal.

The list

hmx with no arguments opens your map folder. Node count and age per map. Maps linked from another map are indented under it.

/ filters by name, then by content. n new, r rename (rewrites inbound links), d delete.

hmx list screen: inbox, week, and deep nested under week

The map

The same layout engine as h-m-m, ported function by function and checked byte for byte against the original. Long titles wrap. 0 expands everything, 1 collapses everything, f focuses one branch.

hmx map view of a 60-node map, fully expanded

Bodies

A node with notes shows after its title and a pane at the bottom with the text. Edit with E in $EDITOR.

hmx with a node selected whose body text shows in a bottom pane

Help

? lists every action and its key. There are 24 keys on the map and 7 on the list. Rebind any of them with bind<key> = action in the config file.

hmx help screen listing actions and keys

Compared to Whimsical, XMind, FreeMind and friends

Those are good tools. hmx is for people who live in a terminal and want their maps in git.

Whimsical, Miro, MindMeisterBrowser canvas, mouse first, your data on their servers. hmx is offline, keyboard only, and the file is yours.
XMind, MindNode, FreeMindDesktop apps with their own XML or binary format. hmx uses tab-indented text you can read in cat, grep, diff, and edit in any editor.
Obsidian canvas, LogseqGreat outliners, heavy apps. hmx is one 5 MB binary that starts in milliseconds and does one thing: trees with links between them.
h-m-mThe original. hmx keeps its layout and keys, drops PHP for Go, and adds the list screen, cross-map links, extract, bodies, and Taskwarrior.

Works anywhere a terminal works: over ssh, inside tmux, on a Raspberry Pi. Pairs with vim, Taskwarrior, and git.

Install

Needs Go 1.26 or newer. The binary lands in $(go env GOPATH)/bin.

# from the module proxy
go install github.com/samuellawrentz/hmx@latest

# or from source
git clone https://github.com/samuellawrentz/hmx
cd hmx && go build -o hmx .

# run
hmx                 # list of maps in your map folder
hmx notes.hmm       # open one file

Config lives in ~/.config/hmx/config, one key = value per line. Any key can also come from the environment as hmx_<key> or the command line as --key=value.

map_dir = ~/maps
# rebind: bind<key> = action
bindx = expand_all

Keys

Map screen. Arrow keys work everywhere h j k l do.

h j k lmove
Spacecollapse / expand node
0 / 1expand all / collapse all
ffocus: collapse others, center
Enterfollow link, else new sibling
Backspaceback to previous map
o / Tabnew sibling / new child
e / Eedit title / edit body
d y p Pcut, yank, paste as children, paste as siblings
J / Kmove node down / up
Ctrl-Eextract subtree to its own map
/ n Nsearch, next, previous
uundo
ssave
qback to list, saves if modified
?help
Ctrl-Cquit

File format

Tabs for depth. One node per line. Body lines start with under their node. Links are plain text in the title.

week
	planning
		sprint goals draft
		capacity check
	backlog
		triage new tickets
		> ask for repro steps before assigning
	[[deep]]
	[[deep#Retry policy draft]]
	release checklist [[task:3f9a2c1e]]