# 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:

1. **Use the existing network-diagram branch architecture as the foundation**
2. **Ship the already-proven CRUD/editor shell as Phase 1**
3. **Invest the next phases in interaction quality, editor commands, and interoperability**
4. **Keep a ResolutionFlow-native JSON schema as the source of truth**
5. **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.md`
  - `docs/superpowers/specs/2026-04-04-network-diagram-ux-improvements-design.md`
  - `docs/superpowers/plans/2026-04-04-react-flow-ui-network-diagrams.md`
  - `docs/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.ts`
- `frontend/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_diagrams` table
- 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:

- `id`
- `account_id`
- `name`
- `client_name`
- `asset_name`
- `description`
- `nodes` JSONB
- `edges` JSONB
- `thumbnail_url`
- `is_archived`
- `created_by`
- `created_at`
- `updated_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:

- `id`
- `kind`
  - `device | group | text | shape | image`
- `type`
  - device slug or shape subtype
- `label`
- `position`
- `size`
- `rotation`
- `zIndex`
- `parentId`
- `ports`
- `style`
- `data`

Examples:

- `kind=device`, `type=router`
- `kind=group`, `type=subnet`
- `kind=text`, `type=label`

### Recommended Edge Schema

- `id`
- `source`
- `target`
- `sourcePort`
- `targetPort`
- `label`
- `routing`
  - `straight | step | orthogonal | curved`
- `waypoints`
- `style`
- `data`

### 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:

- `copySelection`
- `pasteSelection`
- `duplicateSelection`
- `deleteSelection`
- `selectAll`
- `fitView`
- `bringToFront`
- `sendToBack`
- `alignLeft`
- `alignCenter`
- `alignRight`
- `alignTop`
- `alignMiddle`
- `alignBottom`
- `distributeHorizontally`
- `distributeVertically`
- `groupSelection`
- `ungroupSelection`
- `lockSelection`
- `unlockSelection`

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 `NetworkDiagrams` page 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.ts`
- `hooks/useSelectionBounds.ts`
- `components/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_versions`
  - `id`
  - `diagram_id`
  - `account_id`
  - `snapshot` JSONB
  - `created_by`
  - `label`
  - `created_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:

1. **Rebase or selectively port `feat/network-map-builder-prod` into the current codebase**
2. **Use that as the Phase 1 foundation**
3. **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.
