19 KiB
Network Diagram Editor — Draw.io-Style Implementation Document
Date: 2026-04-13
Status: Proposed
Audience: Product, frontend, backend, and agentic workers
Goal: Build a production-grade network diagram editor inside ResolutionFlow that feels close to draw.io while staying MSP- and topology-focused.
Executive Summary
ResolutionFlow should implement network diagrams as a first-class editor surface, not as a lightweight canvas utility. The right target is not "clone draw.io exactly," but "deliver draw.io-grade editing quality for MSP network topology work."
The recommended path is:
- Use the existing network-diagram branch architecture as the foundation
- Ship the already-proven CRUD/editor shell as Phase 1
- Invest the next phases in interaction quality, editor commands, and interoperability
- Keep a ResolutionFlow-native JSON schema as the source of truth
- Add draw.io compatibility at import/export boundaries, not at the storage layer
This preserves delivery speed while giving the product room to grow into a robust diagramming tool.
Product Goal
Build a network diagram creation tool that:
- Feels familiar to users who already know draw.io
- Supports MSP workflows better than a generic diagramming app
- Makes manual editing fast and safe
- Supports AI-assisted generation and clean-up without depending on AI for correctness
- Fits ResolutionFlow's existing frontend/backend architecture cleanly
Success is not measured by raw feature count alone. Success means a user can open the editor and confidently:
- Create a clean network map from scratch
- Drag devices from a stencil palette onto a canvas
- Connect, label, group, align, copy, duplicate, and organize elements quickly
- Save and revisit diagrams safely
- Export the result for documentation and client communication
Existing Repo Context
ResolutionFlow already has strong signals for this direction:
- The main architecture is React 19 + Vite + TypeScript on the frontend, FastAPI + PostgreSQL on the backend.
- There are existing design and plan docs for network diagrams:
docs/superpowers/specs/2026-04-04-react-flow-ui-network-diagrams-design.mddocs/superpowers/specs/2026-04-04-network-diagram-ux-improvements-design.mddocs/superpowers/plans/2026-04-04-react-flow-ui-network-diagrams.mddocs/superpowers/plans/2026-04-04-network-diagram-ux-improvements.md
- Git history shows a substantial prior implementation on
feat/network-map-builder-prod.
That branch already included:
- Backend model, schema, migration, API routes, and AI generation service
- Frontend list page and editor page
- React Flow-based canvas
- Device registry and custom node types
- Context menu, copy/paste/duplicate shortcuts, and drag/drop improvements
- Inspector/properties panel
- Import/export JSON
This is important: the best implementation path is to revive and harden that architecture, not to invent a parallel one.
Non-Goals
The first implementation should not try to become a full whiteboard platform.
Out of scope for the initial milestone:
- Real-time multiplayer collaboration
- Comments/presence/cursors
- Arbitrary slide decks or presentation features
- BPMN/UML/general enterprise diagram libraries
- Full draw.io parity on day one
- Replacing ResolutionFlow's tree editor architecture
The editor should stay focused on network topology and MSP documentation use cases.
User Experience Target
The editor should feel close to draw.io in the following ways:
- Fast drag/drop from a left stencil panel
- Predictable selection behavior
- Context menus and keyboard shortcuts
- Snap-to-grid and alignment affordances
- Resizable groups and containers
- Good edge routing options
- Easy text and label editing
- Familiar import/export workflows
The editor should exceed draw.io in MSP-specific workflows:
- Device types that reflect real client environments
- AI-generated starting diagrams from text descriptions
- Client and asset metadata
- Future hooks into PSA, assets, tickets, and documentation
Recommended Architecture
Frontend
Use a dedicated feature area:
frontend/src/pages/NetworkDiagrams/frontend/src/components/network/frontend/src/api/networkDiagrams.tsfrontend/src/types/network-diagram.ts
Use React Flow as the canvas/rendering engine.
Why React Flow:
- Already used conceptually in the codebase
- Strong node/edge rendering model
- Good selection/dragging/viewport primitives
- Enough flexibility for custom nodes, groups, and edge styles
- Faster path to production than building custom canvas behavior from scratch
Backend
Use a document-style data model stored in PostgreSQL JSONB:
network_diagramstable- JSONB
nodes - JSONB
edges - Metadata columns for account scoping, names, timestamps, archive state
Why document storage:
- Flexible schema evolution
- Fast implementation
- Simple import/export
- Easy autosave
- Works well with editor-state persistence
Source of Truth
Use a ResolutionFlow-native schema as the system of record.
Do not store draw.io XML as the primary database format.
Instead:
- Store native JSON internally
- Import from draw.io into native JSON
- Export native JSON to draw.io-compatible XML when needed
This keeps the application decoupled from an external vendor format.
Recommended File Layout
Frontend
-
frontend/src/pages/NetworkDiagrams/index.tsx- Diagram list page
-
frontend/src/pages/NetworkDiagrams/DiagramEditor.tsx- Editor orchestration layer
-
frontend/src/components/network/NetworkCanvas.tsx- React Flow wrapper and viewport surface
-
frontend/src/components/network/DiagramHeader.tsx- Save state, title, metadata actions, export/import controls
-
frontend/src/components/network/ContextMenu.tsx- Node/canvas context menus
-
frontend/src/components/network/CanvasEmptyPrompt.tsx- Empty-state guidance
-
frontend/src/components/network/panels/DeviceToolbar.tsx- Stencil palette and searchable device library
-
frontend/src/components/network/panels/PropertiesPanel.tsx- Inspector for node/edge editing
-
frontend/src/components/network/panels/AIAssistPanel.tsx- AI generate/merge UX
-
frontend/src/components/network/hooks/useCanvasShortcuts.ts- Keyboard shortcuts and clipboard behavior
-
frontend/src/components/network/hooks/useDiagramCommands.ts- Shared command layer for actions invoked by keyboard, menus, and toolbar
-
frontend/src/components/network/nodes/*- Node components, registry, types, and render configuration
-
frontend/src/components/network/edges/*- Edge components and routing styles
-
frontend/src/api/networkDiagrams.ts- CRUD, import/export, AI generation, duplication
-
frontend/src/types/network-diagram.ts- Shared client-side typing
Backend
-
backend/app/models/network_diagram.py- SQLAlchemy model
-
backend/app/schemas/network_diagram.py- Pydantic request/response models
-
backend/app/api/endpoints/network_diagrams.py- CRUD + import/export + AI routes
-
backend/app/services/network_diagram_ai_service.py- AI generation and later AI clean-up/layout assistance
-
backend/alembic/versions/074_add_network_diagrams_table.py- Initial schema migration
-
backend/app/models/network_diagram_version.py- Later addition for version history
-
backend/app/api/endpoints/network_diagram_versions.py- Later addition for restore/history flows
Data Model
V1 Database Model
The existing JSONB storage pattern is good for a first release:
idaccount_idnameclient_nameasset_namedescriptionnodesJSONBedgesJSONBthumbnail_urlis_archivedcreated_bycreated_atupdated_at
Recommended Node Schema
Use a richer internal node shape than a minimal device-only object. The schema should be resilient enough to support future features without painful migration.
Recommended fields:
idkinddevice | group | text | shape | image
type- device slug or shape subtype
labelpositionsizerotationzIndexparentIdportsstyledata
Examples:
kind=device,type=routerkind=group,type=subnetkind=text,type=label
Recommended Edge Schema
idsourcetargetsourcePorttargetPortlabelroutingstraight | step | orthogonal | curved
waypointsstyledata
Why This Matters
The prior branch stored a solid but fairly lean DiagramNode/DiagramEdge. That is enough to start, but draw.io-like editing will need more than just position, label, and connectionType.
If we adopt the richer shape early, we reduce future rework in:
- manual bend-point support
- z-ordering
- groups/containers
- text/shape nodes
- port-specific connections
Editor State Model
The editor should be built around four distinct layers of state:
1. Persisted Diagram State
What is saved to the backend:
- nodes
- edges
- metadata
2. Editor UI State
What lives only in the browser while editing:
- selected node IDs
- selected edge IDs
- open context menu
- active tool
- inspector visibility
- drag-over state
- clipboard reference
3. Derived View State
- filtered palette items
- current selection bounds
- whether paste is available
- whether align/distribute commands are valid
4. History State
- undo stack
- redo stack
- last autosave timestamp
The editor page should orchestrate these, but command logic should not be scattered across component trees.
Command System
To make the tool feel like draw.io, add a shared command layer.
Recommended hook:
frontend/src/components/network/hooks/useDiagramCommands.ts
This hook should expose commands like:
copySelectionpasteSelectionduplicateSelectiondeleteSelectionselectAllfitViewbringToFrontsendToBackalignLeftalignCenteralignRightalignTopalignMiddlealignBottomdistributeHorizontallydistributeVerticallygroupSelectionungroupSelectionlockSelectionunlockSelection
All of the following should call the same command functions:
- keyboard shortcuts
- toolbar buttons
- context menu items
- future command palette entries
This avoids duplicate logic and keeps behavior consistent.
Phase-by-Phase Delivery Plan
Phase 1 — Foundation MVP
Objective
Ship a usable network diagram editor quickly using the existing branch shape.
Scope
- Diagram list page
- Create/edit/archive/duplicate
- React Flow canvas
- Searchable device palette
- Device and group nodes
- Edge creation
- Properties panel
- Save + autosave
- Import/export ResolutionFlow JSON
- Basic AI generation from natural language
- Context menu
- Keyboard shortcuts:
- copy
- paste
- duplicate
- select all
- fit view
- delete
Frontend Work
- Restore
NetworkDiagramspage routes and navigation - Restore
DiagramEditor - Restore
NetworkCanvas - Restore node/edge registries
- Restore clipboard + context menu behavior
- Add command-layer extraction if time allows
Backend Work
- Restore migration, model, schemas, endpoints
- Validate account scoping and tenant isolation
- Restore import/export endpoint
- Restore AI generate endpoint
Acceptance Criteria
- User can create and save a network map
- User can reopen it later
- User can drag devices from palette onto canvas
- User can connect nodes and label links
- User can copy/paste/duplicate/delete
- User can import/export JSON
- User can generate a starter diagram from text
Phase 2 — Draw.io-Grade Editing Quality
Objective
Close the biggest UX gap between a basic node editor and a real diagramming tool.
Scope
- Snap-to-guides in addition to snap-to-grid
- Alignment commands
- Distribution commands
- Multi-select improvements
- Better z-order handling
- Inline text editing
- Better group/container behavior
- Rich edge routing choices
- Manual bend points
- Port-aware connection handling
- Keyboard nudging and modifier behavior
New/Expanded Files
hooks/useDiagramCommands.tshooks/useSelectionBounds.tscomponents/network/guides/*components/network/edges/*
Acceptance Criteria
- Multi-select editing feels reliable
- Align/distribute work predictably
- User can produce a polished topology without fighting the canvas
- Connectors can be shaped intentionally rather than only auto-routed
Phase 3 — Interoperability and Export
Objective
Let the editor fit real customer and internal documentation workflows.
Scope
- SVG export
- PNG export
- PDF export
- Thumbnail generation
- Draw.io XML import
- Draw.io XML export
Implementation Notes
Do not try to mirror every draw.io primitive internally.
Instead:
- Build a compatible subset for network maps
- Translate supported draw.io elements into native nodes/edges/groups/text
- Emit supported native diagrams back into draw.io XML
- Warn on unsupported constructs during import
Acceptance Criteria
- A diagram can be exported for customer-facing documentation
- A supported draw.io network map can be imported into ResolutionFlow
- Users can move work between tools without losing essential topology content
Phase 4 — ResolutionFlow-Native Differentiation
Objective
Make this better than a generic diagram editor for MSP use cases.
Scope
- AI merge into existing topology
- AI tidy-up / auto-layout refinement
- Asset-aware device metadata
- Client templates
- Common MSP topology starter kits
- Diagram-to-ticket or diagram-to-flow linking
- Version history and restore
Acceptance Criteria
- AI helps users start faster and clean up faster
- Diagrams connect to the rest of the ResolutionFlow product
- Version history reduces fear of experimentation
Draw.io Parity Matrix
| Capability | Priority | Notes |
|---|---|---|
| Drag/drop stencil palette | P0 | Must feel immediate and stable |
| Node resize/move/select | P0 | Core editor behavior |
| Edge creation and labeling | P0 | Core topology use case |
| Copy/paste/duplicate/delete | P0 | Expected baseline |
| Context menu + keyboard shortcuts | P0 | Must be fast and familiar |
| Snap-to-grid | P0 | Already supported directionally |
| Align/distribute | P1 | Big usability leap |
| Grouping/containers | P1 | Important for subnets, rooms, racks |
| Edge routing modes | P1 | Necessary for professional-looking diagrams |
| Inline text editing | P1 | Draw.io expectation |
| Layers/lock/hide | P2 | Useful once diagrams get large |
| Draw.io import/export | P2 | Important for migration and adoption |
| Realtime collaboration | P3 | Valuable, but not early priority |
Risks and Mitigations
Risk: Editor complexity balloons too quickly
Mitigation
- Keep the MVP narrow
- Use phased delivery
- Center everything around the command layer
Risk: React Flow abstraction limits parity
Mitigation
- Validate manual bend points, grouping, and selection ergonomics early
- If a specific advanced behavior is awkward, implement it in a focused extension layer instead of abandoning React Flow entirely
Risk: Import/export compatibility becomes a trap
Mitigation
- Support a documented subset of draw.io semantics
- Keep native JSON as the canonical internal model
- Warn clearly on unsupported import constructs
Risk: AI-generated diagrams feel impressive but unreliable
Mitigation
- Treat AI output as a starting point only
- Keep editing UX first-class
- Make merge mode explicit and safe
Risk: Users lose work through autosave/history gaps
Mitigation
- Add diagram versioning soon after MVP
- Preserve a local dirty-state guard
- Add explicit "saved at" feedback
Versioning Recommendation
Version history should be planned early, even if shipped after the MVP.
Recommended table:
network_diagram_versionsiddiagram_idaccount_idsnapshotJSONBcreated_bylabelcreated_at
Recommended triggers for version creation:
- explicit "Save Version"
- before destructive import-replace
- before AI replace mode
- optionally every N minutes when dirty changes are substantial
This is one of the highest-leverage additions for user trust.
Testing Strategy
Frontend
- Unit-test command logic
- Unit-test serialization/deserialization
- Component-test context menu and shortcut behavior
- E2E test core editor flows:
- create diagram
- drag node
- connect nodes
- save and reload
- copy/paste
- import/export
Backend
- API tests for CRUD
- API tests for tenant isolation
- API tests for import/export validation
- API tests for duplicate/archive
- AI endpoint tests with mocked provider output
Manual QA
Required flows:
- New blank diagram
- Existing diagram edit
- Large diagram performance
- Multi-select behavior
- Keyboard shortcut guard behavior while inputs are focused
- Import malformed JSON
- AI merge into populated canvas
Suggested Delivery Order
Slice 1
- Restore backend migration/model/schema/router
- Restore types and API client
- Restore list page
Slice 2
- Restore editor shell and canvas
- Restore nodes, edges, palette, save/load
Slice 3
- Restore context menu, clipboard, shortcuts, inspector
- Validate dirty-state and autosave behavior
Slice 4
- Restore AI generation and merge mode
- Tighten import/export UX
Slice 5
- Implement command layer
- Add align/distribute/z-order polish
Slice 6
- Add version history
- Add export polish and thumbnails
Slice 7
- Add draw.io XML import/export subset
Recommended Immediate Next Step
The best immediate implementation move is:
- Rebase or selectively port
feat/network-map-builder-prodinto the current codebase - Use that as the Phase 1 foundation
- Do not start by rewriting the editor architecture
That approach is faster, lower risk, and already aligned with the repo's documented direction.
Worker Notes
If agentic workers implement this plan, they should:
- Reuse the existing network-diagram branch structure where possible
- Avoid introducing a second diagram architecture
- Keep native JSON as the canonical schema
- Treat command centralization as a priority, not an afterthought
- Ship MVP behavior first, then polish toward draw.io parity in focused slices
Summary
ResolutionFlow can support a draw.io-like network diagram editor without fighting its current stack. The prior network-diagram branch already proves the right foundation:
- React Flow canvas
- FastAPI CRUD
- JSONB persistence
- device registry
- AI assist
- context menus
- keyboard shortcuts
- import/export
The real work now is not deciding whether to build it. The real work is:
- restoring that foundation cleanly,
- formalizing the internal schema,
- adding a reusable command system,
- and iterating on the editor interactions until the experience feels professional.
That path gives ResolutionFlow a practical, high-value network topology tool quickly, while preserving a credible route to near-draw.io quality over the next phases.