Documentation
← Back to App

Hierarchy Flow Visualiser Interactive graph editor for hierarchical structures and directional flows

The Hierarchy Flow Visualiser (Crow Flow) is a browser-based, interactive tool for building and exploring hierarchical node structures connected by animated directional flows. Define your graph using a simple text-based DSL, then pan, zoom, expand, collapse, and rearrange everything on a live canvas.

πŸ—οΈ
Hierarchical Nodes
Nest nodes inside parent containers that can be expanded and collapsed interactively.
🌊
Animated Flows
Sankey-style ribbons with animated dashes showing direction and flow mode (stream or batch).
✏️
Text-Based DSL
Define your entire graph in a lightweight, readable text syntax β€” no drag-and-drop required.
πŸ’Ύ
Scenarios
Save, switch, duplicate, and manage multiple graph scenarios with automatic persistence.
Full application overview with graph canvas, toolbar, and Properties panel
Full Application Overview. Click to view full size.

Quick Start

Get up and running in under a minute:

  1. Open the app in any modern browser β€” no build step or dependencies required.
  2. Click ✏️ Edit Graph in the toolbar to open the DSL editor.
  3. Type your graph definition using the syntax described below.
  4. Click Save & Apply β€” your graph renders instantly on the canvas.

Here's a minimal example to get started:

DSL
# Define hierarchy: A and B are children of Container
A & B > Container

# Define a flow from A through B to an external node
F1= A --> B --> External

# Add attributes to nodes
A{status=live, label="Service A"}
B{status=inprogress}
Rendered quick start example graph
Quick start example graph. Click to view full size.

DSL Syntax

The graph is defined using a lightweight text-based Domain-Specific Language (DSL). The DSL has three line types: hierarchy lines, flow lines, and attribute lines. Blank lines and full-line # or // comments are ignored. A bare identifier declares an isolated node. Invalid syntax or cyclic hierarchies are rejected without replacing the current graph. Hierarchies are limited to 256 levels; flow cycles are supported. Quoted values use JSON string escaping.

Line Type Syntax Pattern Example
Hierarchy child > parent A & B > C
Flow ID= source --> target F1= A --> D
Attribute ID{key=value} A{status=live}
πŸ“˜ Note
All node and flow IDs are case-insensitive. MyNode and mynode refer to the same node. Nodes are created automatically when first referenced in any line.

Hierarchy Lines

Hierarchy lines define parent–child relationships between nodes using the > operator. The left side contains one or more child nodes (separated by &), and the right side is the parent node.

DSL β€” Hierarchy
# Single child inside a parent
Worker > Service

# Multiple children inside a parent (use & to separate)
API & DB & Cache > Backend

# Chained nesting: A & B inside C, and C inside D
A & B > C
C > D

# Multi-level in one line: X inside Y inside Z
X > Y > Z
Nested containers in the hierarchy example graph
Hierarchy example graph. Click to view full size.
πŸ’‘ Tip
A node can only have one parent. If a child is assigned to multiple parents, only the first assignment is used.

Flow Lines

Flow lines define directional connections between nodes using the --> arrow operator. Flows are rendered as thick, animated Sankey-style ribbons on the canvas.

DSL β€” Flows
# Simple flow: A connects to B
F1= A --> B

# Chained flow: A to B to C to D
Pipeline= Source --> Transform --> Load --> Sink

# Multi-source: A and B both flow into C
Merge= A & B --> C

# Multi-target: A flows to both B and C
Split= A --> B & C
Directional ribbons connecting nodes in the flow example
Flow connections example graph. Click to view full size.

A --> |blah| B adds a segment label, equivalent to -->{label=blah}. Use JSON quoting for literal pipes, quotes or escapes: A --> |"a | b, = {x}"| B. Malformed labels leave the live graph untouched.

A <--> B is bidirectional and has the same routing and connectivity as B <--> A, including merged/collapsed routes. Both ends attach in the upper half of left/right sides (left half of top/bottom sides). The Arrowheads setting controls both ends. Labels and arrow kinds survive DSL serialization and SVG/PNG export.

Attribute Lines

Attributes are key-value pairs attached to nodes or flows. They are used for labelling, styling (status/color), and storing arbitrary metadata. Attributes are defined using curly braces {} after a node or flow ID.

DSL β€” Attributes
# Node attributes
api{status=live, label="API Gateway", owner="team-alpha"}

# Flow attributes
F1{mode=batch, label="Daily ETL"}

# Custom color (hex without #)
alerts{color=ff6b6b, label="Alert Service"}

# Values with spaces must be quoted
db{label="Main Database", type=postgres}
Attribute Applies To Description
label Node, Flow Display label. Shown on the node or above the flow ribbon.
name Node, Flow Alternative to label. Used as display name if label is not set.
status Node, Flow Automatic coloring: live, inprogress, tostart.
color Node, Flow Custom hex color (without #). Overrides status color.
mode Flow Animation mode: batch for block animation, stream for streaming. (defaults to streaming)
any key Node, Flow Arbitrary metadata β€” visible and editable in the Properties panel.

Inline Flow Attributes

Flow attributes can be defined inline on the flow definition line, between the ID and the = sign. This is the most common way to define flow attributes.

DSL β€” Inline Attributes
# Inline attributes on a named flow
ETL{mode=batch, label="Nightly ETL"}= Source --> Transform --> Warehouse

# Inline attributes on an anonymous flow (use _ as ID)
_{name="events", mode=batch}= Producer --> Queue --> Consumer

# Status-colored flow
DataSync{status=live}= Primary --> Replica

Anonymous Flows

Flows don't require an explicit ID. You can use _ as the ID for anonymous flows, or omit the ID= prefix entirely for quick connections.

DSL β€” Anonymous Flows
# Anonymous flow with underscore prefix
_= A --> B

# Fully anonymous β€” no ID or = needed
X --> Y --> Z

# Anonymous with inline attributes
_{mode=batch}= Upstream --> Downstream
πŸ’‘ Tip
Each anonymous flow gets a unique internal ID (flow_0, flow_1, etc.) so they remain individually identifiable in the Properties panel.

Multi-Path & Branching Flows

A single flow definition can describe multiple paths using & for branching and commas for separate path segments.

DSL β€” Multi-Path Flows
# Fan-in: multiple sources merge into one target
Ingest= Kafka & S3 & API --> Processor

# Fan-out: one source splits into multiple targets
Fanout= Router --> ServiceA & ServiceB & ServiceC

# Comma-separated paths (multiple independent segments in one flow)
Mixed= A --> B, C --> D

# Complex: chain + fan-in + fan-out in a single flow
Pipeline= Src1 & Src2 --> Merge --> Out1 & Out2
Branching connections in the multi-path flows example
Multi-path flows example graph. Click to view full size.

Canvas Interaction

The canvas is fully interactive. You can pan, zoom, select, and drag elements freely using mouse and keyboard controls.

Action Input Description
PanClick + drag empty spaceMove the viewport around the canvas
ZoomMouse wheelZoom in/out centered on cursor
Zoom InToolbar +Zoom in from center
Zoom OutToolbar βˆ’Zoom out from center
Fit to ViewToolbar FitZoom and pan to show the entire graph
Select NodeClick a nodeSelect a node and open its properties
Select FlowClick a flow ribbonSelect a flow and open its properties
Multi-SelectCtrl + ClickAdd/remove items from the selection
Move NodeClick + drag a nodeReposition a node (and its children if expanded)
Expand/CollapseDouble-click a containerToggle visibility of child nodes
DeselectEscClear the current selection
Before and after dragging API Gateway, with its flow ribbons following the moved node
Drag a node to reposition it; its connections follow automatically. Click to view full size.

Expand & Collapse

Nodes that contain children (defined via hierarchy lines) are container nodes. Initially, all containers are collapsed β€” showing as a regular node with a small β–Ά indicator.

DSL β€” Expandable Hierarchy
# Create a two-level hierarchy
Worker1 & Worker2 > Pool
Pool & Scheduler > Backend

# Flows between nested nodes
Work= Scheduler --> Worker1 & Worker2
πŸ“˜ Note
When children are inside a collapsed container node, their flows visually originate from the container itself. Expanding the container reveals the individual connections.
Backend collapsed beside the expanded Backend and Pool containers showing Scheduler and workers
Double-click containers to reveal nested nodes. Click to view full size.

Repeated expand/collapse toggles restore exact prior geometry, including nested expansion states, affected neighbors and X-axis layouts, unless intentional geometry/hierarchy/settings changes intervene. No-op toggles do nothing. Moving an unpinned collapsed container translates its saved child layout.

Pinning Nodes

Select a node and use Pin node / Unpin node in Properties or Pin position / Unpin position in its context menu. A πŸ“Œ marks explicit pins; Properties explains inherited anchors and blocked ancestors. Pins are undoable and saved.

A pin fixes world-space top-left, overriding drag, neighbor shifts, re-layout and X-axis moves. A pinned container anchors initialized descendants, including collapsed ones; unpositioned descendants still receive their first layout on expansion. An ancestor containing a pin cannot translate, but may resize around its children; unpinned siblings may move. Expand/collapse can change dimensions, not pinned anchors. Intentional hierarchy edits and deletion remain available. Constraints take priority over avoiding overlap; unpin before rearranging an anchored subtree.

Perspectives

The always-visible Perspective toolbar dropdown selects named per-scenario views; All removes perspective dimming. Use Manage… beside it to create, rename or delete views. With a named view active, right-click a node, selected nodes or a link to Add to perspective or Remove from perspective. Link actions affect the clicked segment (or the segments represented by a merged ribbon), not unrelated hops in the same flow. These actions support undo and save automatically. Separate All nodes and All links / segments lists include collapsed descendants and every hop. Unchecked elements dim, never hide. Nodes, children and connected segments have independent inclusion. Merged ribbons split by inclusion. Explicitly hidden intermediate nodes still bypass normally; a bypass is included when any contributing segment is included.

New elements default included; removed references are pruned. UI node renames, label/attribute edits and serialization preserve membership. DSL flow renames/anonymous renumbering preserve unique endpoint/direction matches. Arbitrary DSL node replacement and ambiguous duplicates count as new items. Perspectives and the active choice survive undo, switching, cloning, reload and local/cloud saves.

Flow Animation

Flows animate with moving dashes to indicate direction of data/control travel. The animation style depends on the flow's mode attribute:

DSL β€” Flow Modes
# Default streaming flow
Realtime= Events --> Processor --> Dashboard

# Batch flow with block animation
ETLFlow{mode=batch}= Database --> ETL --> Warehouse

Animation speed is configurable through the Settings dropdown in the toolbar. Set speed to 0 to pause all animation.

Stream flow with short dashes above a batch flow with wide blocks
Paused frame comparing stream and batch animation styles. Click to view full size.

Flow Merging

When multiple flows share the same visual endpoints (e.g. because their actual endpoints are children of the same collapsed container), they are merged into a single thicker ribbon. The ribbon thickness scales with the number of merged flows.

Flows with different colors or modes remain separate ribbons even when sharing the same endpoints. Expanding the container separates the flows to show their actual individual connections.

Three flows merged into one thick ribbon between collapsed containers, then separated after expanding
Expanding the containers reveals the individual connections. Click to view full size.

Attributes Panel

The right-hand Properties panel displays attributes of the currently selected node or flow. From this panel you can:

Changes made in the Properties panel are automatically reflected in the DSL and persisted with your current scenario.

πŸ’‘ Tip
When you multi-select items (Ctrl + Click), the panel shows a summary of all selected nodes and flows.
Selected API Gateway and its Properties panel with color, label, status, owner, and add/remove controls
Select a node to inspect and edit its attributes. Click to view full size.

Node Icons

Set a node's icon attribute to an SVG URL to display a small icon on its left side. Add bigicon=1 for a square node with a large icon above its label.

In the Properties panel, click Icon beside the icon attribute to open the icon picker. Search or browse folders, select an icon to preview it, then click Use Icon.

DSL β€” Node Icons
WebServer{icon="/static/Icons/Azure_Public_Icons/compute/10021-icon-service-Virtual-Machine.svg", label="Web Server"}
Database{bigicon=1, icon="/static/Icons/Azure_Public_Icons/databases/10130-icon-service-SQL-Database.svg", label="SQL DB"}
Web Server with a standard icon, SQL DB with a big icon, and the icon picker with SQL Database selected
Standard and big icons, plus the icon picker using a small demo catalog. Click to view full size.

Status Colors

Setting the status attribute on a node or flow applies automatic color coding. The following status values are recognized:

Status Node Color Flow Color Visual
live Blue (#2196F3) Green (#4CAF50) Active / running
inprogress Green (#4CAF50) Yellow (#FFD54F) Being built / deployed
tostart Amber (#FFC107) Tan (#C8A96E) Planned / not yet started
DSL β€” Status Colors
# Color flows by status
_{status=live}= api --> existingfeature
_{status=inprogress}= api --> featureindev
_{status=tostart}= api --> futurefeature
API connected to live, in-progress, and planned features with distinct node and flow status colors
Node and flow colors for live, inprogress, and tostart. Click to view full size.

Custom Colors

You can assign any hex color to a node or flow using the color attribute (without the # prefix). Custom colors override status colors.

DSL β€” Custom Colors
# Red node
Alerts{color=ff6b6b}

# Purple flow
Events{color=9b59b6}= Producer --> Consumer

# Teal container
Infra{color=00bcd4, label="Infrastructure"}
πŸ“˜ Note
Colors can also be changed interactively via the color picker in the Properties panel β€” no need to edit the DSL directly. Node text color automatically adjusts for contrast (light text on dark backgrounds and vice versa).

Filtering

The Filter field in the toolbar lets you search and highlight nodes and flows by their attributes, IDs, or labels. Non-matching items are dimmed, making it easy to focus on specific parts of the graph.

The filter matches against:

Filter Examples
# Show only live items
status=live

# Filter by a label substring
gateway

# Filter by node ID
api

# Filter by any attribute value
team-alpha
Filter field set to status=live, with nonmatching nodes and flows dimmed
Filter by an attribute to focus on matching items. Click to view full size.

Highlight Connections

Enable Highlight Connections in the Settings dropdown, then click any node. All upstream and downstream connected nodes and flows are highlighted, while unrelated items are dimmed. This provides a quick view of data lineage and dependencies.

API Gateway selected with its request path highlighted and the unrelated batch path dimmed
Highlight Connections keeps the selected node's connected path in focus. Click to view full size.

Scenarios

Scenarios let you maintain multiple independent graph configurations. Each scenario stores its own DSL text and node positions. Scenarios are persisted in browser localStorage and survive page reloads.

Click Scenario in the toolbar to open the Scenario Organization dialog. Use the search field to filter scenarios by name across the Local and Remote sections:

Action Description
NewClose the organizer and create a scenario with the sample graph and a custom name. When logged in, Remote is the default destination; select a Local bucket first to save locally instead.
RenameRename the selected scenario.
CloneDuplicate the selected scenario (DSL + positions) with "(copy)" suffix.
DeleteDelete the selected scenario (at least one must remain).
SwitchSelect a different scenario in the organizer.
πŸ’‘ Tip
Scenarios save locally after edits, every 5 seconds, and on page unload. New scenarios default to Remote while logged in; existing local scenarios are uploaded only when explicitly cloud-linked. DSL, attributes, names, and positions sync after a per-scenario 2-second debounce. Failed saves remain pending locally; click the cloud button to retry.
Scenario Organization dialog showing local demo diagrams, New, Clone, Rename, and Delete controls, and the logged-out Remote column
Click Scenario to organize local diagrams; Remote requires login. Click to view full size.

Cloud synchronization and recovery

Google login enables cloud sync. Cloud caches are separated by account; local scenarios are shared within the browser profile. Existing caches whose account owner is unknown are preserved as detached local recovery scenarios, and cloud copies are fetched separately.

Newer cloud revisions are fetched on login, window focus, and reconnect. Unapplied DSL drafts are not overwritten by refresh. If another device changed the diagram, your edits are preserved as a separate conflict copy rather than overwriting remote work.

Deleting a cloud scenario removes its active server listing; unlinking leaves a local copy. Version history and deletion markers remain on the server. Opening a shared link always creates a new scenario and never overwrites an existing Default diagram.

Undo histories are independent for each scenario. Keep exports/backups of important diagrams, especially before clearing browser storage.

Choose Export β†’ Share in the toolbar to generate a shareable URL encoding the current DSL. Click Copy to copy it to your clipboard. No login is required to open a shared diagram.

The link is a snapshot: later edits are not reflected in it. Opening a link creates a new scenario without overwriting existing diagrams. Do not share confidential information through these URLs.

Share Graph dialog containing an encoded example link and a Copy button
Use Export β†’ Share to copy a diagram link. The screenshot uses a demo origin. Click to view full size.

Export and JSON backups

Export β†’ Download JSON saves a complete portable graph: DSL, all nodes/links, hierarchy/attributes, positions/sizes, expansion states, nested offsets, pins, perspectives/active view, viewport and graph layout/routing settings. Account/cloud IDs, revisions and organizer metadata are excluded; user-authored graph attributes remain.

Load JSON validates this versioned format (up to 5 MB), including graph/DSL consistency and geometry, then creates a new local scenario. Invalid files leave the live graph untouched. Use JSON for full-fidelity backups; Download DSL and Share are DSL-only, without positions, pins or perspectives. SVG/PNG retain labels, two-ended arrows and perspective dimming. SVG, PNG and PPTX exports remain in the Export menu.

DSL Editor

Open Edit Graph and choose Dock left or Undock to switch between a left panel and floating editor. Drag the dock's right edge or floating editor's bottom-left handle to resize. The canvas resizes and stays interactive; closing a dock releases its space. Docking is a browser preference, independent of scenarios. Apply keeps the editor open; Apply & Close closes it. Cancel discards the draft. Invalid DSL never replaces the live graph.

X-Axis Layout

Position nodes horizontally using a numeric or datetime attribute for a timeline or quantitative view.

  1. In Settings, set X-Axis Attribute to the node attribute to use, such as day.
  2. Select Int, Float, or Datetime. For Datetime, also set the date format.
  3. Click Re-layout. The dialog shows the matching node count and value range.
  4. Choose Screen widths for full range and click Apply Layout.

Nodes without that attribute are laid out in a separate column to the right. The layout respects Snap Grid.

X-Axis Layout dialog for the day attribute and the resulting Plan, Build, and Launch timeline
Nodes on days 1, 5, and 12 are spaced proportionally after applying the layout. Click to view full size.

Light & Dark Theme

Toggle between light and dark color schemes using the πŸŒ™ Theme / β˜€οΈ Theme button in the toolbar. The theme affects the entire UI including the canvas background, nodes, flows, toolbar, panels, and minimap.

The same request and batch pipeline shown side by side in light and dark themes
Switch themes without changing the graph. Click to view full size.

Minimap

A minimap is displayed in the bottom-left corner of the canvas. It shows:

Zoomed graph canvas and a detail of the minimap showing the blue viewport rectangle
The minimap keeps the whole graph visible while you zoom into a region. Click to view full size.

Snap Grid

Enable Snap Grid in the Settings dropdown to activate a visible grid and snap node positions to a 20px grid. This helps create neatly aligned layouts.

Request and batch pipeline nodes aligned on the visible snap grid
Enable Snap Grid in Settings for 20px alignment. Click to view full size.

Controls Reference

Action Input
Pan canvasClick + drag on empty space
Zoom in / outMouse wheel, or + / βˆ’ toolbar buttons
Fit to viewToolbar Fit button
Select node or flowClick
Multi-selectCtrl + Click
Move nodeClick + drag node
Move multi-selectedDrag any selected node (all move together)
Expand / CollapseDouble-click container node
Deselect allEsc
Close DSL editorEsc
Navigate via minimapClick / drag on minimap

Full DSL Example

Here's a comprehensive example combining all DSL features:

DSL β€” Complete Example
# ─── Hierarchy ───
API & Auth > Gateway
Users & Orders & Payments > Services
Postgres & Redis > DataLayer
Kafka & S3 > Messaging

# ─── Flows ───
Traffic{status=live, label="HTTP Traffic"}= Client --> API --> Auth

UserFlow= Auth --> Users --> Postgres
OrderFlow= Auth --> Orders --> Postgres
PayFlow= Orders --> Payments

_{mode=batch, label="Events"}= Services --> Kafka --> S3

Cache= Users & Orders --> Redis
Monitoring --> Gateway & Services & DataLayer

# ─── Node Attributes ───
Client{label="Web Client", status=live}
Gateway{label="API Gateway", status=live}
Services{label="Microservices", status=live}
DataLayer{label="Data Layer", status=live}
Messaging{label="Message Bus", status=inprogress}
Monitoring{label="Monitoring", color=9b59b6}
Full DSL example rendered as a graph with services and data flows
Full Example Graph. Click to view full size.

Status Colors Reference

Node Status Colors

Status ValueColorHex
live Blue#2196F3
inprogress Green#4CAF50
tostart Amber#FFC107

Flow Status Colors

Status ValueColorHex
live Green#4CAF50
inprogress Yellow#FFD54F
tostart Tan#C8A96E

Flow Modes

Mode Attribute Animation Style Use Case
Stream (default β€” no mode attribute) Small moving dashes along center line Real-time event streams, API calls
Batch mode=batch Wide block segments filling the ribbon ETL jobs, file transfers, batch processing
DSL β€” Comparing Modes
# Streaming (default)
Live= SensorA --> Aggregator

# Batch processing
Nightly{mode=batch, label="Nightly Sync"}= DB --> Warehouse

Toolbar Reference

Button / Control Description
πŸ“‚ ScenarioExpandable dropdown for managing scenarios (new, rename, duplicate, delete).
πŸŒ™ / β˜€οΈ ThemeToggle between light and dark color scheme.
+ / βˆ’Zoom in / out from center.
FitZoom and pan to fit the entire graph in view.
βš™οΈ SettingsExpandable dropdown: Snap Grid, Speed, Highlight Connections.
FilterText input to filter/highlight matching nodes and flows.
✏️ Edit GraphOpens the DSL modal editor for direct text editing.
Re-layoutResets node positions to the automatic left-to-right layout.
Collapse AllCollapses all expanded container nodes.
πŸ“„ DocLinks to this documentation page.
β˜• Buy me a coffeeSupport link.

Hierarchy Flow Visualiser (Crow Flow) β€” Built with vanilla HTML, CSS & JavaScript. No external dependencies.
© 2025–2026