Changelog

What We Shipped

Every feature, improvement, and fix. Newest first.

Fix

DAG Mode Step Addition Fixes

Fixed several constraints from the old linear pipeline that broke in DAG mode.

  • Terminal steps no longer block adding more steps — adding a text/video/3D output step (alt text, product description, video generation) no longer prevents adding further steps. In DAG mode, new branches are always allowed.
  • Port type compatibility enforced on all insertion paths — the "+" button, context menu "Add step after", edge insert, and toolbar "Add Step" all now check port types before auto-connecting. Text output won't connect to image input; incompatible steps are added disconnected instead.
  • Toolbar "Add Step" creates disconnected nodes in DAG mode — instead of auto-chaining to the last step (which may be incompatible), new steps appear below with no connections for manual wiring.
  • Additional sources default to Library tab instead of Upload
  • Context menu "Add source" places the node at click position using screen-to-flow coordinate conversion
  • Source node tab styling fixed — Library/Upload/Generate tabs on additional sources now show proper active/hover states (was broken by Tailwind dynamic class purging)
  • Node positions persist across sessions — dragged node positions are saved to localStorage and restored on reload
New Feature

Multi-Channel Batch Export

Export images to multiple marketplace channels at once with organized ZIP downloads.

  • Multi-preset Smart Export — select multiple channels (Amazon, Shopify, Instagram, etc.) in the Smart Export modal and export all at once. Single preset still downloads directly; multiple presets download as a ZIP with per-channel subfolders.
  • Batch Export from Library — select multiple assets in the DAM, click Smart Export in the batch action bar or context menu, choose channels and preprocessing options, then export all combinations (assets × channels) as an organized ZIP.
  • Processing pipeline — optional upscale (2x) and background removal preprocessing, concurrent smart crop processing with progress tracking per job, retry failed exports.
  • Credit estimation — see estimated credit cost before starting, with confirmation step for batch operations.
  • Parallel downloads — ZIP archive creation now fetches all blobs concurrently instead of sequentially.
Improvement

Smart Export Panel Redesign

Redesigned the asset export panel from a single scrolling form into a two-view flow: browse presets, then configure and preview.

  • List → detail navigation — first screen shows all available presets as cards. Pick one and the panel slides to the detail view with live preview, crop strategy selector, and export button. Back arrow returns to the list.
  • Live crop preview — switching crop strategies or presets regenerates the preview via the smart crop API with a 400ms debounce and AbortController cancellation. A spinner overlays the existing preview while the new one loads.
  • Attention crop fix — crop offsets were being scaled by coverScale, displacing the crop window from where Sharp's attention detection actually focused. Fixed by using Sharp's native attention strategy directly.
  • Alpha flattening — centerCrop now flattens transparent pixels when the background is opaque, preventing alpha artifacts from leaking into marketplace exports.
  • Pre-resize for speed — source images larger than 1200px are downsized before preview generation for faster response.
New Feature

Canvas Context Menus

Right-click context menus on the workflow canvas for faster access to common actions.

  • Step nodes: add step after, duplicate, regenerate (if completed), delete
  • Source/output nodes: add step
  • Empty canvas: add step
  • Positioned overlay with viewport clamping, keyboard dismiss (Escape), click-outside-to-close
  • Full ARIA roles for accessibility (role="menu", role="menuitem", role="separator")
New Feature

Draggable Edge Reconnection

Edges in the workflow canvas can now be reconnected by dragging their endpoints. Grab the start or end of any arrow and drop it on a different node handle to rewire the connection.

  • Reconnection updates the pipeline's connection model directly
  • Removed dead isDagMode flag — DAG mode is always active since custom connections are always available
  • Cleaned up guard clauses and made onCustomConnectionsChange required
Internal

Canvas Node Code Cleanup

Systematic cleanup of all canvas node components and supporting hooks.

  • Replaced ~20 inline SVGs with shared icon components (CloseIcon, SpinnerIcon, RefreshIcon, CopyIcon, WarningIcon)
  • Extracted 4 shared source components (SourceModeToggle, SourceLoadingState, SourceGenerateForm, BrowseLibraryButton) eliminating ~150 lines of duplication between SourceNode and AdditionalSourceNode
  • Fixed useCallback dependencies using data object (defeats memoization) — switched to specific fields
  • Replaced raw <button> elements with ShadCN <Button> throughout StepNode and InteractiveEdge
  • Moved BRANCH_COLORS to shared types, removed dead props and redundant patterns
  • Fixed workflow share/import modal not closing on outside click
Improvement

Workflow Studio in Dashboard Shell

The workflow orchestrator now lives inside the full dashboard shell at /create/orchestrator, giving it access to the sidebar, upload modal, unified search, and folder creation — matching the rest of the dashboard experience.

  • New route under the (dashboard) layout group with DamShell wrapping
  • All dashboard-internal links updated (sidebar, flows tab, navigation, asset modals, job indicators)
  • Public SEO page at /tools/orchestrator preserved for external traffic
Internal

Orchestrator File Decomposition

Split 7 oversized orchestrator files (250–538 lines each) into focused, single-concern modules.

  • Decomposed useCanvasStepManagement (538 → 195) by extracting useStepCallbacks (callback factory + keyboard shortcuts) and useStepInsertion (DAG insertion logic with 4 scenarios)
  • Extracted execution-error-styles.tsx from ExecutionErrorAlert — pure style/icon data separated from component logic
  • Split StepNode into StepNodeHeader (icon, name, action buttons) and StepNodePreviews (image grid, review button)
  • Moved getStepCreditCost and TIME_ESTIMATES to src/lib/pipeline-cost.ts — pure utility, no React dependency
  • Extracted PipelineCostEstimate component to its own file
  • Split useCanvasNodes by extracting useSourceNodeData and useOutputNodeData builder hooks into useCanvasNodeBuilders
  • Extracted WorkflowImportForm from WorkflowSharing — import mode UI and validation logic
  • Extracted KeyboardShortcutsHelp and OnboardingHelpButton from OrchestratorHeader
Internal

Orchestrator Code Simplification

Deduplication and cleanup pass across orchestrator hooks and execution logic.

  • Parallelized Sirv upload calls in execution download handlers
  • Debounced auto-save in workflow backup to reduce writes
  • Deduplicated execution action dispatchers — merged overlapping run/retry/continue paths
  • Simplified derived execution state computation
  • Cleaned up source file handlers with unified CDN upload logic
Internal

Pipeline Executor Simplification

Removed the legacy linear pipeline executor and consolidated all execution into the DAG-based path.

  • Deleted execute-linear.ts (619 lines) — the DAG executor already handled linear pipelines as a degenerate case
  • Removed linear execution mode from pipeline types, Inngest functions, and state machine
  • Simplified usePipelineMachine and useUnifiedPipelineExecutor by dropping mode branching
  • Slimmed the XState machine: removed linearExecution state, runLinear event, and linear actor
  • Net deletion of ~900 lines with no behavior change