About Raasta
Turn scattered notes into a map you can see, walk through and finish.
The problem
When you learn something big or plan a project, your notes end up as long flat lists. It is hard to see how the pieces fit together, what to do next, and what you have already mastered.
Most mind-map tools fix the picture but not the workflow: they are slow to build, need an account, and keep your notes on someone else's server.
What Raasta does
- Draws your topics as cards on a canvas, connected in the order you follow them.
- Organizes your ideas into an expandable family tree of parents and descendants — collapse branches for high-level focus, or expand to explore deeper topics with badge indicators.
- Tracks progress with mastery states (none, learning, confident, revise), todos and links on every card.
- Stays on your device: maps are stored locally and move in and out as files.
- Imports a ready-made map from a JSON file, so an AI assistant can build the first draft for you.
The map file (JSON)
A map is one JSON document called a MapDoc. Topics and edges form an expandable family tree hierarchy structured through parent-descendant links (parentId).
MapDoc
- schemaVersion (1)
- Always the number 1.
- id, title (string)
- Map identity and display name.
- createdAt, updatedAt (number)
- Millisecond timestamps.
- topics (Topic[])
- Every card across all family tree levels.
- edges (Edge[])
- Every connection across all branches.
- canvasStyle (object, optional)
- layoutDirection (LR or TB), gridDots, theme.
Topic
- id (string)
- Unique, non-empty.
- parentId (string or null)
- null = root level; otherwise the id of the parent topic in the family tree.
- title, description, notes (string)
- Card title, short subtitle, longer free text.
- links ({ id, label, url }[])
- Reference links.
- todos ({ id, text, done }[])
- Checklist items.
- state (enum)
- none, learning, confident or revise.
- x, y (number)
- Position. Optional in practice: import auto-arranges.
Edge
- id (string)
- Unique, non-empty.
- parentId (string or null)
- The parent branch the edge belongs to (matches target topic's parentId).
- sourceId (string or null)
- null = originating from the parent topic/anchor; otherwise a topic on the same level.
- targetId (string)
- The topic the edge points to.
- kind (next)
- Use next for every edge.
Rules that keep a map clean
These rules come from the branch-formation spec and are enforced on import. Anything that breaks them is repaired or dropped.
- One parent each. Every topic has exactly one parent in the family tree. Top-level topics use parentId null. Sub-topics use the id of their parent topic. Multi-level nesting is fully supported.
- Edges stay within their branch. An edge connects topics with the same parentId, and its own parentId matches. Branches never link laterally to each other.
- Every main branch connects to the root. Each top-level topic (parentId null) has its own edge with sourceId null from the root hero. Main branches are never chained to each other.
- Fan out by default. Siblings connect directly to their shared parent (sourceId null). Chains (step 1, step 2, step 3) are only for a short, strictly-ordered sequence inside one branch — a whole branch chained into one straight line is a sign something went wrong.
- No lateral links. No self-links, duplicate edges or cross-branch shortcuts; they are removed.
- Unique ids. Ids are unique strings. Import replaces them with fresh ones, so they only need to be consistent inside the file.
- Valid states. state is one of none, learning, confident, revise; anything else becomes none.
- Positions are optional. Send x: 0 and y: 0. The importer lays out every level for you.