Constraints Before Tools: Designing a Keyboard-First Mind-Mapping Experience
I started this product with a romantic goal: build everything in Rust, end to end.
I still respect that idea. But it was the wrong starting point.
The real goal was never Rust everywhere. The real goal was thought velocity: a fast, practical, privacy-first mind-mapping experience where ideas can be captured immediately.
That shift changed everything.
Constraints first
Before choosing tools, I had to lock the non-negotiables:
- interaction speed over feature count
- keyboard-first flow with minimal interruption cost
- predictable behavior for repeated editing actions
- privacy boundaries that support encrypted user content
- maintainability for a one-person product
Once those constraints were explicit, technology choices stopped being ideology and became implementation details.
Why this is a design-systems problem
The architecture story is only one part.
The design-systems lens is:
- define interaction primitives before visual expansion
- build reusable patterns for high-frequency actions
- keep behavior contracts stable across features
- reduce UI surface area when it improves throughput
In practice, this meant treating the editor as a set of interaction contracts, not a collection of disconnected screens.
Interaction contracts that mattered
The editor needed to feel mechanically reliable. We prioritized:
- fast create-edit-confirm loops for nodes
- minimal pointer travel for common actions
- consistent focus and selection behavior
- clear hierarchy for scanning dense maps
- keyboard paths that are meaningful and discoverable
This is not nostalgia for shortcuts. It is a throughput strategy.
If the user has to think about controls instead of ideas, the system is failing.
Component backbone
For the canvas layer, we built on React Flow (@xyflow/react):
That gave us a stable graph viewport model early:
- node rendering and core graph interaction came pre-stabilized
- product work could focus on behavior instead of low-level canvas internals
- keyboard actions and toolbar actions could share the same graph contracts
From a design-systems perspective, this was critical.
Honest trade-offs
I tested several backend and infrastructure options that did not fit the constraints well enough over time.
The lesson was not that one tool is universally bad.
The lesson was this: a tool can be impressive and still be wrong for your constraints.
In design-systems work, this shows up as:
- too many variants before core behavior is stable
- excess controls that increase cognitive load
- inconsistent interaction rules between components
- local optimizations that hurt global usability
Reducing scope was often the higher-quality choice.
Why this matters for trust
Fast and consistent interaction does more than improve usability.
- users return more often
- repeated use creates workflow confidence
- trust grows when the interface gets out of the way
For a mind-mapping tool, that is the bar.
Try the interaction direction
If you want to see the interaction direction directly, use the public FOSS demo:
Closing
The core lesson still stands: constraints come before tools.
For design systems teams, I would put it this way:
- constraints define interaction principles
- principles define component behavior
- tools only matter after those two are clear
Once I accepted that order, implementation got faster and the product became more coherent.