- Restructure docs/ folder (remove numeric prefixes): - 04_USER_GUIDES -> guides/ - 05_API_REFERENCE -> api/ - 06_PHYSICS -> physics/ - 07_DEVELOPMENT -> development/ - 08_ARCHIVE -> archive/ - 09_DIAGRAMS -> diagrams/ - Replace tagline 'Talk, don't click' with 'LLM-driven optimization framework' in 9 files - Create comprehensive docs/GETTING_STARTED.md: - Prerequisites and quick setup - Project structure overview - First study tutorial (Claude or manual) - Dashboard usage guide - Neural acceleration introduction - Rewrite docs/00_INDEX.md with correct paths and modern structure - Archive obsolete files: - 01_PROTOCOLS.md -> archive/historical/01_PROTOCOLS_legacy.md - 03_GETTING_STARTED.md -> archive/historical/ - ATOMIZER_PODCAST_BRIEFING.md -> archive/marketing/ - Update timestamps to 2026-01-20 across all key files - Update .gitignore to exclude docs/generated/ - Version bump: ATOMIZER_CONTEXT v1.8 -> v2.0
30 KiB
Atomizer Canvas - Visual Workflow Builder
Last Updated: January 17, 2026 Version: 3.1 (AtomizerSpec v2.0) Status: Production
Overview
The Atomizer Canvas is a visual, node-based workflow builder for designing optimization studies. It provides a drag-and-drop interface for configuring FEA optimizations that integrates with Claude to validate and execute workflows.
New in v3.1: The Canvas now uses AtomizerSpec v2.0 as the unified configuration format. All studies are defined by a single atomizer_spec.json file that serves as the single source of truth for Canvas, Backend, Claude, and the Optimization Engine.
Key Features
- Visual Workflow Design: Drag-and-drop nodes to build optimization pipelines
- Professional Lucide Icons: Clean, consistent iconography throughout the interface
- AtomizerSpec v2.0: Unified JSON spec format (
atomizer_spec.json) for all configuration - Auto-Load from Studies: Import existing studies (supports both v2.0 specs and legacy configs)
- NX Model Introspection: Automatically extract expressions from .prt/.sim/.fem files
- File Browser: Browse and select model files with type filtering
- Expression Search: Searchable dropdown for design variable configuration
- One-Click Add: Add discovered expressions as design variables instantly
- Custom Extractors: Define custom Python extraction functions directly in the spec
- Claude Integration: "Process with Claude" button for AI-assisted study creation
- Real-time Sync: WebSocket-based synchronization between clients
- Responsive Layout: Full-screen canvas that adapts to window size
What's New in V3.1
| Feature | Description |
|---|---|
| AtomizerSpec v2.0 | Unified configuration format replacing optimization_config.json |
| Spec REST API | Full CRUD operations on spec via /api/studies/{id}/spec |
| Custom Extractors | Define custom Python functions as extractors in the spec |
| WebSocket Sync | Real-time spec synchronization between clients |
| Legacy Migration | Automatic migration of old optimization_config.json files |
What's New in V3.0
| Feature | Description |
|---|---|
| File Browser | Browse studies directory for .sim/.prt/.fem/.afem files |
| Introspection Panel | View discovered expressions, extractors, and dependencies |
| One-Click Add | Add expressions as design variables with a single click |
| Claude Fixes | Fixed SQL errors, WebSocket reconnection issues |
| Health Check | /api/health endpoint for database monitoring |
Architecture
Frontend Stack
| Component | Technology | Purpose |
|---|---|---|
| Flow Engine | React Flow | Node-based graph rendering |
| State Management | Zustand | Canvas state (nodes, edges, selection) |
| Icons | Lucide React | Professional icon library |
| Styling | Tailwind CSS | Dark theme (Atomaster palette) |
| Chat | WebSocket | Real-time Claude communication |
Node Types (8)
| Node | Icon | Description | Color |
|---|---|---|---|
| Model | Cube |
NX model file (.prt, .sim, .fem) | Blue |
| Solver | Cpu |
Nastran solution type (SOL101, SOL103, etc.) | Violet |
| Design Variable | SlidersHorizontal |
Parameter to optimize with bounds | Emerald |
| Extractor | FlaskConical |
Physics result extraction (E1-E10) | Cyan |
| Objective | Target |
Optimization goal (minimize/maximize) | Rose |
| Constraint | ShieldAlert |
Design constraint (upper/lower bounds) | Amber |
| Algorithm | BrainCircuit |
Optimization method (TPE, CMA-ES, NSGA-II) | Indigo |
| Surrogate | Rocket |
Neural acceleration (optional) | Pink |
File Structure
atomizer-dashboard/frontend/src/
├── components/canvas/
│ ├── AtomizerCanvas.tsx # Main canvas component
│ ├── nodes/
│ │ ├── index.ts # Node type registry
│ │ ├── BaseNode.tsx # Base node with handles
│ │ ├── ModelNode.tsx # Model file node
│ │ ├── SolverNode.tsx # Solver type node
│ │ ├── DesignVarNode.tsx # Design variable node
│ │ ├── ExtractorNode.tsx # Extractor node
│ │ ├── ObjectiveNode.tsx # Objective node
│ │ ├── ConstraintNode.tsx # Constraint node
│ │ ├── AlgorithmNode.tsx # Algorithm node
│ │ ├── SurrogateNode.tsx # Surrogate node
│ │ └── CustomExtractorNode.tsx # Custom extractor node (V3.1)
│ ├── panels/
│ │ ├── NodeConfigPanel.tsx # Node configuration sidebar
│ │ ├── ValidationPanel.tsx # Validation toast display
│ │ ├── ExecuteDialog.tsx # Execute confirmation modal
│ │ ├── ChatPanel.tsx # Claude chat sidebar
│ │ ├── ConfigImporter.tsx # Study import dialog
│ │ ├── TemplateSelector.tsx # Workflow template chooser
│ │ ├── FileBrowser.tsx # File picker modal (V3)
│ │ ├── IntrospectionPanel.tsx # Model introspection results (V3)
│ │ ├── ExpressionSelector.tsx # Expression search dropdown (V3)
│ │ └── CustomExtractorPanel.tsx # Code editor for custom extractors (V3.1)
│ └── palette/
│ └── NodePalette.tsx # Draggable node palette
├── hooks/
│ ├── useCanvasStore.ts # Zustand store for canvas state
│ ├── useSpecStore.ts # Zustand store for AtomizerSpec (V3.1)
│ ├── useSpecSync.ts # WebSocket spec sync (V3.1)
│ └── useCanvasChat.ts # Claude chat integration
├── lib/
│ ├── canvas/
│ │ ├── schema.ts # TypeScript type definitions
│ │ ├── intent.ts # Intent serialization (legacy)
│ │ ├── validation.ts # Graph validation logic
│ │ └── templates.ts # Workflow templates
│ └── spec/
│ └── converter.ts # AtomizerSpec ↔ ReactFlow converter (V3.1)
├── types/
│ └── atomizer-spec.ts # AtomizerSpec TypeScript types (V3.1)
└── pages/
└── CanvasView.tsx # Canvas page (/canvas route)
Backend File Structure (V3.1)
atomizer-dashboard/backend/api/
├── services/
│ ├── spec_manager.py # SpecManager - load/save/validate specs
│ ├── claude_agent.py # Claude API integration
│ └── context_builder.py # Context assembly with spec awareness
└── routes/
├── spec.py # AtomizerSpec REST API endpoints
└── optimization.py # Optimization endpoints
optimization_engine/
├── config/
│ ├── spec_models.py # Pydantic models for AtomizerSpec
│ ├── spec_validator.py # Semantic validation
│ └── migrator.py # Legacy config migration
├── extractors/
│ └── custom_extractor_loader.py # Runtime custom function loader
└── schemas/
└── atomizer_spec_v2.json # JSON Schema definition
User Interface
Layout
┌───────────────────────────────────────────────────────────────────┐
│ Canvas Builder Templates Import│
├──────────┬────────────────────────────────────────────┬───────────┤
│ │ │ │
│ Node │ Canvas Area │ Config │
│ Palette │ │ Panel │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ [Model] │ │Model├──────│Solver├──────│Algo │ │ Label: │
│ [Solver]│ └─────┘ └──┬──┘ └─────┘ │ [____] │
│ [DVar] │ │ │ │
│ [Extr] │ ┌─────┐ ┌──┴──┐ ┌─────┐ │ Type: │
│ [Obj] │ │ DVar├──────│Extr ├──────│ Obj │ │ [____] │
│ [Const] │ └─────┘ └─────┘ └─────┘ │ │
│ [Algo] │ │ │
│ [Surr] │ │ │
│ │ │ │
├──────────┴────────────────────────────────────────────┴───────────┤
│ [Validate] [Process with Claude] │
└───────────────────────────────────────────────────────────────────┘
Dark Theme (Atomaster Palette)
| Element | Color | Tailwind Class |
|---|---|---|
| Background | #050A12 |
bg-dark-900 |
| Surface | #0A1525 |
bg-dark-850 |
| Card | #0F1E32 |
bg-dark-800 |
| Border | #1A2F4A |
border-dark-700 |
| Muted Text | #5A7A9A |
text-dark-400 |
| Primary | #00D4E6 |
text-primary-400 |
Core Workflows
1. Building a Workflow
- Drag nodes from the left palette onto the canvas
- Connect nodes by dragging from output handle to input handle
- Configure nodes by clicking to open the config panel
- Validate using the Validate button
- Process with Claude to create the study
2. Importing from Existing Study
- Click Import in the header
- Select the Load Study tab
- Search for your study by name
- Select a study with an optimization_config.json
- Click Load Study to populate the canvas
3. Using Templates
- Click Templates in the header
- Browse available workflow templates:
- Mass Minimization: Single-objective mass reduction
- Multi-Objective: Pareto optimization (mass + displacement)
- Turbo Mode: Neural-accelerated optimization
- Mirror WFE: Zernike wavefront error optimization
- Frequency Target: Natural frequency optimization
- Click a template to load it
4. Processing with Claude
- Build and configure your workflow
- Click Validate to check for errors
- Click Process with Claude to:
- Validate the configuration against Atomizer protocols
- Receive recommendations (method selection, trial count)
- Create the optimization study
Node Configuration
Model Node
| Field | Description | Example |
|---|---|---|
| File Path | Path to NX model | models/bracket.sim |
| File Type | prt, sim, or fem | sim |
When loading a .sim file, the system introspects to find:
- Linked
.prt(geometry part) - Linked
.fem(FEM file) - Solver type (SOL101, SOL103, etc.)
- Available expressions
Design Variable Node
| Field | Description | Example |
|---|---|---|
| Expression Name | NX expression to vary | thickness |
| Min Value | Lower bound | 5.0 |
| Max Value | Upper bound | 15.0 |
| Unit | Engineering unit | mm |
Expression Selector: Click the dropdown to:
- Search through available expressions
- Filter by name
- Refresh to reload from model
- Enter manually if expression not found
Extractor Node
| Field | Description | Options |
|---|---|---|
| Extractor ID | Protocol E1-E10 | E1 (Displacement), E2 (Frequency), etc. |
| Name | Display name | max_displacement |
| Config | Extractor-specific settings | Node ID, component, etc. |
Available Extractors (SYS_12):
| ID | Physics | Function |
|---|---|---|
| E1 | Displacement | extract_displacement() |
| E2 | Frequency | extract_frequency() |
| E3 | Stress | extract_solid_stress() |
| E4 | BDF Mass | extract_mass_from_bdf() |
| E5 | CAD Mass | extract_mass_from_expression() |
| E8 | Zernike | extract_zernike_coefficients() |
| E9 | Zernike | extract_zernike_rms() |
| E10 | Zernike | extract_zernike_wfe() |
Objective Node
| Field | Description | Options |
|---|---|---|
| Name | Objective identifier | mass, displacement |
| Direction | Optimization goal | minimize, maximize |
| Weight | Multi-objective weight | 1.0 (0.0-10.0) |
Constraint Node
| Field | Description | Example |
|---|---|---|
| Name | Constraint identifier | max_stress |
| Operator | Comparison type | <=, >=, == |
| Value | Threshold value | 250.0 |
Algorithm Node
| Field | Description | Options |
|---|---|---|
| Method | Optimization algorithm | TPE, CMA-ES, NSGA-II, GP-BO |
| Max Trials | Number of trials | 100 |
| Timeout | Optional time limit | 3600 (seconds) |
Method Selection (SYS_15):
| Method | Best For | Design Vars | Objectives |
|---|---|---|---|
| TPE | General purpose | 1-10 | 1 |
| CMA-ES | Many variables | 5-100 | 1 |
| NSGA-II | Multi-objective | 1-20 | 2-4 |
| GP-BO | Expensive evaluations | 1-10 | 1 |
Surrogate Node
| Field | Description | Options |
|---|---|---|
| Enabled | Toggle acceleration | true/false |
| Model Type | Surrogate architecture | MLP, GNN, Auto |
| Min Trials | Trials before activation | 20 |
Custom Extractors (V3.1)
Custom extractors allow you to define arbitrary Python extraction functions directly in the AtomizerSpec. These functions are validated for safety and executed during optimization.
Creating a Custom Extractor
- Add a Custom Extractor node from the palette
- Open the Code Editor in the config panel
- Write your extraction function following the required signature
- The code is validated in real-time for:
- Correct function signature
- Allowed imports only (numpy, pyNastran)
- No dangerous operations (os.system, exec, eval, etc.)
Function Signature
def extract(op2_path, bdf_path=None, params=None, working_dir=None):
"""
Custom extraction function.
Args:
op2_path: Path to the .op2 results file
bdf_path: Path to the .bdf mesh file (optional)
params: Dict of current design variable values (optional)
working_dir: Path to the trial working directory (optional)
Returns:
Dict with output values, e.g., {"custom_metric": 42.0}
"""
import numpy as np
from pyNastran.op2.op2 import OP2
op2 = OP2()
op2.read_op2(op2_path)
# Your extraction logic here
result = np.max(op2.displacements[1].data)
return {"custom_metric": result}
Allowed Imports
| Module | Usage |
|---|---|
numpy |
Numerical operations |
pyNastran |
OP2/BDF file parsing |
math |
Basic math functions |
pathlib |
Path manipulation |
Security Restrictions
The following are NOT allowed in custom extractor code:
import os,import subprocess,import sysexec(),eval(),compile()__import__(),open()with write mode- Network operations
- File system modifications outside working_dir
Example: Custom Stress Ratio Extractor
def extract(op2_path, bdf_path=None, params=None, working_dir=None):
"""Extract stress ratio (max_stress / allowable)."""
import numpy as np
from pyNastran.op2.op2 import OP2
op2 = OP2()
op2.read_op2(op2_path)
# Get von Mises stress from solid elements
stress_data = op2.ctetra_stress[1].data
max_von_mises = np.max(stress_data[:, :, 7]) # Column 7 is von Mises
allowable = 250.0 # MPa
stress_ratio = max_von_mises / allowable
return {
"stress_ratio": stress_ratio,
"max_stress_mpa": max_von_mises
}
File Browser (V3)
The File Browser allows you to navigate the studies directory to select model files.
Features
- Directory Navigation: Browse folder hierarchy with breadcrumbs
- Type Filtering: Filters to
.sim,.prt,.fem,.afemby default - Search: Quick search by file name
- Single-Click Select: Click a file to select and close
Usage
- Click the Browse button (folder icon) next to the Model file path input
- Navigate to your study folder
- Click a model file to select it
- The path is automatically populated in the Model node
Model Introspection (V3)
Model Introspection analyzes NX model files to discover expressions, solver type, and dependencies.
Features
- Expression Discovery: Lists all expressions found in the model
- Solver Detection: Infers solver type from file contents (SOL101, SOL103, etc.)
- Dependency Tracking: Shows related .prt, .fem, .afem files
- Extractor Suggestions: Recommends extractors based on solver type
- One-Click Add: Add expressions as Design Variables instantly
Usage
- Configure a Model node with a valid file path
- Click Introspect Model button
- View discovered expressions, extractors, and files
- Click + next to any expression to add as Design Variable
- Click + next to any extractor to add to canvas
Discovered Information
| Section | Contents |
|---|---|
| Solver Type | Detected solver (SOL101, SOL103, etc.) |
| Expressions | Name, current value, unit |
| Extractors | Available extractors for this solver |
| Dependent Files | Related .prt, .fem, .afem files |
API Integration
Backend Endpoints
AtomizerSpec REST API (V3.1)
The spec API provides full CRUD operations on the unified AtomizerSpec:
GET /api/studies/{study_id}/spec # Get full AtomizerSpec
Returns: AtomizerSpec JSON with meta, model, design_variables, extractors, objectives, constraints, optimization, canvas
PUT /api/studies/{study_id}/spec # Replace entire spec
Body: AtomizerSpec JSON
Returns: { hash: string, warnings: [] }
PATCH /api/studies/{study_id}/spec # Partial update (JSONPath)
Body: { path: "design_variables[0].bounds.max", value: 15.0, modified_by: "canvas" }
Returns: { hash: string }
POST /api/studies/{study_id}/spec/validate # Validate spec
Returns: { valid: boolean, errors: [], warnings: [] }
POST /api/studies/{study_id}/spec/nodes # Add node (design var, extractor, etc.)
Body: { type: "designVar", data: {...}, modified_by: "canvas" }
Returns: { node_id: "dv_002", hash: string }
PATCH /api/studies/{study_id}/spec/nodes/{id} # Update node
Body: { updates: {...}, modified_by: "canvas" }
Returns: { hash: string }
DELETE /api/studies/{study_id}/spec/nodes/{id} # Remove node
Query: modified_by=canvas
Returns: { hash: string }
POST /api/studies/{study_id}/spec/edges # Add edge connection
Query: source=ext_001&target=obj_001&modified_by=canvas
Returns: { hash: string }
Study Configuration
GET /api/studies/ # List all studies
GET /api/studies/{path}/config # Get optimization_config.json (legacy)
File Browser (V3)
GET /api/files/list # List files in directory
Query: path=subdir&types=.sim,.prt,.fem,.afem
Returns: { files: [{name, path, isDirectory}], path }
NX Introspection (V3)
POST /api/nx/introspect # Introspect NX model file
Body: { file_path: string }
Returns: {
file_path, file_type, expressions, solver_type,
dependent_files, extractors_available, warnings
}
GET /api/nx/expressions # Get expressions from model
Query: file_path=path/to/model.sim
Returns: { expressions: [{name, value, unit, type}] }
Health Check (V3)
GET /api/health # Check database and service health
Returns: { status: "healthy", database: "connected" }
MCP Canvas Tools
The Canvas integrates with the MCP server for Claude tool use:
validate_canvas_intent
Validates an optimization intent from the Canvas.
{
intent: OptimizationIntent // The canvas workflow as JSON
}
// Returns: { valid, errors, warnings, recommendations }
execute_canvas_intent
Creates an optimization study from a validated intent.
{
intent: OptimizationIntent,
study_name: string, // snake_case name
auto_run?: boolean // Start optimization immediately
}
// Returns: { study_path, config_path, status }
interpret_canvas_intent
Analyzes a Canvas intent and provides recommendations.
{
intent: OptimizationIntent
}
// Returns: {
// problem_type: "single-objective" | "multi-objective",
// complexity: "low" | "medium" | "high",
// recommended_method: string,
// recommended_trials: number,
// surrogate_recommended: boolean,
// notes: string[]
// }
AtomizerSpec v2.0 Schema
The Canvas uses AtomizerSpec v2.0 as the unified configuration format. This replaces the legacy optimization_config.json and OptimizationIntent with a single schema.
Core Structure
interface AtomizerSpec {
meta: {
version: "2.0";
created: string; // ISO timestamp
modified: string; // ISO timestamp
created_by: "canvas" | "claude" | "api" | "migration" | "manual";
modified_by: "canvas" | "claude" | "api" | "migration" | "manual";
study_name: string;
description?: string;
tags?: string[];
};
model: {
sim: { path: string; solver: string };
prt?: { path: string };
fem?: { path: string };
};
design_variables: DesignVariable[];
extractors: Extractor[];
objectives: Objective[];
constraints: Constraint[];
optimization: OptimizationConfig;
canvas: CanvasLayout;
}
Design Variable
interface DesignVariable {
id: string; // "dv_001", "dv_002", etc.
name: string; // Display name
expression_name: string; // NX expression name
type: "continuous" | "integer" | "categorical";
bounds: { min: number; max: number };
baseline?: number;
unit?: string;
enabled: boolean;
canvas_position: { x: number; y: number };
}
Extractor
interface Extractor {
id: string; // "ext_001", etc.
name: string; // Display name
type: string; // "mass", "displacement", "zernike_opd", "custom"
builtin: boolean; // true for E1-E10, false for custom
outputs: Array<{ name: string; units?: string }>;
config?: Record<string, unknown>;
custom_function?: { // For custom extractors only
code: string; // Python function code
entry_point: string; // Function name (default: "extract")
};
canvas_position: { x: number; y: number };
}
Objective
interface Objective {
id: string; // "obj_001", etc.
name: string; // Display name
direction: "minimize" | "maximize";
source: {
extractor_id: string; // Reference to extractor
output_name: string; // Which output from the extractor
};
weight?: number; // For weighted sum multi-objective
enabled: boolean;
canvas_position: { x: number; y: number };
}
Canvas Layout
interface CanvasLayout {
edges: Array<{ source: string; target: string }>;
layout_version: "2.0";
viewport?: { x: number; y: number; zoom: number };
}
Example AtomizerSpec
{
"meta": {
"version": "2.0",
"created": "2026-01-17T10:00:00Z",
"modified": "2026-01-17T10:30:00Z",
"created_by": "canvas",
"modified_by": "canvas",
"study_name": "bracket_mass_optimization",
"description": "Optimize bracket mass while maintaining stress limits"
},
"model": {
"sim": { "path": "bracket_sim1.sim", "solver": "nastran" }
},
"design_variables": [
{
"id": "dv_001",
"name": "Thickness",
"expression_name": "web_thickness",
"type": "continuous",
"bounds": { "min": 2.0, "max": 10.0 },
"baseline": 5.0,
"unit": "mm",
"enabled": true,
"canvas_position": { "x": 50, "y": 100 }
}
],
"extractors": [
{
"id": "ext_001",
"name": "Mass",
"type": "mass",
"builtin": true,
"outputs": [{ "name": "mass", "units": "kg" }],
"canvas_position": { "x": 740, "y": 100 }
}
],
"objectives": [
{
"id": "obj_001",
"name": "mass",
"direction": "minimize",
"source": { "extractor_id": "ext_001", "output_name": "mass" },
"enabled": true,
"canvas_position": { "x": 1020, "y": 100 }
}
],
"constraints": [],
"optimization": {
"algorithm": { "type": "TPE" },
"budget": { "max_trials": 100 }
},
"canvas": {
"edges": [
{ "source": "dv_001", "target": "model" },
{ "source": "model", "target": "solver" },
{ "source": "solver", "target": "ext_001" },
{ "source": "ext_001", "target": "obj_001" },
{ "source": "obj_001", "target": "optimization" }
],
"layout_version": "2.0"
}
}
Legacy OptimizationIntent (Deprecated)
The OptimizationIntent format is still supported for backwards compatibility but will be automatically converted to AtomizerSpec v2.0 when saved.
interface OptimizationIntent {
model: {
path: string;
type: 'prt' | 'sim' | 'fem';
};
solver: {
type: string; // SOL101, SOL103, etc.
};
design_variables: Array<{
name: string;
expression: string;
min: number;
max: number;
unit?: string;
}>;
extractors: Array<{
id: string; // E1, E2, etc.
name: string;
config?: Record<string, unknown>;
}>;
objectives: Array<{
name: string;
extractor: string;
direction: 'minimize' | 'maximize';
weight?: number;
}>;
constraints?: Array<{
name: string;
extractor: string;
operator: '<=' | '>=' | '==';
value: number;
}>;
optimization: {
method: string;
max_trials: number;
timeout?: number;
};
surrogate?: {
enabled: boolean;
model_type?: string;
min_trials?: number;
};
}
Validation Rules
The Canvas validates workflows against these rules:
Required Components
- At least 1 Model node
- At least 1 Solver node
- At least 1 Design Variable node
- At least 1 Objective node
- At least 1 Algorithm node
Configuration Rules
- All nodes must be configured (no empty fields)
- Design variable min < max
- Objective must connect to an Extractor
- Extractor ID must be valid (E1-E10)
Connection Rules
- Model → Solver (required)
- Solver → Extractor (required for each extractor)
- Extractor → Objective (required for each objective)
- Extractor → Constraint (optional)
Recommendations
- Multi-objective (2+ objectives) should use NSGA-II
- Many variables (5+) may benefit from surrogate
- High trial count (100+) should consider neural acceleration
Templates
Mass Minimization
Single-objective mass reduction with stress constraint.
- Nodes: 6 (Model, Solver, DVar, Extractor, Objective, Algorithm)
- Objective: Minimize mass
- Constraint: Max stress < limit
- Method: TPE (100 trials)
Multi-Objective
Pareto optimization for mass vs. displacement trade-off.
- Nodes: 7
- Objectives: Minimize mass, Minimize displacement
- Method: NSGA-II (150 trials)
Turbo Mode
Neural-accelerated optimization with surrogate.
- Nodes: 8 (includes Surrogate)
- Objective: User-defined
- Method: TPE + MLP Surrogate
- Trials: 50 FEA + 5000 surrogate
Mirror WFE
Zernike wavefront error optimization for optics.
- Nodes: 7
- Objective: Minimize WFE (E10)
- Method: CMA-ES (200 trials)
Frequency Target
Natural frequency optimization with modal analysis.
- Nodes: 6
- Objective: Target frequency (E2)
- Method: TPE (100 trials)
Keyboard Shortcuts
| Key | Action |
|---|---|
Delete / Backspace |
Delete selected node |
Escape |
Deselect all |
Ctrl+Z |
Undo (future) |
Ctrl+Shift+Z |
Redo (future) |
Space (hold) |
Pan canvas |
| Scroll | Zoom in/out |
Troubleshooting
Canvas Not Visible
- Ensure you're on the
/canvasroute - Check for JavaScript errors in browser console
- Verify React Flow is properly initialized
Nodes Not Draggable
- Check that drag-and-drop events are being captured
- Ensure
onDragStartsets the correct data type
Config Panel Not Updating
- Verify Zustand store is properly connected
- Check that
updateNodeDatais being called
Claude Chat Not Working
- Check WebSocket connection status (green indicator)
- Verify backend is running on port 8000
- Check
/api/chat/endpoint is accessible
Expression Dropdown Empty
- Ensure a Model node is configured with a file path
- Check
/api/nx/expressionsendpoint is working - Try the "Refresh" button to reload expressions
Development
Running Locally
# Frontend
cd atomizer-dashboard/frontend
npm install
npm run dev
# Backend
cd atomizer-dashboard/backend
python -m uvicorn api.main:app --reload --port 8000
# MCP Server
cd mcp-server/atomizer-tools
npm run build
npm run dev
Building for Production
# Frontend
cd atomizer-dashboard/frontend
npm run build
# MCP Server
cd mcp-server/atomizer-tools
npm run build
Adding New Node Types
- Create node component in
components/canvas/nodes/ - Add type to
schema.ts - Register in
nodes/index.ts - Add to
NodePalette.tsx - Update validation rules in
validation.ts - Add serialization logic to
intent.ts
References
- AtomizerSpec v2.0 Architecture: See
docs/plans/UNIFIED_CONFIGURATION_ARCHITECTURE.md - AtomizerSpec JSON Schema: See
optimization_engine/schemas/atomizer_spec_v2.json - React Flow Documentation: https://reactflow.dev/
- Lucide Icons: https://lucide.dev/icons/
- Zustand: https://github.com/pmndrs/zustand
- Atomizer Protocols: See
docs/protocols/ - Extractor Library: See
SYS_12_EXTRACTOR_LIBRARY.md - Method Selector: See
SYS_15_METHOD_SELECTOR.md
Canvas Builder: Design optimizations visually, execute with AI. Powered by AtomizerSpec v2.0 - the unified configuration format.