Azure Blueprints
A VS Code extension that provides a node-based graph editor for Azure DevOps YAML pipelines — like Unreal Engine Blueprints, but for CI/CD.
Open any .yml / .yaml pipeline file with the Azure Blueprints custom editor and see your pipeline as an interactive visual graph. All edits sync bi-directionally with the raw YAML, and YAML comments are preserved on every save.
Features
Visual Graph Editor
- Node canvas — Infinite pan/zoom canvas (
#1e1e1e background, dot grid). Space+drag to pan, scroll to zoom, Delete to remove selected nodes/edges.
- Node types — Trigger, Stage, Job, Task, Script, Bash, PowerShell, Checkout, Publish Artifact, Download Artifact, Template.
- Per-kind colour coding — Each node type has a distinct header strip and border colour (trigger: purple, stage: azure, job: green, task: orange-red, scripts: purple, template: dashed violet, etc.).
- Edge types — Structural edges (blue dashed,
#0078d4) connect trigger→stage→job→task. Dependency edges (amber dashed, #f5a623) represent dependsOn relationships between stages/jobs.
- Edge legend — Bottom-left overlay shows Structural vs Dependency line styles.
- MiniMap — 164×96 dark minimap (
rgba(20,20,20,0.92)) in the bottom-right corner with per-kind node colour mapping.
- App header (40px,
#252526) with icon, title, separator, filename/breadcrumb trail, hint text, and a Save YAML button (amber accent).
- YAML export modal — clicking Save YAML opens a centred modal with the current pipeline YAML, a Copy to Clipboard button, and a
slideUp entry animation.
- Toast notifications — brief bottom-right slide-in toasts (auto-dismiss after 2.8s) confirm node insertion actions.
Left Palette Panel
- 210px searchable sidebar showing all node types grouped by category (Structure, Steps, Advanced).
- Click any item to insert a new node of that type into the current graph.
Properties Panel
- 272px right-side panel that shows the full property form for the currently selected node.
- Editable fields for every property of every node type (display name, pool, condition, dependsOn, task inputs, trigger filters, cron schedule, etc.).
- Delete Node button in the panel footer (danger red
#f85149) removes the selected node and its edges.
- YAML preview rendered in monospaced
#1a1a1a code block.
- Right-click empty canvas — if no trigger exists: shows trigger type picker. Otherwise: shows task search menu (195px, dark
#2d2d30, grouped header).
- Drag edge from job to empty space — shows an edge-drop menu to create a new Job or Task node, pre-wired.
- Drag edge from stage to empty space — shows edge-drop menu to create a new Stage (with
dependsOn set).
- Right-click template node — Expand template inline / Collapse back to template.
Template Support
- Template navigation — double-click a template node to navigate into the referenced
.yaml template file. A breadcrumb trail in the header allows navigation back.
- Inline expansion — expand a template node to see its internal nodes and edges directly in the canvas. Expanded nodes are shown with a dashed purple border and a
⇒ <path> badge.
- Inline collapse — right-click any expanded node to collapse the sub-graph back to the template placeholder.
- All YAML comments are preserved when saving from the graph editor. The extension host uses a comment-aware YAML merge (
yaml v2 library) that matches map keys by identity and merges changes while keeping all # … annotations intact.
Keyboard Shortcuts
| Key |
Action |
Delete |
Delete selected node(s) or edge(s) |
Space + Drag |
Pan the canvas |
Scroll |
Zoom in/out |
Right-click canvas |
Open context menu |
Escape |
Close context menus / Properties panel |
↑ ↓ |
Navigate context menu items |
Enter |
Confirm context menu selection |
Architecture
| Layer |
Technology |
| VS Code Extension host |
TypeScript, CustomTextEditorProvider |
| Webview UI |
React 18, ReactFlow 11, TypeScript |
| YAML parsing (webview) |
js-yaml 4.x |
| YAML comment preservation (host) |
yaml v2 (AST-level merge) |
| Bundler |
Webpack 5 (dual target: Node.js extension + web webview) |
| Tests |
Jest + ts-jest (299 tests) |
| Auth / Task catalog |
Azure DevOps REST API, VS Code Microsoft OAuth |
Key files
| File |
Purpose |
src/PipelineEditorProvider.ts |
Custom text editor provider; routes messages, writes YAML |
src/yamlCommentPreserver.ts |
Comment-preserving YAML merge |
webview-ui/src/App.tsx |
Top-level React component; state, message routing, layout |
webview-ui/src/pipelineConverter.ts |
YAML ↔ ReactFlow graph conversion |
webview-ui/src/components/PipelineGraph.tsx |
ReactFlow canvas, edge/node event handlers |
webview-ui/src/components/PalettePanel.tsx |
Left sidebar node palette |
webview-ui/src/components/panels/PropertiesPanel.tsx |
Right-side node property editor |
webview-ui/src/components/ContextTaskMenu.tsx |
Floating task-search context menu |
webview-ui/src/components/YamlModal.tsx |
YAML export modal |
webview-ui/src/components/Toast.tsx |
Slide-in toast notification |
Development
# Install dependencies
npm install
# Run tests (299 tests)
npm test
# Build both extension + webview bundles
npm run build
# Watch mode (rebuilds on save)
npm run watch
Press F5 in VS Code to launch the Extension Development Host.
Design Tokens
The UI is built on a consistent set of CSS custom properties defined in App.css:
| Token |
Value |
Usage |
--bg-canvas |
#1e1e1e |
Graph canvas background |
--bg-panel |
#252526 |
Sidebar / panel backgrounds |
--bg-panel-hover |
#2d2d30 |
Context menu background |
--bg-input |
#3c3c3c |
Input fields |
--bg-code |
#1a1a1a |
YAML preview blocks |
--accent-azure |
#0078d4 |
Primary accent (structural edges, focus) |
--accent-amber |
#f5a623 |
Save button, dependency edges |
--kind-trigger |
#5555cc |
Trigger node border/handle |
--kind-stage |
#0078d4 |
Stage node border/handle |
--kind-job |
#107c10 |
Job node border/handle |
--kind-task |
#d83b01 |
Task node border/handle |
--kind-script |
#8a2be2 |
Script/Bash/PowerShell border/handle |
--kind-template |
#6e4fb3 |
Template node border/handle |
| |