GregOrigin - BlueLine: Smart Tagging & Node Alignment

Watch it in action

Read the manual

BlueLine is a lightweight, modular C++ plugin for Unreal Engine 5 designed to solve three specific problems in professional development workflows:

  1. Graph Readability: Replaces messy Bezier "noodles" with clean, 90-degree orthogonal wiring without the performance cost of A* pathfinding.

  2. Team Collaboration: Provides "Soft Formatting" tools that align nodes without reorganizing the entire graph, preventing massive Git/Perforce diffs.

  3. Data Visualization: Transforms standard Gameplay Tags in the Details Panel into colored, readable chips, synchronized across the entire team via Data Assets.

🔌 Graph Enhancements

BlueLine replaces the standard graph rendering pipeline with a high-performance "Manhattan" style renderer.

1. Manhattan Wiring
  • Orthogonal Routing: Wires turn at 90-degree angles.

  • Ghost Wires: Wires passing behind nodes are automatically rendered with reduced opacity (35%) to reduce visual noise.

  • Performance: Uses simple geometric heuristics instead of pathfinding, ensuring zero input lag even in massive Animation Blueprints.

2. "Soft Magnet" Formatting (Shift + Q)

Unlike other auto-formatters that rearrange your entire graph (destroying your specific layout), BlueLine uses a Selection-Only approach.

  • Usage: Select a group of nodes and press Shift + Q.

  • Behavior: Nodes align grid-relative to their input connections.

  • The "Anti-Diff" Philosophy: BlueLine never touches nodes you haven't selected. This ensures your Commit History remains clean and readable.

3. Hotkeys

Key Action Description Shift + Q Magnet Align Aligns selected nodes to the grid relative to their inputs. F8 Toggle Style Instantly switches between BlueLine wires and Standard Bezier curves.

🏷️ Smart Tags & Visualization

BlueLine overrides the Details Panel customization for FGameplayTag, replacing the text string with a colored "Chip" widget.

1. Setup (Team Color Sync)

Colors are not stored in local user preferences. they are stored in a Data Asset so the whole team sees the same colors.

  1. Create a DataAsset derived from BlueLineThemeData.

  2. Name it DA_BlueLineDefault and place it in /Game/BlueLine/ (Content/BlueLine/).

    • Note: This path ensures the plugin finds it automatically without configuration.

  3. Add Tag Styles:

2. Runtime Debugging (C++)

Debug colors shouldn't disappear when you hit PIE (Play In Editor). Use the static library to draw colored tags on the HUD or in World space.

3. Blueprint Support

The library is exposed to Blueprint as "Draw BlueLine Debug Tag".

I’m posting a changelog here for clarity :slightly_smiling_face:

BlueLine Changelog

Bug Fixes

Fixed Pin Duplication in Demo Nodes

Fixed a critical bug where AllocateDefaultPins() was not clearing existing pins before creating new ones, causing duplicated/stacked pins to appear when nodes were reconstructed (e.g., during compilation or undo/redo).

Affected Files:

  • Source/BlueLineSmartTags/Private/Demos/UK2Node_TagDemo.cpp
  • Source/BlueLineSmartTags/Private/Demos/UK2Node_KingSafety.cpp
  • Source/BlueLineSmartTags/Private/Demos/UK2Node_AWSTag.cpp

Fix: Added Pins.Reset() at the beginning of AllocateDefaultPins() to clear existing pins before recreation.

Fixed F8 Key Binding Conflict

Changed ToggleWireStyle command from F8 to Shift+F8 to avoid conflict with Unreal Engine's built-in "Possess or Eject Player" debugger command used in Play-in-Editor (PIE) mode.

Affected Files:

  • Source/BlueLineGraph/Private/Commands/FBlueLineCommands.cpp
  • Source/BlueLineGraph/Private/BlueLineGraphModule.cpp
  • Source/BlueLineGraph/Public/Commands/FBlueLineCommands.h

New Shortcut:

Shortcut Command Context
Shift+F8 Toggle Wire Style Blueprint Graph

Fixed Hardcoded Stub Length

The FBlueLineConnectionPolicy was using a hardcoded stub length value (20.0f) instead of respecting the user-configurable StubLength setting from Editor Preferences.

Affected Files:

  • Source/BlueLineGraph/Private/Drawing/FBlueLineConnectionPolicy.cpp

Fix: Changed from hardcoded value to use Settings->StubLength:

// Before:
const float StubLength = 20.0f * LocalZoomFactor;

// After:
const float StubLength = (Settings ? Settings->StubLength : 20.0f) * LocalZoomFactor;

Improvements

Implemented WireStyle Support

The WireStyle setting (Thin/Medium/Thick/Dynamic) in Editor Preferences was previously defined but not actually applied to wire rendering. Now it's fully functional.

Affected Files:

  • Source/BlueLineGraph/Private/Drawing/FBlueLineConnectionPolicy.cpp

Implementation:

void FBlueLineConnectionPolicy::DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin, FConnectionParams& Params)
{
    // Applies WireStyle from settings:
    // - Thin: 1.5px
    // - Medium: 2.5px  
    // - Thick: 4.0px
    // - Dynamic: Uses theme-based type coloring
    // Also applies WireThicknessMultiplier setting
}

Removed Ghost Setting: bAnimateExecutionWires

Removed the bAnimateExecutionWires setting from Editor Preferences that had no implementation. This was a placeholder setting that had no effect.

Affected Files:

  • Source/BlueLineCore/Public/Settings/UBlueLineEditorSettings.h
  • Source/BlueLineCore/Private/Settings/UBlueLineEditorSettings.cpp

New Feature: Graph Bookmarks

Added bookmark system for quick navigation in Blueprint graphs.

Hotkeys:

  • Ctrl+1-9: Set bookmark at selected node
  • 1-9: Jump to bookmark
  • Ctrl+0: Clear all bookmarks in current graph

Features:

  • Bookmarks persist per graph across editor sessions
  • Stored in Saved/BlueLineBookmarks.json
  • Automatic cleanup when assets are deleted
  • Visual feedback in Output Log

New Files

Source/BlueLineGraph/
├── Public/Bookmarks/
│   └── FBlueLineBookmarkManager.h      # Bookmark management API
└── Private/Bookmarks/
    └── FBlueLineBookmarkManager.cpp    # Implementation with JSON persistence

New Feature: Node Snippets

Save selected nodes as reusable templates that can be quickly inserted into any graph.

Hotkeys:

  • Shift+S: Create snippet from selected nodes
  • Shift+I: Insert a saved snippet

Features:

  • Full node serialization including connections
  • Organize snippets by category
  • Persistent storage in Saved/BlueLineSnippets.json
  • Export/import snippets for sharing

New Files

Source/BlueLineGraph/
├── Public/Snippets/
│   └── FBlueLineSnippetManager.h       # Snippet management API
└── Private/Snippets/
    └── FBlueLineSnippetManager.cpp     # Implementation with JSON persistence

[1.0.3] - 2026-02-09

Overview

Major feature release introducing BlueLineRuntime - a new runtime module that enables Blueprint Subsystem creation directly from the editor. This release also adds the "Extract to Subsystem" feature, allowing developers to refactor complex Blueprint graphs by extracting selected nodes into dedicated Subsystem Blueprints.


New Module: BlueLineRuntime

Blueprint Subsystem Base Classes

The BlueLineRuntime module provides Blueprint-friendly base classes for creating Unreal Engine Subsystems without writing C++. This enables developers to create managers and systems that persist across level transitions using familiar Blueprint workflows.

New Files

Source/BlueLineRuntime/
├── BlueLineRuntime.Build.cs              # Module build configuration
├── Public/
│   ├── BlueLineRuntimeModule.h           # Public module interface
│   └── Subsystems/
│       ├── BlueLineGameInstanceSubsystem.h   # GameInstance base class
│       ├── BlueLineWorldSubsystem.h          # World base class
│       └── BlueLineLocalPlayerSubsystem.h    # LocalPlayer base class
└── Private/
    ├── BlueLineRuntimeModule.cpp         # Module implementation
    └── Subsystems/
        ├── BlueLineGameInstanceSubsystem.cpp
        ├── BlueLineWorldSubsystem.cpp
        └── BlueLineLocalPlayerSubsystem.cpp

Base Classes

Class Parent Use Cases
UBlueLineGameInstanceSubsystem UGameInstanceSubsystem Game state managers, Save/load systems, Achievement managers
UBlueLineWorldSubsystem UWorldSubsystem Level-specific rules, World event managers, Per-level audio
UBlueLineLocalPlayerSubsystem ULocalPlayerSubsystem Per-player input, Player UI controllers, Split-screen HUD

Blueprint Events

All base classes provide Blueprint-implementable events:

  • On Initialize - Called when subsystem is initialized
  • On Deinitialize - Called when subsystem is shut down
  • On Post Initialize (World only) - Called after all subsystems initialized
  • On World Begin Play (World only) - Called when world starts gameplay
  • On Update Streaming State (World only) - Called for streaming updates

New Feature: Extract to Subsystem

Shift+B: Extract Selected Nodes to Subsystem

A powerful refactoring tool that allows extracting selected Blueprint nodes into a new dedicated Subsystem Blueprint. This helps organize complex graphs by isolating functionality into properly architected subsystems.

How It Works

  1. Select nodes in any Blueprint graph
  2. Press Shift+B or right-click → "Extract to Subsystem"
  3. Choose destination in the save dialog
  4. New Blueprint created inheriting from BlueLineGameInstanceSubsystem
  5. Blueprint opens automatically for editing

Implementation

New Files:

  • Source/BlueLineGraph/Public/BlueprintSubsystem/BlueprintSubsystemExtractor.h
  • Source/BlueLineGraph/Private/BlueprintSubsystem/BlueprintSubsystemExtractor.cpp

Key Features:

  • Analyzes selected nodes for external connections and dependencies
  • Creates properly configured Blueprint with correct parent class
  • Supports fallback to engine subsystem classes if BlueLineRuntime unavailable
  • Opens save dialog for user to choose destination path
  • Automatically opens new Blueprint for editing

Build System Updates

BlueLineRuntime.Build.cs (New)

public class BlueLineRuntime : ModuleRules
{
    PublicDependencyModuleNames.AddRange(
        new string[] { "Core", "CoreUObject", "Engine" }
    );
}

BlueLineGraph.Build.cs

 PrivateDependencyModuleNames.AddRange(
     new string[]
     {
         // ... existing modules ...
+        "ContentBrowser",   # Required for save asset dialog
+        "AssetTools"        # Required for blueprint creation
     }
 );

+// Allow includes from BlueLineSmartTags without circular dependency
+PrivateIncludePathModuleNames.AddRange(
new string { "BlueLineSmartTags" }
);


Plugin Configuration

BlueLine.uplugin

{
    "Version": 3,
    "VersionName": ",
    "Modules": [
        { "Name": "BlueLineCore", "Type": "Runtime", "LoadingPhase": "PreDefault" },
        { "Name": "BlueLineRuntime", "Type": "Runtime", "LoadingPhase": "Default" },
        { "Name": "BlueLineGraph", "Type": "Editor", "LoadingPhase": "PreDefault" },
        { "Name": "BlueLineSmartTags", "Type": "Editor", "LoadingPhase": "Default" },
        { "Name": "BlueLineLevel", "Type": "Editor", "LoadingPhase": "PostEngineInit" }
    ]
}

Keyboard Shortcuts

New Commands

Shortcut Command Context Module
Shift+B Extract to Subsystem Blueprint Graph BlueLineGraph
Shift+E Export to Text Blueprint Graph BlueLineGraph

Updated Shortcuts Reference

Shortcut Command Context
Shift+Q Auto-Format Graph Blueprint Graph
Shift+R Rigidify Connections Blueprint Graph
Shift+C Clean Graph Blueprint Graph
Shift+T Auto-Tag Selection Blueprint Graph
Shift+B Extract to Subsystem Blueprint Graph
Shift+E Export to Text Blueprint Graph
Shift+S Open Level Pie Menu Level Editor Viewport
Shift+F8 Toggle Wire Style Blueprint Graph

New Feature: Export to Text

Shift+E: Export Blueprint to Readable Text

A lightweight text exporter that converts Blueprint graphs into human-readable format for debugging, documentation, and AI-assisted analysis. Inspired by the Blueprint Text Exporter plugin.

How It Works

  1. Open any Blueprint graph
  2. Press Shift+E or right-click → "Export to Text"
  3. Choose save location in the file dialog
  4. Open the .txt file for debugging or AI analysis

Example Output

=== Blueprint Export: BP_Player ===
Export Type: Full Graph
Total Nodes: 42

Event BeginPlay
└─ then →
Set Max Health (MaxHealth = 100.0)
└─ then →
Set Current Health (CurrentHealth = MaxHealth)

Event TakeDamage
Take Damage (Damage = 10.0, DamageType = DamageType_Fire)
└─ then →
Apply Damage (Target = Self, BaseDamage = Damage)
└─ then →
UpdateHealthBar (Percent = CurrentHealth / MaxHealth)

Implementation

New Files:

  • Source/BlueLineGraph/Public/Export/BlueLineGraphExporter.h
  • Source/BlueLineGraph/Private/Export/BlueLineGraphExporter.cpp

Key Features:

  • Exports full graph or selected nodes
  • Follows execution flow with tree structure
  • Expands pure (data) nodes inline
  • Saves to [Project]/BlueprintExports/ by default
  • Compatible with AI tools (ChatGPT, Claude, etc.)

Build System Updates

BlueLineGraph.Build.cs (Updated)

 PrivateDependencyModuleNames.AddRange(
     new string[]
     {
         // ... existing modules ...
+        "DesktopPlatform"   # Required for save file dialog
     }
 );

Context Menu Additions

Blueprint Graph Context Menu

New entries in the "BlueLine Graph" section:

  • Auto-Tag Selection - Tag selected nodes semantically
  • Extract to Subsystem - Create subsystem from selection
  • Export to Text - Export graph to readable text

API Additions

// BlueprintSubsystemExtractor.h
class FBlueprintSubsystemExtractor
{
    bool ExtractToSubsystem(
        UEdGraph* SourceGraph,
        const TArray<UEdGraphNode*>& SelectedNodes,
        ESubsystemType SubsystemType,
        const FString& NewSubsystemName,
        const FString& DestinationPath);
void OpenExtractionDialog(UEdGraph* Graph, const TArray&lt;UEdGraphNode*&gt;&amp; SelectedNodes);
static bool CanExtractNodes(const TArray&lt;UEdGraphNode*&gt;&amp; SelectedNodes);

};

// BlueLineGraphExporter.h
class FBlueLineGraphExporter
{
static void ExportGraphToText(UEdGraph* Graph, const TArray<UEdGraphNode*>& SelectedNodes);
static bool CanExportNodes(const TArray<UEdGraphNode*>& Nodes);
};

// ESubsystemType enum
UENUM()
enum class ESubsystemType : uint8
{
GameInstance,
World,
LocalPlayer
};


Documentation

HTML Manual Updates

Comprehensive documentation updates for the new features:

New Sections Added:

  • Extract to Subsystem (Shift+B) - Complete workflow guide with visual examples
  • Export to Text (Shift+E) - Feature documentation with example output
  • Blueprint Subsystems - Base class documentation with comparison table

Updated Architecture Diagram:

  • Added BlueLineRuntime module to the dependency graph
  • Shows Editor → Runtime relationships with dashed lines

New Navigation Items:

  • "Advanced 🆕" section in sidebar
  • Individual pages for each new feature

Visual Improvements:

  • Feature cards for Extract to Subsystem and Export to Text in Overview
  • Version banner updated
  • Subsystem type comparison table

Bug Fixes

  • Fixed circular dependency between BlueLineGraph and BlueLineSmartTags modules
  • Fixed include paths for cross-module header access
  • Fixed missing includes in BlueprintSubsystemExtractor (UBlueprintFactory, UEdGraphNode_Comment)

[1.0.2] - 2026-02-08

Overview

Major release introducing BlueLineLevel - a unified Level Editor toolkit previously known as "Shift+S". This release merges the viewport-based modeling workflow tools into BlueLine, creating a complete editor enhancement suite covering both Blueprint graphs and Level Editor viewports.


New Module: BlueLineLevel

Full Migration of Shift+S (ShiftSDev) Plugin

The Shift+S plugin has been fully integrated into BlueLine as the BlueLineLevel module. All functionality has been preserved and enhanced to work within the BlueLine ecosystem.

New Files

Source/BlueLineLevel/
├── BlueLineLevel.Build.cs              # Module build configuration
├── Public/
│   ├── BlueLineLevelModule.h           # Public module interface (IBlueLineLevelModule)
│   ├── BlueLineLevelTypes.h            # Core types (EBlueLinePivotTarget, constants)
│   ├── BlueLineLevelOps.h              # Pivot and selection operations
│   └── BlueLineLevelSelection.h        # Session-based selection system
└── Private/
    ├── BlueLineLevelModule.cpp         # Module implementation
    ├── Core/
    │   ├── BlueLineLevelOps.cpp        # Pivot snapping, vertex picking, material selection
    │   └── BlueLineLevelSelection.cpp  # Cached selection with live preview
    ├── Framework/
    │   ├── BlueLineLevelCommands.h     # Command definitions
    │   └── BlueLineLevelCommands.cpp   # Alt+S shortcut binding
    └── UI/
        ├── SBlueLineLevelPieMenu.h     # Radial pie menu widget
        └── SBlueLineLevelPieMenu.cpp   # Menu implementation

Features Migrated

Feature Description Shortcut
Pie Menu Radial menu for quick actions Alt+S
Pivot Center Snap pivot to selection center Pie Menu ↑
Pivot Bottom Snap pivot to selection bottom Pie Menu ↓
Cursor Snap Vertex-precision picker mode Pie Menu →
Select Scope Material-based radius selection Pie Menu ←
Radius Scroll Adjust selection radius with mouse wheel While hovering Select Scope

Update: Streamlined Pie Menu Design (2026-02-08)

The Pie Menu has been completely redesigned to match BlueLine's elegant Blueprint aesthetic:

The Pie Menu has been completely redesigned to match BlueLine's elegant Blueprint aesthetic:

Feature Implementation
Blueprint Grid Background Subtle Blueprint-style grid that fades toward edges
Animated Hover States Smooth interpolation for scale and glow effects
Directional Layout Clean 90° orientation (Top/Right/Bottom/Left)
Color-Coded Options BlueLine blue for pivot tools, Greg green for selection, warm accent for cursor
Dynamic Center Indicator Center dot changes color to match hovered option
Connection Lines Subtle lines connecting center to each option
Refined Typography Short labels when idle, full labels on hover
Picker Mode Minimal crosshair with contextual hints

Visual Hierarchy:

  • Center dead zone prevents accidental triggers
  • 45° diagonal zones are neutral (no selection)
  • Options activate only when hovering the specific quadrant
  • Glow effects provide visual feedback without clutter

BlueLine 1.0.5 - Changelog

New Features

  • Magnetic Wire Snapping: Implemented a Node Graph Assistant-style wire snapping system (FBlueLineWireSnapper). When dragging a connection, your cursor will now magnetically snap to valid nearby pins, preventing near-misses during fast routing.
    • Configurable via Editor Preferences (Enable/Disable and Snap Radius tuning).

Bug Fixes

  • Context Menu Crash: Fixed an IsValid() assertion crash (FBlueLineGraphMenuExtender.cpp:120) that occurred when opening the Blueprint right-click context menu immediately at Editor startup before the BlueLineSmartTags module had fully initialized.
  • Hotkey Conflict: Changed the "Toggle Wire Style" hotkey from Shift+F8 to Shift+W to prevent overriding Unreal Engine's default Play in Editor (PIE) / Eject Player bindings.
  • Smart Tag Specificity: Fixed an issue where Smart Tag colors could apply the wrong hierarchical style based on string length. The resolver now correctly uses Unreal's native MatchesTagDepth to ensure exact parent-child inheritance logic.
  • Auto-Routing Tangling: Changed the default value of "Auto-Route New Connections" from true to false to prevent internal macro/node structures from tangling when duplicating or pasting large graphs.

Architectural Improvements

  • Zero Runtime Overhead: Completely removed the BlueLineRuntime module. The plugin is now 100% Editor-only.
    • The "Extract to Subsystem" feature has been rewritten to inherit directly from Unreal Engine's native subsystem classes (UGameInstanceSubsystem, UWorldSubsystem, ULocalPlayerSubsystem) instead of relying on a proprietary BlueLine base class.
  • Dynamic Configuration: Removed the legacy BlueLineConfig.h constants system. All core thresholds and "magic numbers" have been fully migrated into UBlueLineEditorSettings, ensuring seamless live-updates when modifying preferences.
  • Version Sync: Aligned BlueLine.uplugin version strings (1.0.5) to accurately reflect documented feature sets.

1.1 update - 2026-05-24 :champagne:

New & Updated Features

  • :repeat_button: Gridline Wire Style: Completely refactored FBlueLineConnectionPolicy. Wires are now drawn as continuous orthogonal polylines with mathematically rounded corners (bezier arcs) and semi-circle “bridges/bumps” where wires intersect.
  • :man_technologist: Strict Node Alignment: Modified the genetic algorithm graph cleaner (FBlueLineGraphCleaner) to trace parent execution pins and align nodes into perfectly straight horizontal execution rows, snapping all nodes to a uniform 16-unit vertical grid.
  • Wire Spacing (Bus Routing): Implemented an intelligent overlap detection algorithm that iteratively staggers parallel horizontal and vertical wires, producing perfectly spaced “bus lines” without overlapping.
  • :brain: Named Reroutes (Wireless Data): Standard UK2Node_Knot reroute nodes that share the exact same non-empty NodeComment will now automatically suppress their connecting wires, visually acting as wireless data transmitters/receivers.
  • :man_mage: Polished Setup Wizard: Introduced a dark blue & cyan natively styled Slate Setup Wizard that opens on first launch. Features interactive quick-config checkboxes and “Features at a Glance.” Includes GregOrigin branding.
  • :clapper_board: Wizard Action Buttons: The Wizard now includes one-click buttons to “Open Showcase Blueprint”, “Open Documentation”, “Open All Settings”, and “Get Support” (Discord) for frictionless onboarding.
  • :technologist: Headless Blueprint Linter (CI/CD): Added UBlueLineLinterCommandlet, allowing enterprise teams to run BlueLine Linter in CI/CD pipelines to fail the build (Exit Code 1) if code smells (Tick Abuse, Deep Nesting, etc.) are detected.
  • :office_worker: Visual Snippet Manager Tab: Implemented SBlueLineSnippetTab, a dockable UI panel (Window > Tools > Snippet Manager) providing a list view of saved snippets with one-click insertion and deletion.
  • :window: Window Menu Integration: The Setup Wizard is now accessible on-demand from Window > BlueLine Setup Wizard.
  • :keyboard: Keyboard Shortcut Exposure: Re-verified and ensured IMainFrameModule UI commands are properly exposed so users can natively rebind BlueLine hotkeys (Shift+Alt+C, Shift+Alt+T, Shift+Alt+L) in Editor Preferences.

Bug Fixes

  • Context Menu Right-Click Crash: Resolved a critical editor crash that occurred when right-clicking on nodes in the Blueprint graph. The crash was caused by a null pointer dereference inside TCommands<FBlueLineSmartTagCommands>::Get(). The AutoTagGraph context menu entry has been relocated from the BlueLineGraph module to the BlueLineSmartTags module where the command is natively registered, and is now guarded by FBlueLineSmartTagCommands::IsRegistered().
  • Module Decoupling: Removed redundant private include paths and dependencies to BlueLineSmartTags from BlueLineGraph.Build.cs, enforcing strict boundary checks and modular design.

1.1.1 update, 2025-05-25

Bug Fixes

  • Editor Exit Crash (Wire Snapper Shutdown): Fixed a shutdown crash caused by FBlueLineWireSnapper::Disable() calling FSlateApplication::Get() after Slate teardown during editor exit. Input preprocessor registration and unregistration are now guarded by FSlateApplication::IsInitialized().
  • Editor Exit Crash (Level Pie Menu Lifetime): Hardened BlueLineLevel shutdown so the pie menu detaches its raw close callback before module teardown and no longer tries to restore viewport focus or remove overlays after Slate is gone.
  • Editor Exit Crash (Deferred UI Registrations): Added shutdown guards for the setup wizard post-engine-init hook and snippet tab spawner registration/unregistration so late editor teardown no longer assumes Slate and global tab infrastructure are still valid.
  • Large Graph Connector Loss: Fixed missing Blueprint connectors on large graphs by replacing the previous heavy fallback with an explicit simplified Manhattan wire draw path that still renders visible wires.

Performance & Stability

  • Large Blueprint Memory Pressure: Added a scalable fallback in FBlueLineConnectionPolicy for large graphs. When graph complexity crosses a budget, BlueLine now skips the expensive global bus-routing/crossing pass and draws a cheaper Manhattan path per wire instead of performing quadratic routing work every paint.
  • Auto-Routing Guardrails: Tightened FBlueLineConnectionInterceptor so the global OnObjectModified hook refuses to scan medium-to-large graphs, reducing load-time memory churn when opening large Blueprints.
  • Wire Snapping Guardrails: Disabled magnetic wire snapping on very large graphs to prevent full-graph pin searches from running every tick during drag operations.

Affected Modules

  • BlueLineGraph: Hardened wire snapper shutdown, added large-graph rendering fallback, preserved connector visibility in simplified mode, and reduced auto-routing/snapper cost on complex graphs.
  • BlueLineLevel: Hardened pie menu shutdown and callback lifetime handling during editor exit.
  • BlueLineCore: Cleaned up setup wizard lifecycle hooks and added Slate-safe guards around first-run wizard opening.

Bugfix Patch released, still 1.1.1, 2026-05-27

Illustrated Fix Map

  • [●━━━━:play_button:● Wire Path] Restored visible Blueprint node connections after a new related bug surfaced.
  • [:gear: Old → Current] Replaced stale plugin defaults with the active UBlueLineEditorSettings config section.
  • [▧ Missing PNG → Removed Brush] Removed Slate style registrations for pie-menu textures that are not shipped with current plugin versions.
  • [▣ Source Package → Engine Rebuild] Tightened plugin packaging metadata and documentation.

Bug Fixes

  • Blueprint Wires Not Rendering: Fixed the BlueLine graph connection policy so it caches the correct wire layer, uses the correct arrow layer for arrowheads, and falls back to Unreal’s native spline draw path for direct draw cases introduced by UE 5.7.4. This resolves cases where connections existed between nodes but no lines were visible.
  • Startup Reflection Error: Initialized FNodeExtractionInfo::OriginalPosition and EventName, removing the editor startup reflection warning for uninitialized USTRUCT properties.
  • Missing Slate Resource Warnings: Removed unused BlueLine.PieMenu.OptionBg, BlueLine.PieMenu.OptionHover, and BlueLine.PieMenu.CenterHub style brushes because the referenced Icons/Pie*.png files are not part of the plugin package.
  • Stale Settings Defaults: Deleted Config/DefaultBlueLine.ini, which referenced the obsolete /Script/BlueLineGraph.BlueLineEditorSettings class and retired keys such as bEnableManhattanRouting, bDimWiresBehindNodes, and FormatterPadding.
  • Current Settings Defaults: Added Config/DefaultEditorPerProjectUserSettings.ini with the current /Script/BlueLineCore.BlueLineEditorSettings section and live settings keys used by the implementation.

1.1.2 update, 2026-06-05 :blueberries:

Symbol Legend

  • [:compass:] Navigation, focus, and command routing
  • [:broom:] Graph cleanup and layout health
  • [:test_tube:] Tests and verification
  • [:package:] Packaging and release material
  • [:artist_palette:] Documentation, visuals, and customer-facing polish
  • [:shield:] Safety, lifecycle, and crash prevention

Illustrated Fix Map

  • [:broom: Cycle ⇄ Comment Box] Graph cleaning now handles cyclic Blueprint chains without runaway rank growth, and comment boxes are preserved instead of being moved by cleanup passes.
  • [:compass: Focus → Graph] Snippet insertion, graph commands, and bookmark navigation now rely on safer graph-focus resolution instead of brittle direct SGraphEditor assumptions.
  • [:shield: Raw Callback → Static/Lambda Safe] Editor command lifetimes were hardened so shutdown unmaps commands and avoids stale module callbacks.
  • [:artist_palette: Static Docs → Illustrated Manual] FAQ.html and Manual.html now include visual shortcut maps, SVG workflow diagrams, and clearer guidance.

Graph Health & Blueprint Safety

  • [:broom:] Graph Cleaner Cycles: Fixed rank assignment so each node is ranked once during graph cleanup, preventing infinite rank growth on cyclic execution chains.
  • [:broom:] Comment Preservation: Excluded UEdGraphNode_Comment nodes from island discovery, layout movement, and parent alignment so user-authored comment boxes stay in place.
  • [:broom:] Analyzer Noise Reduction: Graph analysis now ignores comment nodes and knot-only layout helpers for node counts, isolation checks, clusters, execution chains, wire crossings, bounds, and traversal depth.
  • [:shield:] Null Link Guards: Hardened graph analysis against null linked pins during traversal.
  • [:broom:] Large Graph Behavior: Existing large-graph bypass logging remains, but cleanup now avoids counting comment/knot-only nodes as layout complexity.

Snippets, Bookmarks & Focus Handling

  • [:compass:] Snippet Delete Safety: Fixed a TMap pointer lifetime bug by copying snippet name/category before removing the snippet entry.
  • [:compass:] Snippet Insert Fallback: Insert commands now use FBlueLineContextUtils::GetCurrentGraphFromFocus() instead of requiring a directly focused SGraphEditor.
  • [:compass:] Snippet Manager Targeting: The dockable snippet tab now resolves the current graph through shared focus utilities before insertion.
  • [:compass:] Bookmark Widget Cast: Bookmark graph-editor lookup no longer static-casts SGraphEditorImpl as SGraphEditor; only actual SGraphEditor widgets are cast.
  • [:compass:] Shortcut Conflict Fix: Bookmark jump shortcuts changed from Shift+1..9 to Alt+Shift+1..9 to avoid Unreal editor mode-switch conflicts.

Routing, Wires & Auto-Route

  • [:shield:] Wire Snap Drag Detection: Wire snapping now detects connection drags through the active drag operation type instead of relying only on custom pin widget state.
  • [:shield:] Non-Invasive Pin Factory: Pin customization remains opt-in and no longer owns the full drag-detection contract.
  • [:shield:] Auto-Route Transactions: New connection auto-routing now wraps graph edits in FScopedTransaction, modifies graph/nodes correctly, and notifies graph changes only when routing actually occurs.
  • [:shield:] Stale Connection Cleanup: Auto-route processed-connection tracking now removes links that no longer exist.
  • [:shield:] Baseline Loaded Graphs: Connection interceptor baselines already-loaded graphs on enable so existing links are not mistaken for newly created ones.

Commands, Modules & Shutdown

  • [:shield:] BlueLineLevel Shutdown: Level command mappings are explicitly unmapped before command lists are reset.
  • [:shield:] Smart Tags Command Lifetime: ExecuteAutoTagGraph is now static, command binding uses CreateStatic, and shutdown unmaps AutoTagGraph.
  • [:shield:] Setup/ToolMenus Safety: Core menu registration remains owner-scoped and unregisters startup callbacks on shutdown.

Demo Nodes & Smart Tags

  • [:shield:] Demo Nodes Hidden By Default: Added bExposeDemoNodes=false under advanced debug settings and hid demo K2 nodes from the Blueprint action menu unless explicitly enabled.
  • [:shield:] Demo Node Pin Allocation: Removed manual Pins.Reset() calls from demo K2 node pin allocation.
  • [:shield:] Demo Compile Warning: The AWS demo node now emits a clear warning that it is a demo node with no runtime behavior.
  • [:artist_palette:] Demo Documentation Scope: The docs now explain that generated demo helpers are for throwaway Blueprint/K2 test graphs and that internal demo nodes are hidden from normal action search.

Wireless Nodes & Build Dependencies

  • [:shield:] Wireless Rewire Safety: K2Node_BlueLineWirelessUsage now uses FKismetCompilerContext::MovePinLinksToIntermediate() instead of manually relinking downstream pins.
  • [:shield:] Direction Validation: Wireless usage expansion validates that the source pin is an output pin before moving links.

Settings, Config & Level Tools

  • [:shield:] GridSnapSize Clamp: Fixed settings validation so clamped GridSnapSize values are assigned back to the setting.
  • [:compass:] Selection Radius Settings: Level selection now reads DefaultSelectionRadius from UBlueLineEditorSettings instead of legacy editor ini keys.
  • [:shield:] Debug Draw Safety: Level preview code no longer calls FlushPersistentDebugLines, avoiding accidental clearing of unrelated debug visualizations.
  • [:package:] Settings Defaults Gap Noted: The docs now call out release/package expectations more clearly; DefaultEditorPerProjectUserSettings.ini should still be kept synchronized with newly added settings before final distribution.

Automation & Regression Tests

  • [:test_tube:] Headless UI Test Guard: BlueLineGraphUITests.cpp now skips interactive graph UI shortcut testing under commandlet/headless/-NullRHI conditions instead of hanging.
  • [:test_tube:] Cycle + Comment Regression: Added BlueLine.Graph.Cleaner.CyclesAndComments, covering cyclic layout cleanup and comment immobility.
  • [:test_tube:] Automation Count: The headless BlueLine suite now runs 12 tests, with the interactive UI test skipped as expected in headless mode.

Documentation & Illustrated HTML

  • [:artist_palette:] FAQ Visual Refresh: FAQ.html now has an illustrated hero, quick-reference shortcut strip, graph cleanup visual, bookmarks/snippets panel, Smart Tags illustration, and Fab packaging visual.
  • [:artist_palette:] Main Docs Visual Map: Docs/Manual.html now includes a current default shortcut map and an illustrated Blueprint workflow board.
  • [:artist_palette:] Bookmarks Diagram: Added a visual model showing Alt+1-9 storage, Alt+Shift+1-9 navigation, and Saved/BlueLineBookmarks.json.
  • [:artist_palette:] Snippets Diagram: Added a visual model showing selection capture, Shift+Alt+S, snippet JSON storage, and Shift+Alt+I insertion into the focused graph.
  • [:artist_palette:] Current Shortcut Wording: Updated stale docs from old Shift+R, Shift+C, Shift+S, plain 1-9, and Ctrl+1-9 wording to the current conflict-safe bindings.

1.1.3 update, 2026-06-15

:rocket: Features & Refinements

• Orthogonal Routing Refinement: Re-engineered the underlying routing logic for Manhattan and Circuit wire styles. Wires now trace direct, clean orthogonal lines ( horizontal → vertical → horizontal ) and bypass node-avoidance math, permanently eliminating any extraneous routing loops.
• Context Menu Expansion: Added the “Toggle Wire Style” action directly into the Blueprint right-click context menu (under the BlueLine grouping, right next to Rigidify) for immediate visual access.

:bug: Bug Fixes

• Wire Toggle Action Fix: Repaired a broken assignment within the Toggle Wire Style internal execution logic. Toggling styles now correctly refreshes the graph instantly and permanently saves your choice to the editor configuration ( SavedConfig ).
• Pie Menu Execution Bug: Fixed a bug in the Level Editor Pie Menu where releasing the X key failed to register. Pie actions like Pivot to Bottom, Pivot to Center, and Select by Material can once again be executed seamlessly using quick-flicks (holding Alt , tapping X , swiping, and releasing X ).
• Shortcut Conflicts: Re-mapped the Toggle Wire Style hotkey from Shift+W to Alt+W to permanently resolve a hardcoded engine conflict with Unreal’s native Blueprint “Fast Pan Up” navigation.

:books: UI & Documentation

• Setup Wizard: Refined the setup wizard UI.

New video on BlueLine 1.1: 5+ minutes long, but still covers only 50% of its features. :clapper_board:

1.1.5 update, 2026-07-09 :light_blue_heart:

Symbol Legend

  • [:artist_palette:] Wire rendering and visual styling
  • [:broom:] Graph formatting and layout health
  • [:compass:] Routing and connection behavior
  • [:test_tube:] Tests, automation, and verification

Illustrated Fix Map

  • [:white_circle:→:green_circle: Wire Color] Blueprint data wires render in their pin-type colors again instead of all-white.
  • [─ vs ━ Dynamic] “Dynamic (Type-based)” wire style now varies thickness by connection type instead of a flat constant.
  • [░▒▓ Ghost Wire] Wire segments passing behind nodes now dim per-segment.
  • [◦─● Magnet] Auto-format snaps near-aligned connected nodes into straight rows/columns.

Wire Rendering & Visuals

  • [:artist_palette:] Type-Based Wire Colors Restored: FBlueLineConnectionPolicy now derives from FKismetConnectionDrawingPolicy, which sets WireColor from the pin type. The previous base (FConnectionDrawingPolicy) never assigned a color, so every wire fell back to the FConnectionParams default of white. The connection factory now creates the policy only for K2 graphs and passes the owning UEdGraph.
  • [:artist_palette:] Dynamic Wire Style Is Now Type-Based: The Dynamic (Type-based) wire style honors the engine’s per-connection thickness (thin data, thicker execution/container wires) instead of a constant, so wire types read distinctly. Type-based color now applies across every wire style.
  • [:artist_palette:] Ghost Wires Behind Nodes: Implemented GhostWireOpacity. Wire portions overlapping a node’s bounds are dimmed per-segment (Liang–Barsky clip against cached node bounds) while the rest stay full opacity. Default 0.35 (enabled); set 1.0 to disable. Applies to the orthogonal routing modes (Manhattan/Circuit/Hybrid).
  • [:artist_palette:] Stub Thickness: Implemented StubThickness. The pin-exit stub segments of each wire are drawn at the configured thickness, distinct from the wire body.
  • [:artist_palette:] Bubble Size: The end-of-wire arrow/bubble is now sized from WireSettings.BubbleSize instead of the raw brush image size.

Formatting & Routing

  • [:broom:] Magnetic Alignment: Implemented MagnetEvaluationDistance. After auto-format’s collision pass, a node within the configured distance of a perfectly straight connection to its parent snaps onto that line, guarded so the move never reintroduces node overlap.
  • [:compass:] Honor Auto-Route Node Limit: Removed a hidden 128-node cap so AutoRouteMaxNodes (UI range up to 1000) is the real ceiling for new-connection auto-routing at both interceptor sites.
  • [:artist_palette:] Stub Length Labels Disambiguated: StubLength now displays as “Wire Stub Length (Visual)” and HorizontalStubLength as “Auto-Route First-Turn Distance”, clarifying two similarly named settings.

Verification

  • [:test_tube:] Editor Build: BlueLineDevEditor Win64 Development compiled cleanly; BlueLineCore and BlueLineGraph relinked.
  • [:test_tube:] Automation: Headless Automation RunTests BlueLine passed 12/12 tests (0 failed, 0 warnings), including BlueLine.Graph.Formatter.ExecAlignment covering the magnetic-alignment change. The interactive BlueLine.UI.Graph.Rigidify test self-skips as designed.

1.2.0 update, 2026-09-05 :blue_book:

  • [:office_building:] Multi-Engine Compatibility Matrix (UE 5.5 Floor to UE 5.8.2)
  • [:triangular_ruler:] Knot Manhattan Centering & Precision Pin Alignment
  • [:label:] Semantic Smart Tag Bounding & Unique Comment Box Identity
  • [:satellite_antenna:] Symmetric Wireless Node Pair Order-Independent Expansion
  • [:hammer_and_wrench:] Subsystem Extractor Package Path Sanitization & Relative Origin Offset
  • [:right_arrow_curving_left:] Auto-Align Full Undo Transaction Tracking (GraphContext->Modify())
  • [:shield:] Level Viewport Scene Context Null Safety & Settings Gating
  • [:test_tube:] 16/16 Live Headless Automation Regression Suite Across UE 5.5 & 5.7

Very detailed changelog follows, recommended mostly for enthusiasts. :slightly_smiling_face: Please remember that the open-source version is also updated with many of these fixes and improvements.

1. Multi-Engine Runtime Floor Matrix

┌────────────────────────────────────────────────────────────────────────┐
│               UNREAL ENGINE MULTI-VERSION RUNTIME MATRIX               │
├───────────────────┬───────────────────┬───────────────────┬────────────┤
│   Unreal Engine   │   Unreal Engine   │   Unreal Engine   │   Unreal   │
│       5.5.x       │       5.6.x       │       5.7.x       │   5.8.x+   │
│      [FLOOR]      │                   │                   │            │
├───────────────────┼───────────────────┼───────────────────┼────────────┤
│   ✔ Clean Build   │   ✔ Clean Build   │   ✔ Clean Build   │  ✔ Clean  │
│   ✔ 16/16 Tests   │   ✔ Packaged      │   ✔ 16/16 Tests   │  ✔ Modern │
│     PASSED        │     VERIFIED      │     PASSED        │    Headers │
└───────────────────┴───────────────────┴───────────────────┴────────────┘

2. Knot Pin Snapping & Origin Centering Offset

  • [:triangular_ruler: Before] Manhattan router placed Knot origin at (CornerX, CornerY), causing the pin center at (PosX + 16, PosY + 16) to offset by 16 units from the wire grid:
    Grid Line (Y)
          │
    ──────┼─────────────► [Out Pin]
          │                     │
          ▼                     ▼
     ┌────┬────┐
     │    │    │ ◄─── Knot Origin at Corner (CornerX, CornerY)
     ├────┼────┤
     │    │ • ◄┼───── Pin Center Offset: +16px Down and Right of Grid Line!
     └────┴────┘
    
  • [:triangular_ruler: After] Knot origin translates by (-16, -16), placing the knot pin center exactly on the grid line:
    Grid Line (Y)
          │
    ──────┼────────────────────────────────────────────── [Out Pin]
          │                                                     │
          ▼                                                     │
     ┌────┬────┐ ◄─── (CornerX - 16, CornerY - 16)             │
     │    │    │                                                │
     ├────┼────┤ ◄─── PIN CENTER PRECISELY ON GRID LINE        │
     │    │ • ◄┼────── (True Pin Pos = CornerX, CornerY)        │
     └────┴────┘                                                │
          │                                                     │
          ▼                                                     ▼
    ──────┼────────────────────────────────────────────── [In Pin]
          │
    

3. Compact 32x32 Knot Bounds in Graph Analyzer

  • [:label: Before] Graph Analyzer treated UK2Node_Knot as standard 120x100 nodes, inflating semantic cluster comment boxes:
    ┌─ Inflated Cluster ──────────────────────────────────┐
    │  [Node A] ──────► [•] Knot (treated as 120x100)      │
    │                   │                                 │
    │                   ▼                                 │
    │  [Node B] ◄───────┘                                 │
    └─────────────────────────────────────────────────────┘
    
  • [:label: After] Recognizes UK2Node_Knot as compact 32x32, framing semantic comment boxes tightly:
    ┌─ Precise Cluster ──────────────────────┐
    │  [Node A] ───► [•] Knot (32x32)        │
    │                │                       │
    │  [Node B] ◄────┘                       │
    └────────────────────────────────────────┘
    

4. Order-Independent Wireless Node Compilation

  • [:satellite_antenna: Before] Asymmetric ExpandNode in Wireless Declaration required declarations to expand before usages, risking dangling intermediate links:
    [Decl: "ChannelA"] (expanded 1st) ──?── [Usage: "ChannelA"] (not yet expanded!)
    
  • [:satellite_antenna: After] Symmetric order-independent linking with intermediate pin transfer:
    [ Decl: "ChannelA" ] · · · (Intermediate Pin Transfer) · · · [ Usage: "ChannelA" ]
             │                                                            │
             └──────────────────► Direct Compiled Bytecode ───────────────┘
    

5. Two-Phase Topological Ranking (Eliminates Pure Node Dump)

  • [:high_voltage: Before] Pure math, variable, and function nodes were dumped into column 0 at $(0,0)$, creating long wires crossing the entire graph:
    [Pure Node] (Rank 0) ───────(long tangled wire spans graph)────────> [Exec Consumer] (Rank 2)
    [Entry Node] (Rank 0) ──> [Exec Node A] (Rank 1) ───────────────────┘
    
  • [:high_voltage: After] Pure nodes are ranked by reverse dependency from consumer nodes ($\text{Rank} = \min(\text{Consumers}) - 1$), sitting neatly to their left:
    [Entry Node] (Rank 0) ──> [Exec Node A] (Rank 1) ──> [Exec Consumer] (Rank 2)
                                   [Pure Node] (Rank 1) ────────┘
    

6. Knot-Transparent Traversal & Collinear Midpoint Positioning

  • [:shuffle_tracks_button: Before] Knots (UK2Node_Knot) consumed full 300px layout columns, causing massive gaps in logic graphs:
    [Source Node] ──> [ Knot ] ──> [ Knot ] ──> [Target Node]
    [  Col 0    ]     [ Col 1]     [ Col 2]     [  Col 3    ]
    
  • [:shuffle_tracks_button: After] Knots bypass ranking columns; layout searches through knots for semantic neighbors, and knots center on wire midpoints:
    [Source Node] ─────────[•]─────────[•]─────────> [Target Node]
    [  Col 0    ]                                    [  Col 1    ]
    

7. Bus Routing Hairpin Loop Elimination

  • [:triangular_ruler: Before] Bus trunk shifted past destination pin X, forcing an ugly backward hairpin turn:
    [Out Pin] ─────────────────┐
                               │ (shifted too far right)
                 ┌─────────────┘
                 └─────────> [In Pin]
    
  • [:triangular_ruler: After] Clamped bus bounds (MaxAllowedBX, MinAllowedBX) strictly preserve forward flow without backward loops:
    [Out Pin] ──────┐
                    └──────> [In Pin]
    

8. Slate Jump Arc Visual De-Looping

  • [:kangaroo: Before] Overlapping jump intervals closer than $2 \times \text{Radius}$ generated inverted spline control points, drawing backward knot loops:
    ───────╭────╮───────
              ╰──╯  <-- (reversed control points in Slate)
    
  • [:kangaroo: After] Overlapping jump intervals are merged/filtered, producing a single clean jump arc:
    ───────╭──────╮───────
    

9. Smart Wire Snapper Schema & Direction Filtering

  • [:magnet: Before] Snapped cursor indiscriminately to nearby pins of the same direction or incompatible schema types:
    [Drag Out Pin] ───⚡───> [Out Pin]  (Invalid: Output to Output)
    
  • [:magnet: After] Enforces Direction != SourceDirection, Node != SourceNode, and schema connection validity before snapping:
    [Drag Out Pin] ────────> [In Pin]   (Valid: Output to Input, schema approved)
    

10. Dynamic Comment Box Enclosure

  • [:package: Before] Cleaned nodes moved out of static comment boxes:
    ┌─ Old Comment ──┐
    │                │      [Cleaned Node A]  [Cleaned Node B]
    └────────────────┘
    
  • [:package: After] Comment boxes dynamically resize and reposition with configurable padding (CommentBoxPadding):
    ┌─ Adaptive Comment ─────────────────────────────┐
    │   [Cleaned Node A] ───> [Cleaned Node B]       │
    └────────────────────────────────────────────────┘
    

11. Undo/Redo & Scene Safety Guards

  • [:right_arrow_curving_left:] AutoAlign Undo Support: Added GraphContext->Modify() before node rearrangement.
  • [:shield:] Viewport Scene Safety: Added Client->GetScene() verification in SBlueLineLevelPieMenu.cpp before family context creation, preventing crashes in unusual editor viewport states.
  • [:shield:] Level Selection Setting Guard: Added IsBlueLineEnabled() check preventing accidental selection session initialization when BlueLine is disabled.

Further improvements (v1.2.0)

:triangular_ruler: Manhattan Routing & Knot Geometry

  • [:triangular_ruler:] Knot Centering Math: FBlueLineManhattanRouter::AddKnot calculates knot placement at FVector2D(SnappedPt.X - 16.0f, SnappedPt.Y - 16.0f), ensuring reroute pins sit directly at integer grid points.
  • [:triangular_ruler:] Pin Position Center Helper: FBlueLineManhattanRouter::GetPinPos for UK2Node_Knot returns (NodePosX + 16.0f, NodePosY + 16.0f).
  • [:label:] Knot Bounding Box: FBlueLineGraphAnalyzer::CalculateClusterBounds tests Node->IsA<UK2Node_Knot>() and assigns 32.0f x 32.0f, preventing comment boxes from over-expanding.

:satellite_antenna: Wireless System

  • [:satellite_antenna:] Symmetric Node Expansion: UK2Node_BlueLineWirelessDecl and UK2Node_BlueLineWirelessUsage link pins through intermediate compiler pins, removing execution order dependency.
  • [:satellite_antenna:] Compiler Functor Override: Overrode CreateNodeHandler to return nullptr, enforcing clean expansion through Kismet compiler without generating unhandled opcode warnings.

:hammer_and_wrench: Subsystem Extractor

  • [:hammer_and_wrench:] Long Package Path: Sanitized directory strings in BlueprintSubsystemExtractor.cpp so CreateAsset receives clean /Game/... asset destinations.
  • [:hammer_and_wrench:] Geometric Anchor: Shifted copied node bounds to (100, 100) with CreateNewGuid() and PostPlacedNewNode().

:right_arrow_curving_left: Formatting & Undo

  • [:right_arrow_curving_left:] AutoAlign Transaction: FBlueLineFormatter::AutoAlignSelectedNodes records GraphContext->Modify(), enabling full Ctrl+Z undo support for alignment actions.

:test_tube: Live Automation Test Suite

  • [:test_tube:] 16/16 Tests Passing Across UE 5.5 and UE 5.7:
    • BlueLine.Graph.Analyzer.BasicMetrics - PASSED
    • BlueLine.Graph.Analyzer.BoundsCalculation - PASSED
    • BlueLine.Graph.Analyzer.ClusterDetection - PASSED
    • BlueLine.Graph.Analyzer.WireCrossings - PASSED
    • BlueLine.Graph.Cleaner.CyclesAndComments - PASSED
    • BlueLine.Graph.Cleaner.PureNodeFlow - PASSED
    • BlueLine.Graph.Export.SettingsRespected - PASSED
    • BlueLine.Graph.Formatter.ExecAlignment - PASSED
    • BlueLine.Graph.Linter.KnotAndCommentExemption - PASSED
    • BlueLine.Graph.Linter.OrphanedNode - PASSED
    • BlueLine.Graph.Routing.KnotCenteringAndPinPos - PASSED
    • BlueLine.Graph.SubsystemExtractor.CanExtractNodes - PASSED
    • BlueLine.Graph.Wireless.NodeLifecycle - PASSED
    • BlueLine.SmartTags.AutoTag.PersistsMetadata - PASSED
    • BlueLine.SmartTags.AutoTag.RespectsBlueprintColorEditSetting - PASSED
    • BlueLine.UI.Graph.Rigidify.inserts reroute nodes through the real graph editor shortcut - PASSED

:dna: Graph Cleaner & Topological Layout

  • [:high_voltage:] Two-Phase Topological Sorting: Replaced naive BFS with a two-phase ranker. Phase 1 traces forward execution paths along PC_Exec pins. Phase 2 assigns pure data nodes backwards from their consumer nodes. Pure math and variable getters now consistently sit immediately to the left of the nodes that consume them.
  • [:shuffle_tracks_button:] Knot Transparency: CollectNeighborsThroughKnots traverses through sequences of UK2Node_Knot reroute nodes to uncover true semantic connections, preventing knots from blowing up column spacing.
  • [:shuffle_tracks_button:] Midpoint Pin Centering: Intermediate knots are repositioned directly between connected pins, taking into account actual pin heights and node geometry.
  • [:dna:] Spine-Preserving Genetic Algorithm: GA chromosome permutation now preserves execution rank constraints and pin collinearity, preventing evolutionary layout passes from twisting execution wires into knots.
  • [:package:] Island Canvas Origin Preservation: Disconnected logic islands compute their original bounding box centroid and apply AABB separation, preventing graphs from collapsing onto $(0,0)$.
  • [:package:] Comment Box Adaptation: Enclosing comment boxes resize to neatly frame their new node extents; empty or reference comments remain untouched.

:triangular_ruler: Wire Routing & Visual Bus Architecture

  • [:triangular_ruler:] Redundant Collinear Bend Elimination: In ComputeManhattanPath, horizontal segments where $Y_1 \approx Y_2$ skip midpoint break calculations, rendering straight wires instead of jagged micro-steps.
  • [:triangular_ruler:] Bidirectional Backtrack Clearing: Backtrack routing evaluates target relative $Y$ to route above or below nodes appropriately, avoiding wire intersections through node bodies.
  • [:triangular_ruler:] Clamped Bus Routing: ApplyBusRouting enforces strict boundary clamping (MaxAllowedBX, MinAllowedBX, MaxAllowedBY, MinAllowedBY), guaranteeing that vertical trunks never shift past destination pin stubs.
  • [:kangaroo:] Slate Jump Arc De-looping: DrawPathWithCrossings now filters overlapping jump spans (JumpStartDist < LastJumpEndDist), preventing negative segment intervals from drawing twisted backward knots in Slate.
  • [:triangular_ruler:] Staggered Multi-Wire Routing: In FBlueLineManhattanRouter, parallel connections between identical node pairs apply configurable vertical trunk offsets (StaggerOffset), preventing overlapping reroute knots.

:magnet: Wire Snapper & Cursor Guidance

  • [:magnet:] Source Pin Tracking: FBlueLineWireSnapper tracks DragSourcePin across drag operations.
  • [:magnet:] Schema-Aware Snapping: Snapping requires opposite pin directions (EGPD_Output vs EGPD_Input), different owning nodes, and passes Schema->CanCreateConnection checks. Cursors will no longer snap to invalid or disallowable pins.

:shield: Formatting & Execution Spine

  • [:shield:] Cycle Detection in Formatter: AutoAlignSelectedNodes replaces fragile horizontal coordinate checks (PossibleParent->NodePosX >= CurrentNode->NodePosX) with a directed cycle detector (IsAncestor), allowing messy or inverted nodes to resolve cleanly from left to right.
  • [:high_voltage:] Execution Spine Alignment: Primary execution children (sibling index 0) remain aligned with the parent execution output pin, while secondary branches step downward cleanly.

:magnifying_glass_tilted_left: Graph Analysis & Metrics

  • [:magnifying_glass_tilted_left:] Pin-Accurate Wire Crossing Detection: CountWireCrossings now calculates exact pin positions rather than using top-left node coordinates, eliminating false-positive crossing counts on multi-pin nodes.
  • [:magnifying_glass_tilted_left:] Shared Endpoint Filtering: DoLinesIntersect filters shared start and end pin connections, ensuring common split branches are not miscounted as wire crossings.

:package: Engine Compatibility & Testing

  • [:package:] UE 5.7 Native Compatibility: Updated BlueLine.uplugin from 5.5.0 to 5.7.0 to eliminate incompatible engine warning dialogs and enable headless automated test execution.
  • [:test_tube:] Full Automation Test Suite: 13/13 automation tests passing (100% success rate), including newly added FBlueLineGraphCleanerPureNodeFlowTest validating pure node left-to-right topological layout.

An attempt at a more interactive tutorial:

[1.2.1] update, 2026-09-17 :diamond_with_a_dot:

[Linter Overhaul - Results Panel, State Hygiene & Doc Update]

Illustrated Fix Map :screwdriver:

1. The Reachability Gap

The linter struggled with its results UI. Findings were written onto nodes as [Smell] badges
and the count went into a toast. On any graph larger than the viewport, the badges were
off-screen and the user saw nothing change.

  BEFORE                                   AFTER
  ------                                   -----
  Shift+L                                  Shift+L
     |                                        |
     +--> toast: "7 finding(s)"               +--> toast: "7 finding(s)"
     |       `- a number, nowhere to go       +--> +==========================+
     |                                        |    | Blueprint Linter   PANEL |
     +--> badges on nodes                     |    | click a row --> jump to  |
            |                                 |    +==========================+
            v                                 +--> badges on nodes
      +---------------+                       +--> Message Log listing
      |   viewport    |                       `--> Output Log, 1 line / finding
      |               |  <-- you are here
      +---------------+
              .  .  .  .  .  .  .
                    +--------+
                    | NOTE!  |  <-- finding, 3000px off-screen,
                    +--------+      unreachable by any means
  • [:magnifying_glass_tilted_right:] New: Blueprint Linter Panel (Window > Tools > Blueprint Linter). A dockable
    nomad tab listing every finding with severity, node and rule. Clicking a row jumps the
    graph editor to that node and selects it.
    Opens itself when a run finds something.
    Carries Lint Active Graph and Clear buttons, so the feature is reachable without
    knowing the hotkey.
  • [:clipboard:] Findings Retained: new FBlueLineLintFinding { Node, NodeTitle, Message, Severity }. Results live on FBlueLineLinter, not in the widget, so the tab can be
    closed, reopened, or opened for the first time long after a lint ran and still show them.
    NodeTitle is captured at lint time, so a row still reads sensibly after the node it
    refers to has been deleted.
  • [:stethoscope:] Per-Finding Output: the interactive path logged only a count - strictly less than
    the CI commandlet, which logged every violation. Now one LogBlueLineCore line per
    finding, plus a clickable entry in a BlueLine Linter Message Log listing.

2. One Keystroke, One Full Graph Rebuild

LintGraph ended with UEdGraph::NotifyGraphChanged(). Its default FEdGraphEditAction
is GRAPHACTION_Default, which SGraphPanel::OnGraphChanged answers with
PurgeVisualRepresentation() - destroying and recreating every node and pin widget in
the graph
, through BlueLine’s two globally registered factories.

  BEFORE                                    AFTER
  ------                                    -----
  NotifyGraphChanged()                      RefreshTouchedNodes(cleared + flagged)
         |                                         |
         v                                         v
  #===============================#         +------------------------------+
  # PurgeVisualRepresentation()   #         |  node 7   -- RefreshErrorInfo|
  #  +----++----++----++----+     #         |  node 23  -- RefreshErrorInfo|
  #  | X  || X  || X  || X  | ... #         +------------------------------+
  #  +----++----++----++----+     #
  #  every widget destroyed and   #          everything else in the graph
  #  rebuilt through BlueLine's   #          is left completely alone
  #  global pin + connection      #
  #  factories                    #
  #===============================#
  • [:high_voltage:] Targeted Repaint: SGraphPanel::GetNodeWidgetFromGuid +
    SGraphNode::RefreshErrorInfo on only the nodes that gained or lost a badge. Nodes
    losing a badge are repainted too - the clear pass now reports which nodes it touched.
    Where focus detection degrades and no panel is reachable, it falls back to the old notify
    so badges are still guaranteed to update; correctness wins over the saving on that path.

3. [Smell] Was Leaking Into Saved Assets

bHasCompilerMessage, ErrorType and ErrorMsg are plain UPROPERTY() on
UEdGraphNode - not Transient. Linter text was therefore serialized into .uasset
files on save, and FCompilerResultsLog::AnnotateNode appends rather than replaces when
bHasCompilerMessage is already set.

  BEFORE                                        AFTER
  ------                                        -----
  lint --> [Smell] Tick Abuse: ...              lint --> [Smell] Tick Abuse: ...
    |                                             |
    +- save ----> ###################             +- PreSave ----> scrubbed --> clean asset
    |             # written into    #             |
    |             # the .uasset     #             +- PreCompile -> scrubbed --> compiler
    |             ###################             |                output is the
    |                                             |                compiler's alone
    `- compile -> "[Smell] Tick Abuse: ...        |
                   Accessed None reading Foo"     `- real errors still never overwritten
                   `- two systems' text fused        in either direction
                      into one message
  • [:soap:] Pre-Save and Pre-Compile Scrubbers: FCoreUObjectDelegates::OnObjectPreSave and
    GEditor->OnBlueprintPreCompile() clear the linter’s own messages first. [Smell] text
    never reaches a saved asset and never mixes into compiler output.
  • [:soap:] Commandlet Cleans Up: BlueLineLinterCommandlet now clears messages after
    reporting them, instead of leaving them on nodes for the next save to bake in.

4. Every Blueprint Reported a Finding Nobody Could Act On

CheckOrphanedNodes exempted comments, reroute knots and events - but not graph boundary
nodes. An empty Construction Script is precisely one unwired entry node, so every Blueprint
in a project reported at least one phantom orphan.

        node has no connections?
                  |
       +----------+----------+
       v                     v
    EXEMPT                 FLAG IT
  +----------------+     +--------------+
  | Comment        |     | leftover     |
  | Knot           |     | experiment   |
  | Event          |     | nodes        |
  |----------------|     +--------------+
  | FunctionEntry  | <-- NEW: these exist because the graph
  | FunctionResult |     exists. An unwired one is not a
  | Tunnel         |     leftover, it is the graph's edge.
  +----------------+

   whole-project sweep over stock engine content:
     total findings      313 --> 285
     orphaned node       217 --> 189
     entry / ctor-script  36 -->  21   (remainder are ControlRig RigVM
                                        graphs, a different node system)
  • [:door:] Structural Nodes Exempt: UK2Node_FunctionTerminator (function and
    construction-script entry nodes, return nodes) and UK2Node_Tunnel (macro and
    collapsed-graph boundaries) no longer count as orphans. The exemption is deliberately
    narrow - a genuine leftover node is still flagged, and a test asserts exactly that.

5. Documentation Corrected Against Source

  • [:open_book:] Linter Section Rewritten
  • [:open_book:] WIP Setting Removed: the FAQ claimed the onboarding wizard could “configure
    linter strictness”. That is a work-in-progress.
  • [:open_book:] CI Claims Corrected: BlueLine.html said the headless commandlet “reads linter
    preferences and fails builds if code smells exceed thresholds”. That is a work-in-progress.
  • [:open_book:] Stale Hotkey Comments: FBlueLineCommands.h and BlueLineGraphModule.cpp both
    commented Shift+Alt+L. The registered chord is, and always was, Shift+L.

Verification

+--------------------------------------------------------------------------+
|                    UE 5.5      UE 5.6      UE 5.7      UE 5.8            |
+--------------------------------------------------------------------------+
| Win64 strict       PASS        PASS        PASS        PASS              |
| Unity blobs        7           7           7           7                 |
| Linux leg          87 acts     70 acts     70 acts     75 acts           |
| Automation suite   23/23       23/23       23/23       23/23             |
+--------------------------------------------------------------------------+
   archives 419,244 bytes each - identical size confirms one source state
  • [:test_tube:] Suite Grown 16 → 23: new coverage for retained findings, severity labels
    matching SGraphNode::UpdateErrorInfo, node-title capture, clear-preserves-compiler-
    messages, touched-node reporting, the entry-node exemption, and panel construction.

[1.3.0] update, 2026-09-28 :blue_book: :plus:

A modernization update:

  • every command answers, so no BlueLine command may ever do nothing silently.
  • ToolMenus.
  • LOOPBACK: a BlueLine in-editor game that replaces the old “Spawn Messy Demo” with a real, playable game whose rules are a real Blueprint for BlueLine to tidy.
  • Linter finalization: finish the job v1.2.1 started for the linter.

Symbol Legend

  • [:bell:] Every command reports what it did - an editor toast and a log line
  • [:compass:] Graph context menus moved to UToolMenus
  • [:gear:] Settings export / import / reset rebuilt on reflection
  • [:bullseye:] Focus and repaint fixes
  • [:right_arrow_curving_left:] Undo fix in the level tools
  • [:factory:] Linter commandlet scoped to Blueprint graphs
  • [:video_game:] LOOPBACK - the new demo game, generated in your own project
  • [:broom:] Code modernization
  • [:test_tube:] 23 → 30 automation tests

Illustrated Fix Map

1. The Silent No-Op

1.2.1 fixed the linter’s persistent problem. Other commands still had it: some
reported only to the log, several only at Verbose, and a hotkey pressed with no graph
focused, no selection, or the feature switched off in settings looked exactly like a hotkey
that was never received.

  BEFORE (1.2.1)                              AFTER (1.3.0)
  --------------                              -------------
  Shift+R, nothing selected                   Shift+R, nothing selected
     |                                           |
     +--> return;             (silence)          +--> "Rigidify Wires: select two or more
                                                 |     connected nodes."
  Shift+Q, Auto-Format off in settings           |
     |                                        Shift+Q, Auto-Format off in settings
     +--> toast: "arranged 12 nodes"             |
            `- it had arranged nothing           +--> "Auto-Format is turned off. Enable it
                                                       in Editor Preferences > ..."
  Shift+C                                     Shift+C
     |                                           |
     +--> graph moves. How much better?          +--> "Clean Graph: arranged 109 nodes in
            Nobody could say.                          EventGraph - wire crossings 445 -> 129."
  • [:bell:] FBlueLineNotify (BlueLineCore): one call site for every outcome - toast plus
    LogBlueLineCore line, recorded for tests. Used by Auto-Format, Rigidify Wires, Clean
    Graph, Straighten Connections, Cleanup Auto-Reroutes, the Blueprint Linter, Auto-Tag,
    Export to Text, Extract to Subsystem, bookmarks (set / jump / clear), snippets (create /
    insert / delete), Toggle Wire Style, and the level tools (pivot to center / bottom, snap
    to cursor, select by material).
  • [:bell:] Clean Graph measures itself: wire crossings are counted before and after, and the
    toast reports both. The graph is then framed (zoom to fit) so the result is on screen.
  • [:bell:] Auto-Tag reports how many tagged comment boxes it created - or, when it created
    none, why.
  • [:bell:] Disabled commands say so. Auto-Tag’s hotkey used a CanExecute gate, which made
    it a silent no-op when Smart Tags were off; it now runs and explains. Auto-Format used to
    report success while disabled.
  • [:bell:] Export to Text copies to the clipboard as well as offering the save dialog, and
    the toast says which happened. The dialog is now parented to the editor window.

2. Context Menus on UToolMenus

  BEFORE                                         AFTER
  ------                                         -----
  FGraphEditorModule::                           UToolMenus
    GetAllGraphEditorContextMenuExtender()         "GraphEditor.GraphContextMenu.EdGraphSchema"
      FExtender -> "EdGraphSchemaOrganization"        + dynamic section, reads
      actions re-resolve the graph from                  UGraphNodeContextMenuContext
      keyboard focus after the menu closes            + graph-wide actions act on the graph
                                                        that was right-clicked
  + a ToolMenus entry on "GraphEditor.GraphContext"
      `- no such menu exists; never shown
  • [:compass:] Right-click any node: BlueLine Layout (Clean Graph, Auto-Format, Rigidify,
    Toggle Wire Style, Cleanup Auto-Reroutes), BlueLine Analyze (Blueprint Linter, Export
    to Text), BlueLine Reuse (snippets, Extract to Subsystem) and BlueLine Smart Tags
    (Auto-Tag), each showing its hotkey. Right-click a connected pin: Straighten
    Connections
    .
  • [:compass:] Removed the “Spawn Messy Demo” entries (see LOOPBACK below). The hidden demo K2
    node classes are kept so existing assets that contain them still load.

3. Settings That Round-Trip

  • [:gear:] Export / Import is reflection-driven. The 1.2 exporter was ~200 lines of
    hand-written fields and had already drifted: WireSnapRadius, bEnableWireSnapping and
    AutoRouteMaxNodes were never exported. Format 2 writes all 61 editable settings, and any
    setting added later is included automatically. Files written by 1.x still import.
  • [:gear:] Reset to Defaults resets. It copied the class default object onto itself - which
    is the object Editor Preferences edits, already overwritten by config - so it changed
    nothing. Constructor defaults are now captured before config loads, and restored from that.
  • [:gear:] The PRAGMA_DISABLE_DEPRECATION_WARNINGS block around import is gone.

4. Focus and Repaint

  • [:bullseye:] Auto-Tag no longer eats the next hotkey. It added comment boxes as “user” actions,
    which made the graph panel open an inline rename on the new comment and take keyboard
    focus; it then purged and rebuilt the whole graph. The next BlueLine hotkey went nowhere
    until the graph was clicked again. Comments are now added as non-UI actions and the
    whole-graph purge is gone (UEdGraph::AddNode already notifies the panel).
  • [:bullseye:] Auto-Tag boxes keep their titles and colours. The engine’s comment defaults
    (UEdGraphNode_Comment::PostPlacedNewNode) were applied after BlueLine set the title and
    colour, so every auto-tagged box has read “Comment” in the default colour since the feature
    shipped. The defaults now apply first. The tag palette is toned down to tints - the
    full-strength colours, never seen until now, filled whole boxes and drowned their nodes.
    BlueLine.SmartTags.AutoTag.PersistsMetadata now asserts the title and colour.
  • [:bullseye:] Clean Graph no longer stacks tall nodes. Blueprint nodes leave NodeWidth /
    NodeHeight at 0, so the cleaner sized every node as 200 x 90: an event with five outputs
    was overlapped by the next node in its column, and wide nodes ran into the next column.
    Sizes are now estimated from the title and the visible pins, and each column starts past
    the widest node of the one before.
  • [:bullseye:] The Setup Wizard stays closed. Only its Finish Setup button marked it as seen; a
    wizard dismissed with the title-bar close button came back at every editor launch. Closing
    it either way now counts.
  • [:bullseye:] The wizard’s showcase button works. “Open Showcase Blueprint” opened two assets that
    ship in no project, so it did nothing. It is now Open LOOPBACK Demo: it opens
    BP_LoopbackDirector, building the demo first if needed.

5. Undo in the Level Tools

  • [:right_arrow_curving_left:] Pivot to Center / Bottom and Snap to Cursor on an actor whose root is a plain
    SceneComponent (most Blueprint actors) moved the actor without calling Modify() on
    the root component - where the location actually lives - so Ctrl+Z could not move it
    back. Fixed.

6. Linter Commandlet

  • [:factory:] -run=BlueLineLinter lints Blueprint (K2) graphs only by default. Every rule
    targets Blueprint script nodes; on a stock project 55% of 1.2.1’s findings came from
    ControlRig (RigVM) graphs. New switches: -AllGraphs (previous behaviour) and
    -Path=/Game/Folder. The summary line now reports Blueprints, graphs linted and graphs
    skipped; output moved from LogTemp to LogBlueLineCore.

7. LOOPBACK - the Demo, Reinvented

  1.2.x "Spawn Messy Demo"                     1.3.0 Tools > BlueLine > Build Loopback Demo
  ------------------------                     ---------------------------------------------
  7 placeholder nodes                          a playable game, generated in YOUR project:
  (KingSafety / AWSTag)                          M_LoopbackNeon / Glow / Grid   materials
  wired at random                                31 CC0 sounds + music          imported
  compiles to nothing                            L_Loopback                     level
                                                 BP_LoopbackDirector            109 nodes,
                                                   the game's real rules,       132 wires,
                                                   laid out as spaghetti        4 lint smells
  • [:video_game:] The game: you are an exec pulse dragging a BlueLine wire across a Blueprint-graph
    arena. Close a loop to compile every bug inside it. Waves, combos, a boss (the Spaghetti
    Monster) every fifth wave, lives, high score, title / attract mode and game over.
    Power-ups are BlueLine features: Rigidify (90-degree steering), Auto-Format
    (magnet), Lint (shockwave), Bookmark (extra life). Keyboard or gamepad.
  • [:video_game:] The point: every rule event (OnLoopClosed, OnPlayerHit, OnPickupCollected,
    OnWaveCleared, OnGameStarted, OnGameOver) is overridden in BP_LoopbackDirector,
    which is generated deliberately messy. Clean Graph, Auto-Tag, the Linter (it finds a Long
    Sequence, Deep Nesting, Tick Abuse and an Orphaned Node), Export to Text, bookmarks,
    snippets and Extract to Subsystem all have real logic to work on - and the game plays
    identically before and after.
  • [:video_game:] Nothing binary ships. The game is C++ in BlueLineRuntime built from engine
    basic shapes; the new BlueLineDemo editor module generates the materials, imports the
    audio from Resources/Demo/Audio and writes the Blueprint and level with your engine
    version. Rebuilding updates the demo in place. Headless: -run=BlueLineBuildDemo.
  • [:video_game:] Audio: 21 sound effects and 6 jingles from Kenney’s CC0 packs, 3 CC0 music tracks
    from OpenGameArt (mintodog, vitalezzz), and one synthesised countdown beep. Sources and licences in
    Resources/Demo/Audio/CREDITS.md.
  • [:video_game:] Recordable with Movie Render Queue. The HUD is painted into a viewport widget, which
    MRQ’s UI Renderer pass records (MRQ does not capture canvas HUDs), and the player
    controller ignores cinematic mode, which MRQ turns on to hide the player. Capture aids:
    Loopback.Autopilot 1 (the game plays itself) and Loopback.StartWave N. In an MRQ
    config, point Game Overrides’ game mode at BLLoopbackGameMode - its default,
    MoviePipelineGameMode, replaces the game.
  • [:video_game:] Console command BlueLine.BuildLoopbackDemo: the same action as the menu entry.
  • [:video_game:] The autopilot circles the boss where it is now, not where it stood when the loop
    began - the boss chases the pulse, so the old loops drifted off it and attract mode could
    not clear wave 5.

8. Code

  • [:broom:] BlueLineGraphModule.cpp 687 → 203 lines: the snippet dialogs moved to
    BlueLineGraphActions, holding their widgets weakly (the old state object and its
    widgets kept each other alive after the dialog closed); bookmarks bind from a table.
  • [:broom:] UE_VERSION_OLDER_THAN replaces hand-rolled ENGINE_MINOR_VERSION checks.
  • [:broom:] Toggle Wire Style derives its cycle from the enum instead of a literal 4.
  • [:broom:] FBlueLineLinter and FBlueLineGraphCleaner are exported (BLUELINEGRAPH_API).
  • [:broom:] Linux on UE 5.8 (clang 20) rejected a for loop that returned on its first pass
    (-Wunreachable-code-loop-increment, an error under the engine’s warning set); found by the
    packaging matrix and rewritten without the loop.

9. Tests

  • [:test_tube:] New: BlueLine.Core.Notify.RecordsEveryMessage,
    BlueLine.Core.Settings.JsonRoundTrip, .LegacyFormatImport,
    .ResetRestoresFactoryDefaults, BlueLine.Demo.RulesBlueprintCompiles,
    .LinterFindsTheFourSmells, .CleanGraphUntanglesRules. The last one measures the
    generated rules: 482 wire crossings before Clean Graph, 139 after.

1.3.0 comes with a new demo:

A features tutorial that compliments the above demo guide: