Raasta

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. No lateral links. No self-links, duplicate edges or cross-branch shortcuts; they are removed.
  6. Unique ids. Ids are unique strings. Import replaces them with fresh ones, so they only need to be consistent inside the file.
  7. Valid states. state is one of none, learning, confident, revise; anything else becomes none.
  8. Positions are optional. Send x: 0 and y: 0. The importer lays out every level for you.