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.
Screenshot of the app interface

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}
Screenshot of the quick start example graph

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. Lines are processed top-to-bottom. Blank lines and whitespace are ignored.

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
Screenshot of the hierarchy example graph
πŸ’‘ 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
Screenshot of the flow connections example graph

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
Screenshot of the multi-path flows example graph

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
πŸ–ΌοΈ
Screenshot: Canvas Interaction
Replace with a screenshot or GIF showing pan, zoom, and node drag interactions

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.
πŸ–ΌοΈ
Screenshot: Expand & Collapse
Replace with a side-by-side screenshot showing a container collapsed vs. expanded, with child nodes visible inside

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
ETL{mode=batch}= Database --> ETL --> Warehouse

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

πŸ–ΌοΈ
Screenshot: Flow Animation Modes
Replace with side-by-side screenshots showing streaming vs. batch animation styles

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.

πŸ–ΌοΈ
Screenshot: Flow Merging
Replace with a screenshot showing merged thick flow ribbons between collapsed containers, and separated flows after expanding

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.
πŸ–ΌοΈ
Screenshot: Properties Panel
Replace with a screenshot showing the side panel with attributes, color picker, and add/remove buttons

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
    
πŸ–ΌοΈ
Screenshot: Status Colors
Replace with a screenshot showing nodes and flows colored by live, inprogress, and tostart statuses

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
πŸ–ΌοΈ
Screenshot: Filtering
Replace with a screenshot showing the filter field with a query and dimmed non-matching nodes

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.

πŸ–ΌοΈ
Screenshot: Highlight Connections
Replace with a screenshot showing a selected node with its upstream/downstream connections highlighted

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.

Scenario actions (available in the Scenario dropdown in the toolbar):

Action Description
οΌ‹ NewCreate a new empty scenario with a custom name.
✏️ EditRename the current scenario.
⧉ DupDuplicate the current scenario (DSL + positions) with "(copy)" suffix.
πŸ—‘οΈ DelDelete the current scenario (at least one must remain).
SwitchSelect a different scenario from the dropdown.
πŸ’‘ Tip
Scenarios auto-save to browser storage every 5 seconds and on page unload. Cloud sync to the server only occurs when the graph definition is changed (e.g. via Apply or Close & Apply).
πŸ–ΌοΈ
Screenshot: Scenario Dropdown
Replace with a screenshot showing the expanded scenario dropdown with options

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.

πŸ–ΌοΈ
Screenshot: Light vs. Dark Theme
Replace with side-by-side screenshots showing the same graph in light and dark themes

Minimap

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

πŸ–ΌοΈ
Screenshot: Minimap
Replace with a screenshot showing the minimap with node outlines and viewport rectangle

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.

πŸ–ΌοΈ
Screenshot: Snap Grid
Replace with a screenshot showing the canvas with grid lines visible and nodes aligned

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 Example Graph

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