Node Design Research
Living reference for the Graphyn node card design. Updated as new editors are studied.
Design axes
| Axis | Options |
|---|---|
| Size | Fixed · Content-driven · Icon-only |
| Port visibility | Always visible · Hover only · Inspector only |
| Inline config | None · Read-only preview · Editable controls |
| Type encoding | None · Accent colour · Port dot colour · Header colour |
| Connection model | Port-to-port labels · Positional (top/bottom/left/right) |
Visual comparison
Editor survey
n8n (2 modes)
Detailed card (agent nodes — Meeting Availability Agent, Generate Message) - Fixed wide card, icon + title + subtitle in header - No port names on canvas — connections attach to fixed left/right anchors - Sub-nodes attach below as small circles (Model, Availability, Output) - Config lives entirely in the inspector side panel
Monolithic circle (sub-nodes — Model, Availability, Output) - 48–56 px circle, icon only - Label + 1-line config summary below the circle - Connection dots on left/right of circle - Best for nodes with 1-in / 1-out fixed arity
Verdict: Two separate components, not a flag on one. Works because n8n has a strict two-tier node hierarchy.
Blender Geometry Nodes (studied 2026-06-18)
- Rectangle with coloured title bar (category colour)
- Port dots on left (inputs) and right (outputs) — always visible
- Port names printed next to each dot
- Inline editable controls directly on the node (number fields, dropdowns, toggles)
- Node width is content-driven — expands to fit the widest field
- Port dot colour encodes data type (green = geometry, teal = vector, grey = float, purple = boolean)
- No separate inspector — everything configurable on the canvas
- Collapsed mode: hides all ports except connections in use
Verdict: The richest data-type system of any editor studied. Port colour is load-bearing — users learn it fast. Inline controls reduce inspector round-trips but create very tall nodes on complex graphs.
ComfyUI (studied 2026-06-18)
- Rectangle with solid coloured header (dark, category-coded)
- Port dots left (inputs) / right (outputs) — always visible with labels
- Some inputs render as inline widgets (sliders, text boxes, dropdowns) when no connection is attached — widget disappears when a wire is connected
- Node width is fixed per type, height is content-driven
- Port dot colour encodes data type: latent = purple, image = green, conditioning = orange, model = blue, clip = yellow, vae = pink
- No inspector panel — the node IS the config surface
- Nodes can be grouped / framed with a coloured annotation box
Verdict: The "inline widget that disappears on connect" pattern is excellent UX — it makes the node self-documenting and eliminates the inspector entirely for simple configs. The colour-coded port system is the clearest studied.
ReactFlow / XYFlow (studied 2026-06-18)
- React library, not a standalone tool — the canvas is just a React component
- Port dots (called "handles") on any edge (top, bottom, left, right) — developer chooses
- Each node is a completely custom React component registered by type string — you own every pixel
- No built-in type colour system; type safety and visual encoding are the developer's responsibility
- Very popular in open-source tooling (Windsurf, Retool, many AI workflow UIs)
- Light theme by default; dark mode requires manual CSS override
Verdict: The most flexible framework studied. Its strength — arbitrary React components — is also its weakness for Graphyn: we need a Kotlin/Compose equivalent, not web. The key insight is its NodeCanvasFactory pattern: per-type canvas render function registered at setup time.
Node-RED (studied 2026-06-18)
- IBM's open-source IoT/automation flow editor
- Nodes are simple rectangles with a category colour header and a single config label
- Single connection point on left (input) and right (output) — no named ports
- All config lives in a separate drawer panel
- Extremely approachable for non-developers; used in home-automation and simple ETL
- No type colour, no inline widgets, no multi-port named connections
Verdict: Too simple for Graphyn's typed graph model. Not suitable when nodes have multiple named ports with different types. Useful reference only for the "category colour = identity" pattern used in the header.
LiteGraph.js (studied 2026-06-18)
- The canvas engine powering ComfyUI under the hood
- Canvas-drawn (not DOM) — extremely high performance with hundreds of nodes
- Port type colour system: each type gets a registered colour; incompatible ports refuse connection
- Inline widget support: sliders, combos, text inputs rendered directly on the canvas
- Nodes are registered by type string with a constructor; full canvas customization available
- Collapse mode built-in; nodes shrink to title bar only
Verdict: Confirms that ComfyUI's UX quality is not an accident — it is built on a well-designed typed canvas engine. The port type registry and inline widget patterns are battle-tested at scale.
Graphyn current design (as of 0.1.0)
- Fixed 280×180 card
- Left accent bar (single colour, not category-coded)
- Header: label + node ID
- Port columns: input names left, output names right (text badges, no dots on edges)
- Footer: live output preview + "Connecting…" hint
- Execution status badge top-right
- Config: inspector panel only
Gaps identified vs. studied editors: 1. Port dots are not on the card edge — connections must snap to card bounds, not named ports 2. No port type colour encoding 3. No inline widget support (config always requires inspector) 4. Fixed size means tall-port nodes clip or waste space 5. No collapsed / compact mode
Recommendations backlog
| Priority | Change | Reference |
|---|---|---|
| High | Move port dots to card edges (left for inputs, right for outputs) | Blender, ComfyUI, LiteGraph |
| High | Colour-code port dots by WorkflowType |
ComfyUI, LiteGraph |
| High | Add NodeCanvasFactory to editor-api for per-type canvas customization |
ReactFlow pattern |
| High | Add icon, category, color, compact fields to NodeSpec |
All editors |
| Medium | Content-driven card height (min 80 dp, grows with port count) | Blender, ComfyUI |
| Medium | Add compact: Boolean to NodeSpec → render icon-circle variant |
n8n sub-nodes |
| Medium | Inline widget for unconnected scalar inputs (WorkflowType.NumberType, StringType) |
ComfyUI, LiteGraph |
| Low | Category colour on header bar instead of single accent | Blender, Node-RED |
| Low | Collapsed mode (hides unconnected ports) | Blender, LiteGraph |