3dSynth

Docs / Support

Open in the interactive docs reader

Version History

Track the evolution of 3dSynth. Each version brings new features, improvements, and bug fixes.

May 2026

  • Custom G-code editor complete. Overlay-only preview (no second engine parse), worker analyze(), playback via setDrawRange, inherited-F / absolute-E edits, dialect pause snippets, resume-from-Z, motion-planner times + SVG charts, G2/G3 interpolation, object sections, slicer thumbnails, bead tubes (≤80k), and .bgcode import/export.
  • Texturize paint that matches export. Include/Exclude is a live shader mask (gl_PrimitiveID + UV stamp): painted faces tint orange/green and bump stops. Wireframe keeps overlay soup. Face floods the coplanar side; Brush is a view-aligned disk with a world-mm circle; Fill / Grow / To crease use neighbour dihedral (Crease 30°). Similar, Linked, Swap painted, session Undo last paint, Esc to leave paint. Double-click Face/Fill = To crease.
  • Seamless maps from Pattern texture + SVG. Simple kernels (Knurl default) plus the 17 Pattern tiles and 8 SVG library maps. Optional Make seamless on custom uploads (off by default). Old Crystal-class ids migrate (crystal → Hexagons, weaves → Herringbone). Export Mesh waits until the raster is ready.
  • Projects with more than one module — you can switch. A compact module list in the toolbar jumps between G-code Sculptor, Custom G-code, Fabric, Hex, and the rest without losing data. The </> button still copies compiled G-code into a new Custom G-code module (Hex, Node toolpath, Fabric, and Predefined included). It never overwrites the authoring module.
  • Process dialect (Print tab). Filament / Clay / Plotter on the shared printer settings. Clay skips cold-extrusion alarms, can inject M302 P1, and is no longer labeled PLA in slicer metadata. Defaults stay Filament so existing projects are unchanged.
  • Custom G-code path tools. Bed array (grid/polar), 3MF/UFP/ZIP G-code extract + re-pack, image-mask and Z-band selection, advisory nozzle-collision list, Bead shade mode, Outline reorder. Thin STL/OBJ import becomes planar contours — not a second slicer.
  • Layer Mode infill. Optional generative infill (rectilinear, grid, concentric, honeycomb, gyroid, Hilbert, SVG clip) and top solid layers. Spiral/vase remains the default. Effects can target outer, inner, or all walls.
  • Fix: Contour Wave extrusion now uses 3D path length. The bead volume on every Contour Wave segment was being computed from the XY-only distance, but each step on the wave flank has a large Z component — on a near-vertical flank, distXY ≈ 0.08 mm while the nozzle actually traces dist3D ≈ 0.47 mm. The result was severe under-extrusion (~5–6×) on every wave crest, visible in the export as a long run of identical E0.01699 values on the steep sections, and the ; total filament used footer under-reported real consumption. Both the main wave loop and the per-layer trough-extension loop now feed dist3D into calculateExtrusion, matching the existing 3D-correct behaviour of vase mode (run.ts) and Julia Stack (julia.ts). The export's totalExtrusionMm now agrees with the preview's totalExtrusionMm (they were drifting apart by a few percent before, with the preview being correct). Effect on the print: cleaner walls on the vertical sections of every wave, no more starved/stringy flanks, and an accurate filament estimate.
  • Contour Wave on non-circular shapes — arc-anchored wave alignment. Adding a shape modulator (Capsule, Rectangle, Slot, Ellipse, Heart, Polygon, Polygonizer) to a Contour Wave print now produces a proper brick-wall woven pattern where each layer's peaks meet the next layer's troughs at the same spatial X,Y — all the way around curved ends and straight sides. Previously the wave Z was indexed by the seam-relative point index i/N; the per-layer trough-extension loop accumulates a small angular offset on waveThetaStart each layer, which is invisible on a circle (rotation-invariant) but rotated the wave pattern slightly each layer on any non-circular shape, breaking the weave into a chaotic zigzag. The wave is now anchored to the point's absolute arc-fraction on the perimeter(seamArcFrac + i/N) mod 1 — so peaks and troughs land at fixed spatial positions across every layer and the layerPhase alternation produces the woven look as intended. The trough-extension peak search and the extension extrusion now operate in the same arc-anchored frame (theta → arcFraction → wave Z) so the layer seam still lands cleanly on a peak.
  • Shape modulators — equal-arc point distribution. Toolpath points on non-circular base shapes are now distributed at equal arc length along the perimeter instead of equal angular steps, so segment density and texture frequency stay uniform on the flat sides of a capsule, the corners of a rectangle, and the lobes of a heart. Applies to G-code Sculptor (Spline / Vase, Layer Mode, Contour Wave, Julia Stack) and Mesh Sculptor (cross-section sampling + shell ring generation). Builds a per-layer arc-length lookup table by oversampling the shape boundary, then remaps stepsPerLayer thetas to equal arc-length intervals.
  • Texture effects on shape modulators — arcModTheta. Texture / displacement modulators (XY-Ripple, Z-Ripple, Synth, Knurling, Bump Map, Noise, Pattern texture, etc.) now receive an arc-length-normalized angular position alongside the actual theta. Patterns that previously stretched on the flat sides of a capsule and compressed on its curved ends now repeat uniformly along the perimeter — the visible pattern period is constant whether the surface is straight or curved.
  • Seam-aware arc remap (remapThetaByArcLengthFromSeam). The arc-length theta remapper now accepts a seam theta and walks the perimeter uniformly from there. Critical for Contour Wave where waveThetaStart can drift across layers — without this, the first layer was arc-uniform from θ=0 but subsequent layers were arc-uniform from a slightly different angle, so wave peaks visually bunched up on the flat sides of a capsule and stretched on the curved ends.
  • Cap boundary follows the shape. Bottom Cap and Top Cap rings now sample at equal arc length and evaluate every modulator at each boundary point — across Layer / Vase mode and Contour Wave. Previously the Contour Wave cap always rendered as a circle even when a Capsule / Rectangle / Polygon shape was active, leaving a circular infill peeking out of a non-circular wall; the cap now traces the same outline the wall does.
  • G-code Editor — bidirectional editor ↔ 3D selection. Selecting lines in the G-code editor now highlights the corresponding toolpath segments in the 3D viewer, and vice versa. Click a segment in the viewport to jump to that line in the editor. The wiring was missing at the dock adapter level; editor, viewer, and state infrastructure were already in place.
  • G-code Editor — Search & Replace. Ctrl+F opens the find widget, Ctrl+H opens find-and-replace. Supports regex, case-sensitive, and whole-word matching. Auto-selects in multiline selections for scoped search.
  • G-code Editor — section-colored minimap. The editor minimap and overview ruler now display color bands corresponding to structural section types (perimeter, infill, travel, startup, shutdown, etc.), making the file structure visible at a glance without scrolling.
  • G-code Editor — Precision Tools panel. New "Tools" tab in the bottom panel provides selection-driven editing operations: batch speed multiplier, flow multiplier, insert temperature / fan / pause / custom G-code at cursor, plus whole-file batch operations (normalize feedrate, merge redundant temps, remove no-ops, toggle absolute/relative extrusion).
  • G-code Editor — print cost estimation. The Metrics panel now shows an estimated filament cost when filamentCostPerKg is configured in the printer settings. Cost is computed from filament weight and displayed for both global and selection-scoped metrics.
  • G-code Editor — inline diagnostics. The editor now shows squiggly underlines for potential G-code issues (cold extrusion, missing homing, flow limit exceeded, Z collision risk, feedrate zero, out-of-bounds, and more). Hover for details and suggested fixes. A warning count badge appears in the toolbar.
  • G-code Editor — Debugger panel. New "Debug" tab in the bottom panel provides step-by-step G-code execution inspection: step forward/backward, jump to next command/layer/retraction/temp change, set breakpoints, watch machine state values (X/Y/Z/E, feedrate, temperatures, flow, extrusion mode).
  • G-code Editor — Playback Controls wired. The playback timeline bar is now integrated between the editor and bottom panels. Play/pause, speed control, timeline scrubber, and jump-to-event buttons. Scrubbing scrolls the editor and highlights the current line in the 3D viewer.
  • G-code Editor — Toolpath Overlay integration. The 3D viewer now renders a color-mapped toolpath overlay when in custom G-code mode. Color modes: Speed, Line Type, Flow, Temperature, Layer. Toggle buttons for travel moves and retraction markers. Overlay settings accessible from the editor toolbar.
  • G-code Editor — Layer slider playback indicator. The layer range slider now shows a yellow marker at the current playback Z position, providing spatial context during timeline scrubbing.
  • G-code Editor — Arc to Line conversion. New spatial operation in the Tools panel: converts G2/G3 arc commands into G1 linear segments at a configurable chord length (0.1–2.0mm). Works on selection or whole file. Preserves extrusion and feedrate.
  • G-code Editor — Redistribute points. New spatial operation: re-spaces points evenly along contiguous extrusion paths at a target spacing while preserving corners sharper than a configurable angle threshold. Maintains total extrusion per path segment.
  • G-code Editor — SelectionBuffer system. Foundation for spatial editing: intensity-weighted per-point selection (0.0–1.0). Operations: create, merge (add/subtract/replace/intersect), clear, invert, smooth, centroid computation. Shared via GcodeSelectionContext.
  • G-code Editor — Brush Select. Paint intensity-weighted selections directly onto the 3D toolpath with a circular brush. Configurable radius and falloff (hard/linear/smooth). Shift+drag to add, Alt+drag to subtract.
  • G-code Editor — Pattern Select. Procedural parametric selection system: feature filter (outer wall, inner wall, infill, skin, support), height band with soft-edge falloff, cylindrical ring clip, periodic selection (select N / skip M / offset O), and block-level falloff ramps (linear, ease-in, ease-out).
  • G-code Editor — Move/Rotate/Scale transforms. Intensity-weighted spatial transforms with configurable pivot (selection center or origin). Supports per-axis translation, rotation around X/Y/Z, uniform or per-axis scaling. Optional E-value recalculation to preserve volumetric flow after path-length changes.
  • G-code Editor — Path Deformation. Four deformation modes: Bend (curve along an axis), Twist (progressive XY rotation along Z), Taper (scale XY by Z-dependent factor), and FFD (4×4×4 lattice free-form deformation with trilinear interpolation). All respect SelectionBuffer intensity and optionally preserve extrusion.

Previous Versions

2.0.0 April 2026

  • Node Sculptor — brand new design module. A full node-based procedural modelling environment joins G-code Sculptor, SynthBlocks, and Mesh Sculptor. Wire small pure-function nodes into a graph — curves, fields, transforms, surfaces, SDFs and toolpath operators — and the evaluator flows data down to a single Output node that drives the viewport and the G-code compiler. The most flexible design module in 3dSynth to date.
  • Split viewport workspace. Node graph on one side, live 3D preview on the other. Drag the divider to resize, double-click to reset to 50/50, or toggle between side-by-side and stacked layouts — split ratio and orientation persist per-device. The preview pane is the same viewer used by the other sculptors (grid, gizmo, camera presets all work identically).
  • 70+ nodes across 9 categories. Inputs (Number, Vector3, Print Bed), Math (Expression, Binary Op, Unary Op, Sin/Cos, Remap, Graph Mapper, Random), Vector & Transform (Construct/Decompose Vector, Vector Op, Length, Move, Rotate, Scale, Mirror, Array Linear, Array Polar), Curves & Profiles (Line, Arc, Circle, Ellipse, Rectangle, Polygon, Polyline, Interpolate Curve, Superformula, Divide Curve, Closest Point, Evaluate Curve, Offset Curve, Join Curves), Sets & Lists (Series, Range, List Item, List Length), Fields (Point Attractor, Curve Attractor, Noise Field, Wave Field, Modulate Path, Modulate Toolpath), Surfaces & Mesh (Tween/Loft Profiles, Revolve, Sweep Along Rail, Pipe Along Path, SDF primitives & combinators, Marching Cubes, Mesh Boolean/Shell/Subdivide), Toolpath (Slice, Layer Stacker, Vase Spiralizer, Contour Slice, Spiralize Contours, Seam Shift, Travel Optimize, Adaptive Layers, Flow Modulate), and the terminal Output node.
  • Typed socket system with implicit conversions. Eight socket types (Float, Int, Vector3, PointArray, Path, Mesh, SDF, Toolpath) each with a fixed colour. The evaluator auto-coerces common mismatches — Float → Vector3 broadcasts across xyz, Path → Toolpath wraps in a single segment at printer defaults, Vector3 → PointArray wraps as a one-element list. Heavy/lossy conversions (SDF → Mesh via Marching Cubes, Mesh → Toolpath via Contour Slice) require explicit nodes so cost stays visible.
  • SDF pipeline — watertight by construction. Build implicit geometry with SDF primitives (Sphere, Box, Torus, Cylinder, Gyroid) and combine them with Union / Subtract / Intersect — then polygonise with Marching Cubes at your chosen resolution. Ideal for lattices, smooth booleans, and TPMS surfaces like the gyroid lamp template.
  • Mesh operations. Mesh Boolean (union / subtract / intersect on triangle meshes for finishing touches), Mesh Shell (hollow a solid by a wall thickness), and Mesh Subdivide (Loop-style smoothing with configurable iterations). All three check cancellation mid-run so dragging parameters never locks the worker.
  • Field-driven geometry. Point Attractor and Curve Attractor produce Gaussian-falloff scalar fields around origins / guide curves. Noise Field is a seeded fBm sampler (multi-octave coherent noise) and Wave Field emits directional / radial sine patterns with harmonics. Feed any field into Modulate Path (displace profile curve points) or Modulate Toolpath (post-process a full print path) for ripples, knurls, ribs, and attractor-driven lamps.
  • Surfaces from profiles. Tween Profiles / Loft Profiles lofts between 2+ section curves. Revolve sweeps a profile around an axis into a surface of revolution. Sweep Along Rail sweeps a cross-section along a 3D rail with orientation frames. Pipe Along Path tubes a polyline with configurable radius and end caps — all emit clean triangle meshes with computed normals.
  • Toolpath authoring & post-processing. Vase Spiralizer (continuous Z-ramp), Layer Stacker (flat layers with per-layer transforms — the basis for twisty vases), Contour Slice (mesh → planar layers), Spiralize Contours (convert layers to a continuous spiral). Then refine with Seam Shift (scatter the start-of-layer seam), Travel Optimize (reorder segments to shorten travel), Adaptive Layers (thinner layers on steep surfaces) and Flow Modulate (per-segment extrusion multiplier from a field or curve).
  • Starter template gallery. A fresh canvas opens with a curated gallery grouped by intent — Blank Canvas, Parametric Vase (Circle → Vase Spiralizer → Output), Twisted Hex Vase (per-layer rotation + taper), Ribbed Vase (sine Wave Field through Modulate Toolpath), Wave Cup (seeded noise profile Z-displacement), Knurled Grip (diagonal wave + rotated stacker), Attractor Lamp (Gaussian Point Attractor pinch), and Lattice Lamp (cylinder ∩ gyroid via Marching Cubes). Picking a template instantiates a fully-wired graph in one atomic undo entry. A development-build validator checks every template for unknown nodes, dangling edges, and unconvertible socket types on load.
  • Tagged parameters — right dock control panel. Right-click any parameter and give it a friendly label ("Twist °/layer", "Rib depth", "Groove density"). Tagged params collect in the right-side dock grouped by node so you can dial in a design without ever touching the graph. Every starter template ships with a few suggested tags. Tagged params are persisted in the module config and travel with the project file.
  • Add Node popup and palette. Four ways to add a node: Shift + A opens a type-to-filter popup anchored at the mouse; right-click → Add Node opens the same popup at the click point; the left-dock Nodes tab is a persistent searchable palette; picking a template stamps a whole graph. Palette rows show label, category and one-line description; arrow keys + Enter pick without touching the mouse.
  • Left dock — Nodes / Problems / Templates tabs. Nodes mirrors the Shift+A palette. Problems lists every non-fatal evaluation issue (missing inputs, out-of-range params, execution errors, hints) with the offending node id and a human-readable message — clicking a row centres the canvas on that node and flashes its border. Templates is the same gallery available at any time; applying a template replaces the current graph atomically.
  • Canvas and node context menus. Right-click the canvas for Add Node, Clear Selection, Zoom to Fit, and (on a fresh graph) Re-open Template Gallery. Right-click a node for Rename, Duplicate, Delete, and Open Docs — the last jumps directly to the per-node documentation page.
  • Worker-based evaluation with cancellation. The graph runs inside a Web Worker so heavy nodes (Marching Cubes, Mesh Boolean, dense Loft) never block the UI. Each evaluation gets a monotonically increasing generationId; when a new evaluation starts, long-running executors check shouldCancel() at inner-loop checkpoints and bail within milliseconds — you can keep dragging sliders and always see the latest generation's output. A topological sort ensures dead branches cost nothing, diamond dependencies share cached outputs, and cycles are rejected at compile time.
  • Resilient Problems panel. Executors never throw — they report problems instead and fall back to empty / identity values so the rest of the graph keeps running. Five problem kinds: missing-input, invalid-param, type-error, execution-error, hint. Problems clear at the start of every evaluation so stale entries never stick around.
  • Three Output modes. The terminal Output node has three sockets: Toolpath (drives G-code), Preview Mesh (viewport-only surface), and Export Mesh (STL export). Wire only the ones you need — a Toolpath-only graph shows polylines, a Mesh-only graph shows shaded surfaces, a combined graph layers them. The Output node is seeded automatically and cannot be deleted.
  • Full documentation set. New docs section with Overview, Interface, Sockets & Conversions, Evaluation & Problems, and Templates pages, plus 70+ per-node reference pages (one for every node in the catalog), linked directly from each node's context menu.
  • Mesh Sculptor — major upgrade. The Mesh Sculptor is now a first-class design module with its own dedicated dock panel (Sculpt + Effects tabs), replacing the old profile-embedded mesh mode panel. Full STL-export workflow for slicing in any slicer.
  • Custom cross-section editor. New full-screen modal Bézier cross-section editor — drag control points and handles, toggle smooth vs sharp corners, double-click to add points, right-click to delete. Includes starter presets (circle, square, triangle, rounded square, star, teardrop) and a 1×–4× resolution multiplier for circumferential sampling detail.
  • Koch Snowflake cross-section. Fractal cross-section shape with adjustable iteration depth (0–5), Chaikin smoothing, point removal, and point jitter. Live SVG preview in the editor lets you tune the snowflake before applying.
  • Sine wave cross-section. Sine-wave perimeter with Lobes, Amplitude, Harmonics (overtone series), and Pinch controls for wavy, flower-like, and gear-tooth profiles.
  • Differential Growth cross-section. New organic Floraform / coral-style ring driven by a Kangaroo-style physics simulation — a closed polyline with three goals on every step: a length spring that wants every edge to keep its starting length (resists both stretching and compression), sphere-collide repulsion between non-adjacent points, and a soft circular wall at the unit envelope. The wanted curve length is set deliberately longer than the wall's perimeter, so the polyline cannot fit unfolded and is forced to form smooth meandering ribbons that fill the disc. Three sliders: Complexity (1–10) sets ribbon thickness — few thick lobes at the low end, many fine ribbons at the high end; Depth (0–1) is the fold-pressure knob, going from gentle outer ripple at 0 to dense labyrinth at 1; Smoothing (0–1) applies a true round the edges pipeline (see next entry). Seed picks a deterministic variation. Output is arc-length resampled to the configured uSegments like the other presets and works as a top/bottom cross-section anywhere a built-in cross-section is accepted.
  • Differential Growth — three-stage edge rounding. The Smoothing slider on the new Differential Growth preset runs a respread → Taubin → densify pipeline so the slider behaves like a real fillet-radius knob. Step 1 arc-length resamples the simulation polyline and decimates from 100 % of its native point count at s ≈ 0 down to ~60 % at s = 1 — this is the trick: Taubin smoothing diffuses across √iters × neighbour-spacing, so on a dense polyline (neighbours ~0.005 apart) no number of iterations rounds anything visibly, but on a respread polyline the same kernel reaches across whole U-turns. Step 2 runs Taubin λ-μ smoothing (λ = 0.55 / μ = −0.58) for 15–125 paired iterations — pulls each vertex toward its neighbours' midpoint without shrinking the envelope. Step 3 finishes with 1–2 Chaikin passes so the rendered output is facet-free. Result: at s = 0 you get the raw simulation polyline, at s = 0.5 every bend is visibly filleted while the ribbon topology is intact, at s = 1 the curve reads as continuous arcs.
  • Polygon corner radius (true fillets). Corner radius on polygon presets (square, hex, N-gon) now uses true tangent-arc fillets scaled by the maximum profile radius, producing accurate mm-sized rounded corners instead of the previous approximation.
  • Normal-based displacement. All sculpt effects now displace along computed ring normals instead of radially from the Z axis. Deformations follow the actual cross-section shape correctly — no more stretching or flattening on non-circular profiles.
  • Normal splitting for sharp edges. Automatic crease detection (~40°) splits vertex normals on hard edges and cap borders so rims shade with crisp highlights while smooth walls stay smooth. Caps get a dedicated normal split for clean cap-to-wall transitions in the 3D preview.
  • Bottom Cap as geometry. Bottom Cap is no longer a displacement effect — it is now applied as real cap geometry with configurable thickness and optional center hole, producing proper watertight meshes for export.
  • Effect picker overhaul. The Add Effect dialog now features a search bar, category filter chips (All, Wave, Texture, Flow, Hex, Image, Shape, Utility), keyboard navigation (arrow keys, Enter, Esc), and grouped display. Hidden/WIP effects are automatically excluded.
  • Height-range preview clipping. Local Z clipping planes on the sculptor mesh let you preview a specific height slice of the model without regenerating.
  • Image data pipeline. The mesh sculptor worker now supports passing image data for Tier-3 image-based sculpt effects (Bump Map, Emboss, Procedural Texture).
  • Per-effect documentation. The monolithic effects reference page is replaced by individual per-effect documentation pages plus new dedicated pages for cross-section editing and effects stack workflow.
  • Shared math helpers. Deterministic hash (hash2, hash3) and lerp utilities are consolidated into a shared module, improving consistency across Voronoi, noise, and other procedural effects.
  • Cutout path quality (Hole Grid & Voronoi Cutout). When either effect is on, the engine shortens the wall segment length so cutout boundaries are sampled finely enough for smoother circles and Voronoi web edges in preview and G-code. Resolution scales with hole radius (Hole Grid) and with Edge Width plus profile radius (Voronoi Cutout). Minimum step is also limited by minimum move distance in G-code export so extrusion lines are still emitted.
  • Hole Field removed. The legacy Hole Field modulator is gone. Use Hole Grid (round holes on a grid) or Voronoi Cutout (open web). Opening old presets or projects removes any saved Hole Field effect and shows a migration notice.
  • Synth modulator. New Texture & Surface effect for woven-style radial relief: choose Pattern (Wales, Chevron, Check, Basket, or Diagonal), set repeats around the part and along height, then Depth (mm) and Sharpness. Basket matches Check but alternates sign by layer for a staggered weave. Supports growth curves and Spiral like other surface effects.
  • XY-Ripple — Alternate layers (basket weave). New Alternate layers option inverts the radial ripple sign on each successive layer so wave crossings read as an over/under woven basket pattern.
  • Viewer — GPU layer range (vertical slicer). The right-edge layer band now clips the toolpath in GPU shade mode the same way as CPU and Wire. Preview segment building applies Z filtering when only the top or only the bottom bound is set (the other side “All”), instead of requiring both bounds.
  • Instanced toolpath culling. GPU instanced cylinders and joint spheres disable frustum culling so narrow Z slices are not incorrectly culled.
  • Geometry rebuild. The viewer toolpath rebuild effect now lists layerMin / layerMax explicitly so slice changes always trigger a refresh.
  • Print panel redesign — per-field locks. The Print panel now leads with an always-visible Active Settings Summary (Layer / Speed / 1st cap / Flow / Temp), and the old "Override Print Settings" checkbox has been replaced by a lock icon on every preset-driven field (Layer Height, First Layer Height, Print Speed, Nozzle Temp, Bed Temp, Flow Rate). Click a lock to pin that value against the next preset switch — a toast confirms which fields were skipped. Temperature controls have been merged into the Material section, eliminating a duplicate panel. Existing configs with the legacy overridePrintSettings: true flag are auto-migrated on load — the four affected fields become individually locked and the dead flag is stripped.
  • G-code parity — bottom cap speed, flow, and startup temps. The first solid bottom cap layer now uses print speed × First layer speed % (with a feedrate ceiling), matching the Nozzle panel instead of a hard-coded mm/min. Material flow % drives M221 on those cap layers with nominal E in the cap path; after the last bottom-cap layer the slicer emits M221 S100 so wall and spiral moves keep encoding flow in E as before. Changing Nozzle Temp while it matched first-layer nozzle temp now updates both so START_PRINT macros see the same value as the Material field.
  • Orca/Creality enriched export — modal feedrate. After each injected layer-change G1 Z … F (travel speed), the enriched G-code now emits G1 F at print speed so vase/spiral segments that omit F on each line no longer inherit travel feedrate (~150 mm/s). Without this, layer 2+ extrusion ran at travel speed despite a slow print-speed setting.
  • Fix: Faceted Triangles — top layers / rim. The shared height (v) sampling in facetedTrianglesPattern treated v = 1 as fv = 0, snapping random vertex displacement back to the previous row and breaking continuity on the last printed layers (misaligned or “floating” rim vs the body). The top boundary now clamps to the last grid cell with fv = 1, matching the interpolation just below. Applies to both G-code Sculptor (Faceted Triangles modulator) and Mesh Sculptor (same kernel).
  • Profile spline — in-viewport overlay (silhouette tracking). The Shape Curve is now also drawn directly on the 3D model, projected onto the camera-facing meridian. Auto-on whenever the Create or Effects tab is open in any module that uses the spline (G-code Sculptor, Mesh Sculptor) — no toggle to flip. Same anchors, handles, modes, and curve coloring as the side panel; both editors share state and are always in sync, so a drag in one updates the other instantly. Tilt within ~5° of the Z axis and the overlay fades out smoothly because the silhouette becomes degenerate; tilt back and it reappears. Implemented with an SVG layer that lives on a separate compositor track from the WebGL canvas — zero draw-call cost on the renderer — and the same debounced worker rebuild path as before, so there is no perf impact even on heavy effects stacks.
  • Profile spline — overlay tracks all camera moves. The viewport overlay updates on every camera change — orbit, pan, zoom, damping inertia, even programmatic camera moves and scene re-initialisations. Replaces the previous OrbitControls.change listener (which could go stale when controls were rebuilt) with a continuous rAF camera-diff loop that bumps an epoch only when camera.position or controls.target actually change, so the curve stays glued to the silhouette in real time without spamming React re-renders.
  • Profile spline — proportional canvas (auto-fit). The side-panel canvas now auto-scales to the model: max visible radius = max(20 mm, maxR × 1.25). A 30 mm vase no longer feels twitchy, a 200 mm planter no longer clips, and one pixel of cursor movement is roughly the right number of millimetres for the model on screen. The visible scale locks at pointer-down and only re-fits after pointer-up, so dragging a point outward can no longer shrink pxPerMm mid-drag and run away from the cursor.
  • Profile spline — Shift+drag for fine control. Hold Shift mid-drag on any anchor or handle (in the side panel or the viewport overlay) and the cursor delta scales to 10 % — 10 px of mouse movement = 1 px of point movement. Releasing Shift mid-drag smoothly re-anchors to the cursor; no jump back. Stacks with the existing keyboard-arrow Shift modifier for nudges.
  • Profile spline — three point modes (Smooth / Broken / Sharp), Illustrator-style. The old binary Smooth ↔ Sharp toggle is now a three-way picker. Smooth keeps the linked-direction G1 behaviour. Sharp still collapses handles to zero. The new Broken mode keeps both handles but unlinks them — a corner with independent tangent control on each side, perfect for an asymmetric shoulder where one side is curved and the other straight. Alt + drag a handle on a Smooth point promotes it to Broken on the first drag frame and only the dragged handle moves; once Broken, no modifier needed. Smooth ← Broken reconciles the two handle directions onto a common tangent line while preserving each side's length so curvature work isn't lost. Broken anchors render with dashed handle link lines and a small chevron marker so they're spottable at a glance. Existing projects auto-migrate (any saved point without a mode defaults to Smooth); the new mode is fully backward-compatible with old .synth files.
  • Profile spline — theme-true safe-zone color. Curve segments in the safe overhang band (≤ 45° from vertical) now resolve through var(--accent-primary) directly so they pixel-match the spline anchors and handles regardless of how the active theme stores the accent color (hex, hsl, oklch, …). Previously the angle-color helper's strict #RRGGBB validation could silently fall back to a hard-coded blue when the theme used another format, causing a visible mismatch between the line and the dots. The warning (yellow / amber) and danger (red) gradient still uses the validated hex path for smooth interpolation.

1.9.8 March 2026

  • Bottom cap infill. The rectilinear and concentric infill patterns for bottom and top caps now correctly overlap the inner perimeter wall by 20% of the line width (consistent with standard slicer behavior), instead of incorrectly extending all the way to the outer contour and over-extruding over both perimeter passes.
  • First layer adhesion (Vase mode). The continuous Z-ramp of vase mode now delays its upward spiral until the second revolution. The very first wall loop is printed completely flat at the initial Z height, ensuring a perfect squish against the build plate (or the top solid cap) before the spiral begins.
  • Effect names. Effect titles in the left dock (e.g., "XY-Ripple", "Bottom Cap") are now larger and bolder for better visual hierarchy.
  • Cap settings layout. Rearranged the Bottom Cap and Top Cap parameters into a cleaner two-column grid: Solid Layers and Fill Pattern on the first row, Center Hole toggle and Hole Ø on the second.
  • Ellipse Shape modulator. Cross-section follows an axis-aligned ellipse from Width and Length (mm), scaled with the profile like other base shapes; Twist and Phase rotate the silhouette around the layer.
  • Capsule Shape modulator. Stadium (“pill”) outline: straight sides along the long axis and semicircular caps on the short ends — distinct from Slot Shape (rounded rectangle). Long axis is along X after sizing; use Twist / Phase to aim the capsule on the part.
  • Heart Shape modulator. Classic implicit heart silhouette with independent horizontal and vertical extent from Width and Length; same scaling and rotation controls as the other Shapes.
  • Fix: Heart Shape silhouette. Polar radius for the implicit heart no longer uses Newton iteration (which could diverge and produce enormous radii on some angles). The solver now brackets the first ray–curve crossing and refines it with bisection, which removes spiky “fan” geometry toward the lobes.
  • Shapes category. These three join Polygonizer, Rectangle, Slot, and Polygon under the Shapes group in Add Effect for a single place to pick cross-section / perimeter tools.

1.9.7 March 2026

  • Profile spline — true 2D Bézier evaluation. The curve in the profile editor now follows the same cubic Bézier in (height, radius) as the visible anchor and handle geometry (Illustrator-style). Tangent / overhang coloring uses that curve as well. If a segment’s height coordinate along the cubic is not strictly monotonic (extreme handle positions), evaluation falls back to the previous uniform-height parameterization using dr only so results stay finite. Saved profiles may shift slightly compared to the older approximation; tweak handles if needed.
  • Pattern texture — seamless SVG library tiling. Library SVGs now rasterize at a fixed pixel size that matches the chosen resolution (no second rescale from intrinsic dimensions), and the SVG viewport uses preserveAspectRatio="none" so the tile fills the bitmap edge-to-edge. Together this removes letterboxing and soft edge mismatches that showed as seams when the heightmap wrapped.

1.9.6 March 2026

  • Pattern texture — SVG library raster sizing. Heightmaps from bundled svg/*.svg now derive bitmap width and height from the tile’s viewBox or first <pattern> width/height (so non-square tiles like wide waves or tall triangles keep their proportions). Resolution sets the longest edge in pixels; actual dimensions are shown in the preview. Ratio multiplies that intrinsic tile aspect (1 = match the SVG). Presets that relied on the older “square bitmap + Ratio only” behavior may need Ratio or Auto ratio adjusted.
  • Pattern texture (unified). The former separate “pro” procedural surface effects are now one Pattern texture modulator: built-in codegen patterns via Pattern dropdown, optional SVG library heightmaps from bundled svg/*.svg, shared raster pipeline and proc-{id} bump key. Legacy projects and presets migrate automatically; docs list a single Pattern texture page (old per-pattern pages keep deep content with previews pointed at the unified control).
  • Bézier growth curves. Growth curves for supported effects now use the same smooth / sharp corner model as the profile spline: draggable handles, smooth vs sharp per point, and evaluation aligned with evaluateBezierSpline. Legacy projects that only store height/value points keep the previous linear segment behavior until you edit and save the curve.
  • Growth presets and wider effect support. Named presets (flat, ramps, ease, S-curve, bell, spike, steps) plus growth-curve support on Z-Ripple, Noise, Line Pattern, and Single Line.
  • Viewport dimension HUD. Live readout of approximate model width (max XY, mm) and height (Z, mm) on the preview, including mobile layout.
  • Duplicate modulator. One-click duplicate on modulator cards inserts a copy below the source and selects it (deep clone).
  • Project import UX. Opening .3dsynth / JSON projects uses the toolbar Open flow only; window drag-and-drop import is removed for a single validated load path. Documentation updated accordingly.
  • Tests. Added unit coverage for growth presets, modulator UI config, duplicate helper, HUD math, and engine growth-curve behavior.

1.9.5 March 2026

  • Mesh Mode. New shape mode that generates a solid 3D shell mesh from your profile shape and effects — export as a watertight STL for slicing in any slicer (Cura, PrusaSlicer, Bambu Studio, OrcaSlicer). Share your designs on MakerWorld, Printables, or Thingiverse.
  • Shell mesh engine. Purpose-built mesh generation pipeline with configurable Z resolution and angular detail, independent of the printer layer height. Produces smooth, high-fidelity surfaces even with intricate procedural effects like Voronoi and bump maps.
  • Inner wall with thickness control. Optional hollow shell with adjustable wall thickness (mm). Inner wall can follow the outer surface's effect deformations or remain smooth — toggle per design.
  • Bottom and top cap support. Mesh caps seal the model at the base and top. Caps support configurable thickness (layers) and optional center holes from the Bottom Cap and Top Cap effects.
  • Three export quality tiers. Standard (360 pts, 0.1 mm Z), High (720 pts, 0.05 mm Z), and Ultra (1080 pts, 0.02 mm Z). Preview always uses Standard for fast interaction; export regenerates at the selected quality.
  • Worker-side mesh assembly. All geometry computation (positions, indices, validation) runs in a web worker with zero-copy Transferable buffer transfer — the main thread stays responsive during generation.
  • Single-pass buffer builder. Walls, caps, and inner surfaces are written into pre-sized typed arrays in one pass — no intermediate Three.js objects, no mergeVertices, no redundant normal calculations.
  • Mesh Mode documentation. New in-app docs page covering Mesh Mode concepts, parameters, cap behavior, quality settings, and export workflow. Notes that non-planar Z movements are not available in this mode.

1.9.3 March 2026

  • Mobile WebGL context fix. Replaced the broken WebGL1 fallback (Three.js 0.182 requires WebGL2) with a pre-created WebGL2 context strategy. The renderer now creates a WebGL2 context with safe attributes (stencil: false, failIfMajorPerformanceCaveat: false) and passes it directly to Three.js, avoiding internal negotiation failures on mobile GPUs.
  • Deferred renderer initialization. The 3D viewer now waits for the container to have valid dimensions before creating the WebGL context, preventing zero-size canvas failures during mobile layout.
  • Mobile pixel ratio cap. Device pixel ratio is capped at 1.0 on mobile (down from 1.5) to reduce GPU memory pressure and avoid context allocation failures on memory-constrained devices.
  • Improved WebGL fallback UI. When WebGL2 context creation fails, the viewer shows actionable guidance (close other tabs, disable battery saver, reload) with a one-tap reload button instead of a generic error.

1.9.1 March 2026

  • GPU Shade Mode (now default). Three-way shade mode selector (CPU / Wire / GPU) replacing the old Solid/Wire toggle. GPU mode renders the toolpath as instanced cylinders with sphere joint caps — real PBR lighting and normals in just 2 draw calls, dramatically faster for large models (650k+ points). Press T to cycle modes.
  • Chunked geometry building. The solid TubeGeometry build is now frame-budgeted (8ms per frame) with async cancellation, preventing browser freezes on large models. The "Building 3D Scene" overlay stays responsive instead of locking the tab.
  • Zero-allocation segment ranges. Preview mode now parses Float32Array positions into index ranges instead of allocating Point3 objects, cutting memory allocation by ~1.3M objects on large models.
  • Lazy export conversion. The Vector3 arrays needed for mesh export are now built on demand when you actually export, instead of on every geometry rebuild — eliminating ~650k Vector3 allocations per preview update.
  • Removed viewport blur during generation. The CSS blur filter that obscured the 3D viewport while generating/building is removed. The scene stays sharp with only a subtle opacity dim.
  • Removed default depth-of-field blur. DOF bokeh is now disabled by default for a crisp viewport. Users can re-enable it in post-processing settings.
  • Studio Mode (path traced). Renamed "Vase" view mode to "Studio" with GPU-accelerated path tracing via three-gpu-pathtracer. Physically accurate global illumination, soft shadows, and reflections converge progressively while the viewport stays interactive. Rasterized preview during camera interaction, photorealistic convergence when idle.
  • Light Studio / Dark Studio themes. Two studio looks using the background theme toggle: bright white product-studio (Keyshot-style infinity cove) and moody dark studio. Each theme uses a matching procedural HDR environment and tone mapping preset.
  • Resilient fallback. If path tracing is unsupported on a device, Studio mode gracefully falls back to rasterized PBR rendering with standard lighting.

1.9.0 March 2026

  • 20 new procedural texture effects (Pro). A massive new family of SVG-based procedural surface patterns — each one generates a texture on the fly and wraps it around your print as displacement. No image imports needed. All support tiling, rotation, Force Field masking, Growth Curve, Width Gain, and Flow Gain.
  • Dots & Stars. Polka dots or star bursts on a grid — from scattered confetti to dense starfield textures.
  • Stripes & Lines. Clean horizontal or vertical bands — corduroy ribs, pinstripes, or bold architectural ridges.
  • Grids & Checkers. Checkerboard and grid patterns — from pixel art tiles to Mondrian-inspired surfaces.
  • Waves & Moire. Parallel sine waves that create moire interference when stacked — optical illusions in plastic.
  • Labyrinth & Woven. Diagonal line grids that form woven basket textures or labyrinth mazes.
  • Noise Texture. SVG fractal noise with full resolution and tiling control — sandstone grain to alien terrain.
  • Soft Spots. Gradient-falloff circles that create gentle hillocks — raindrops frozen on a still pond.
  • Geometric Motifs. Scattered triangles, diamonds, and hexagons — Moroccan courtyard tiles for your vase.
  • Terrain Layers. Catmull-Rom spline terrain strata — geological layers and mountain ridgelines.
  • Hexagon Texture. Honeycomb grid with per-hex gradient fills — sci-fi armor plating or reptilian scales.
  • Radial Pebbles. Randomly rotated ellipses — tumbled river stones scattered across the surface.
  • Offset Crescents. Overlapping circles forming moon and crescent shapes — Art Nouveau meets night sky.
  • Ribbon Knots. Wavy ribbons with alternating overlap — Celtic knotwork and woven fabric effects.
  • Shattered Cells. Voronoi tessellation with vertex distortion — cracked glass, dried earth, broken ice.
  • Spiral Seeds. Archimedean spirals scattered like fossilized ammonites — mathematical beauty made physical.
  • Pixel Weave. Alternating horizontal/vertical strip blocks — digital textile with a retro TV vibe.
  • Echo Rings. Concentric ripples radiating from random centers — water-drop interference patterns.
  • Zigzag Lattice. Sharp zigzag rows — Navajo blanket chevrons and Art Deco sawtooth friezes.
  • Contour Islands. Noise-based discrete contour bands — topographic map islands carved into the surface.
  • Diamond Bloom. Diamond-shaped petals around bloom centers — kaleidoscope flowers meet crystal geometry.

1.8.6 March 2026

  • Hexagonal Pyramid effect. New seamless hex-grid surface pattern — each hexagonal cell is subdivided into 6 flat triangular facets meeting at a central apex, producing a faceted crystal-like low-poly appearance. True planar facets with C0 continuous sharp ridge edges. A single Size parameter controls cell density (count is calculated automatically), Ratio (U:V) corrects aspect ratio on any shape, and Depth supports both outward pyramids and inward indentations. Prints well in FDM — facets hide layer lines and edges strengthen walls. Supports growth curve and spiral.
  • Effect picker docs preview. Hovering effects in Add Effect now shows a visual documentation preview card after a short intent delay, so users can recognize effects before adding them.
  • Direct docs access from preview. Each preview card includes a ? button that opens the corresponding documentation page without duplicating image/link config in multiple places.
  • Single source of truth for effect preview assets. Effect and transform preview image paths are now centralized in the docs registry, and both the docs pages and effect picker use the same metadata.
  • Improved hover UX. Added hover-intent timing, delayed dismiss, and smoother pointer transition behavior so the preview does not disappear immediately while moving toward it.
  • Consistent preview sizing. The hover preview uses a fixed-size card for stable layout and predictable scanning across effects.

1.8.5 March 2026

  • Layer Mode. New shape mode alongside Spiral, Contour Wave, and Julia Stack. Generates flat horizontal layers with discrete Z steps instead of a continuous spiral. Supports 1–10 perimeters per layer for thicker, stronger walls. Two seam strategies: Aligned (clean vertical seam line) and Random (scattered per layer to hide the seam). All existing effects, transforms, and caps work identically in Layer Mode. Select from the Shape Mode dropdown.
  • Per-perimeter effect toggle. When Layer Mode has 2+ perimeters, each perimeter has an Effects checkbox. Disable effects on inner perimeters for plain structural walls while the outer perimeter carries decorative patterns.
  • Shape Mode selector renamed. The default mode is now called Spiral (previously "Profile Shape") for clarity alongside the new Layer Mode option.
  • Perlin Stroke effect. New procedural flowing-ridge pattern inspired by Perlin noise flow fields. Uses multi-level domain warping with coherent smooth noise to create organic, converging/diverging stroke lines — like particle traces in a force field. A sine-ridge overlay converts the smooth warp into repeating stroke lines that follow the flow direction. Controls: Scale, Flow Warp, Stroke Density, Rotation, Depth, Detail (octaves), Sharpness, Phase, Spiral. Seamless theta wrapping via integer-period tiled noise. Supports growth curve.
  • Voronoi effect. New procedural Voronoi cell pattern with two modes — Bump creates organic ridges at cell boundaries that push the profile outward, Outline prints only cell edges while travelling through cell interiors to create an open lattice. Controls: Cell Size, Ratio, Jitter (0 = honeycomb grid, 1 = fully organic), Edge Width, Depth, Sharpness, Phase, Spiral. Supports growth curve.
  • Fix: Contour Wave export ignoring isHole. The Contour Wave export path now correctly checks the isHole flag from modulators and emits travel moves for hole regions. Previously only the preview checked it, causing a preview/export mismatch for any hole-based effect (Hole Field, Voronoi Outline) used with Contour Wave.
  • Fix: Preview travel continuity for hole effects. Hole regions in the 3D preview now render as visible travel lines instead of being silently skipped. The spiral travel path stays continuous and visible when using Hole Field or Voronoi Outline mode.
  • Fix: Pre-existing test drift. Updated GCodeWriter tests to match the 3dp Z precision format and NaN-feedrate fallback behavior. Added missing lineWidth field to cap scanline test config.

1.8.2 March 2026

  • G-code preview compatibility guide. New documentation page explaining why Creality Print, Bambu Studio, and OrcaSlicer cannot render non-planar toolpaths correctly — and what to use instead. Covers the root cause (planar-layer bucketing algorithms), a slicer compatibility table, and a step-by-step guide to the free PrusaSlicer G-code Viewer.
  • One-time export disclaimer modal. A notice shown the first time a user exports Enriched G-code, clearly stating that Creality Print and Bambu Studio preview artifacts are a viewer limitation (not a G-code problem) and recommending PrusaSlicer G-code Viewer for accurate toolpath verification.

1.8.1 March 2026

  • Knurling effect. New diamond/pyramid grid surface texture — the classic machined knurling pattern. Uses two crossing diagonal groove sets (min(abs(sin), abs(sin))) to produce a naturally staggered diamond grid. Controls: Diamond Size, Depth, Sharpness, Phase, Spiral. Supports growth curve.
  • Modulator defaults: single source of truth. All 30 effect default values and growth curve support consolidated into MODULATOR_UI_CONFIG in config/modulatorConfig.ts. Eliminated ~245 lines of duplicated defaults scattered across 3 files (ModulatorStack, useDesignState, useDesignModules).
  • Fix: 6 effects had visible params showing as 0. Harmonics (harmonics), Wave Shaper (shape, duty), Glitch (hold, jitter), Envelope (ADSR), and Single Line (lineCount, depth) now display correct initial values when added — same class of bug as the original Knurling default issue.
  • Fix: Knurling growth curve not visible. KNURLING was missing from the growth curve render list — now driven by a single hasGrowthCurveSupport() lookup instead of two hardcoded arrays.
  • Fix: Hook modulator creation consistency. useDesignState and useDesignModules now provide proper defaults and initialize growth curves for all supported types, matching the UI behavior.

1.8.0 March 2026

  • Community Library. Browse, load, and share designs and SynthBlocks from a centralized online library powered by Firebase. Available as a dockable sidebar panel and as a full-page view at /library.
  • Library grid. Responsive card grid with viewport screenshots, Load and Details buttons, and admin delete — adapts column count to sidebar width and full-page layout.
  • Library detail view. Image carousel (viewport screenshots, print photos), description, tags, effects used, printer settings at time of save, and download as .3dsynth project file.
  • Live Synthblock preview. Detail view renders SynthBlocks directly from workspace state using the same Blockly engine as the tutorials — no pre-rendered images needed.
  • Zoomable block viewer. Synthblock preview supports scroll-to-zoom, click-and-drag pan, zoom-to-fit button, and zoom percentage indicator for navigating large block patterns.
  • Share to Library. Premium users can share designs and SynthBlocks with auto-captured viewport screenshots and printer settings. Upload goes through a secure Cloud Function with Gumroad license verification.
  • Firebase backend. Firestore catalog with atomic batch writes, Cloud Storage for images, Cloud Functions for upload/delete/update with CORS, input sanitization, payload limits, rate limiting, and admin-only write access.
  • Project snapshot format. Library uploads and downloads use the same .3dsynth project format as save/load — full round-trip compatibility with design modules, effects, transforms, and printer config.

1.7.1 March 2026

  • Bambu Studio G-code export. New dedicated export format for Bambu Lab printers — generates G-code with proper Bambu firmware commands (M991 layer notifications, M981 spaghetti detection, M1003 power-loss recovery, ; FEATURE: annotations). Bambu Studio can now load and render 3dSynth exports.
  • Smart export default. When a Bambu Lab printer is selected, the primary export button automatically switches to "G-code (Bambu Studio)". Standard G-code remains available in the dropdown. Other printers default to standard G-code with Bambu as the secondary option.
  • Layer type annotations. Standard G-code export now includes ;TYPE:External perimeter annotations so PrusaSlicer, OrcaSlicer, and other viewers correctly identify the feature type instead of showing "unrecognized".
  • Documentation. New sections in Exporting G-code and Printer Compatibility covering the Bambu export format, compatibility matrix, and firmware-specific commands.

1.7.0 March 2026

  • Code cleanup. Full codebase cleanup and refactoring pass for improved maintainability and consistency.
  • Fix: License dialog buttons non-functional. Close button, Save button, and Gumroad link were dead in the Electron license/about/bug report dialogs — caused by CSP blocking inline JavaScript in data: URL windows. Dialog windows now use a separate session partition.
  • Fix: Inline event handlers hardened. All inline onclick attributes in dialog HTML replaced with addEventListener calls for defense-in-depth against future CSP changes.
  • License activation feedback. Successful activation now shows a dedicated success screen with animated checkmark and thank-you message instead of a brief text flash (Electron and web).
  • Main app toast on activation. A "Premium activated — all features unlocked!" toast appears in the main window after the license dialog closes.
  • Web license dialog stays open on success. The web license modal no longer auto-closes — users see the full success screen and close manually.
  • Fix: Gumroad API use count inflation. Background re-verification on app startup no longer increments the Gumroad usage counter — only the initial activation call counts a use.

1.6.6 March 2026

  • Fix: License dialog buttons non-functional. CSP session partition fix for Electron dialog windows.
  • Fix: Inline event handlers replaced. Defense-in-depth against CSP changes.
  • License activation feedback. Success screen with animated checkmark.
  • Main app toast on activation. Toast notification in the main window.
  • Web license dialog stays open on success. Modal no longer auto-closes.
  • Fix: Gumroad API use count inflation. Background re-verification no longer increments uses.

1.6.5 February 2026

  • SynthBlocks: Compare block. Comparison operators (&gt;, &lt;, =, ≠, ≥, ≤) return 1 or 0 for use in Conditional blocks — cleaner logic than max/threshold tricks.
  • SynthBlocks: Noise block. Smooth 2D fractal noise (FBM) for organic variation — hand-thrown textures, rough surfaces, non-repeating patterns.
  • SynthBlocks: Offset Path block. Inset/outset geometry by a distance with miter or round joins. Double-wall vases, thickened outlines, concentric shells.
  • SynthBlocks: Fill block. Fill enclosed shapes with lines, grid (crosshatch), or concentric patterns. Travel moves between fill lines for clean extrusion.
  • Fix: Slot block arc direction. Corrected left semicircle sweep so the slot shape renders as a proper pill.
  • Fix: Concentric fill. Robust offset polygon algorithm and correct sign convention — insets now move inward as expected.
  • Documentation: New block docs for Compare, Noise, Offset Path, and Fill added to SynthBlocks reference.

1.6.3 February 2026

  • SynthBlocks: Spiral Up rotations parameter. Spiral Up now accepts a rotations input controlling how many times geometry is repeated along the spiral. The engine re-evaluates the body per revolution with correct normZ, z, and layerIndex — enabling dynamic-radius spiral vases using MapRange(normZ, ...) in the Circle radius.
  • SynthBlocks: Constant layer height in Spiral Up. Z is now distributed per-revolution instead of by global path length. Each revolution gets equal Z advancement regardless of its circumference, producing perfectly uniform layers.
  • SynthBlocks: Seamless spiral seam fix. Closed-circle duplicate closing points are stripped per revolution so the spiral transitions continuously without a visible radial seam line. The exit point is at the final revolution's diameter.
  • Viewport variable slider: adaptive precision. Step size and drag sensitivity now scale with the variable's magnitude — small values (0.04) get fine control, large values (400+) get coarse control. Display precision matches automatically.
  • Viewport variable slider: bidirectional sync. Dragging the viewport slider now updates the Set Variable block in the Blockly canvas. Block edits clear any slider overrides. Slider and block always stay in sync.
  • Viewport variable slider: manual mode support. Slider commits now trigger generation even when auto-update is off, so the viewport always reflects the latest slider value.
  • Tutorial 2: Spiral Vase with Dynamic Radius. New beginner tutorial teaching Spiral Up, normZ, Map Range, and math expressions — build a seamless tapered vase in 5 blocks. Includes Load/Download project buttons.

1.6.1 February 2026

  • SynthBlocks: Named Variables. New Variables category with Set Variable and Get Variable blocks. Create named variables to accumulate and update values inside loops (Repeat, ForZ, ForRange). Variables persist across iterations and are global to the program.
  • SynthBlocks: Dynamic Variables toolbox. The Variables category is now dynamic — a "Create Variable" button prompts for a name and adds a block, and each existing variable automatically shows pre-filled Set and Get blocks ready to drag. A per-variable "Delete" button removes all blocks for that variable.
  • SynthBlocks: Live variable controls in 3D viewport. Variables with numeric initial values appear as interactive Blender-style numeric fields in the top-left of the 3D viewport. Drag to adjust, Shift+drag for precision, Ctrl+drag for snap — the preview updates in real time.
  • SynthBlocks: Variables documentation. New docs page covering blocks, toolbox workflow, viewport controls, examples (circles in a ring, growing radius, alternating offset), and comparison with For Range.
  • Fix: Pre-existing TypeScript errors resolved — missing getFirmwareType import in run.ts and ref type mismatch in ExportDropdown.tsx.

1.6.0 February 2026

  • Open in custom G-code editor in toolbar: The G-code action moved from the left dock tab row to the top toolbar. The button shows a </> icon with tooltip "Open in custom G-code editor"; it opens the G-code editor when a Custom G-code module is active, or exports the current design and opens it in the editor when G-code Sculptor or SynthBlocks is active.
  • G-code editor: scroll to layer on outline click. Clicking a layer in the Custom G-code filter (e.g. "Layer 20 (Z=10.221)") scrolls the editor on the right directly to that layer's start line.
  • Fix: Corrected AppContent type import path for useAppState (fixes module default-export resolution in some environments).

1.5.6 February 2026

  • Entitlements single source of truth: New config/entitlements.ts file — all free vs premium gating is now controlled from one scannable config (null = free, 'premium' = paid). Effects, transforms, SynthBlocks, viewer, export, presets, capture, and platform features are all listed. Changing a feature's tier updates UI gating, diamond badges, docs labels, and the premium modal automatically.
  • Premium modal redesign: Theme-first styling (accent-primary blue instead of amber/orange), data-driven content from entitlements (accurate effect counts, feature descriptions), and a new scrollable comparison table showing Free vs Desktop for every feature category including SynthBlocks.
  • Diamond badges updated: All premium diamond icons (badge, inline, modal) now use the app's accent blue (--accent-primary / --accent-secondary) instead of the old amber/orange gradient.
  • Toolbar "Get Desktop" CTA: Non-blocking purchase button in the toolbar for web users (hidden in dev mode and Electron).
  • Profile points now free: Removed premium gating from spline point add/delete — unlimited profile control points available to all users.
  • Docs premium flags derived: Doc section premium badges are now computed from entitlements instead of being hardcoded — fixes drift where Wave Shaper and Speed Mod were incorrectly marked premium in docs.
  • DEPLOYMENT.md fix: Corrected free modulator limit from 2 to 4.

1.5.5 February 2026

  • SynthBlocks documentation: New block docs for Text Line, Text, and 15 math blocks (Cos, Tan, Abs, Sqrt, Log, Round, Floor, Ceil, Negate, Arithmetic, Min, Max, Pow, Atan2, Pi). Copy writer reference updated with SynthBlocks block reference and text/font terminology.

1.5.4 February 2026

  • SynthBlocks Visual Programming Module: Full end-to-end visual block programming system for custom toolpaths — drag-and-drop blocks compile to typed IR, validated and interpreted by the engine to produce G-code. Includes Structure (Program, PathGroup, Sequence, Repeat, ForZ), Geometry (Circle, Polyline, Bézier, Rectangle), Z Strategies (Spiral Up, Stack Layers), Transforms (Translate, Rotate, Scale), Process (SetSpeed, SetFlow, SetTemperature), Travel, Math/Expressions (Number, Variable, MapRange, Clamp, Sin, Random), Safety (BoundsCheck, PreviewMarker), and Sampling blocks. Integrated with Blockly editor, themed canvas, toolbox, compiler, validation, seeded RNG, and full preview/export pipeline.
  • SynthBlocks: Rectangle block: New geometry block — axis-aligned rectangle centered at origin, defined by width and height. Works with all Z strategies including Stack Layers (closed path).
  • SynthBlocks: Travel blocks (8 blocks): Explicit travel control with absolute and relative modes. Separate blocks for XYZ, X-only, Y-only, and Z-only — move the nozzle without extruding and shift the coordinate origin for subsequent geometry.
  • SynthBlocks: Travel category: Travel blocks have their own toolbox category with a distinct teal color (--sb-travel), separate from Process blocks.
  • SynthBlocks: Travel updates coordinate origin: Travel moves now shift the coordinate frame so subsequent geometry draws from the new nozzle position — makes Repeat + Travel patterns intuitive.
  • SynthBlocks: Travel Z support: Travel Relative Z correctly lifts geometry to the new Z height for subsequent blocks, enabling layer-by-layer positioning without Z strategies.
  • Viewport: Travel line rendering: Travel moves now render as thin semi-transparent blue lines in the 3D viewport, clearly distinguishing non-extruding moves from extrusion paths. Works in both solid and wireframe views.
  • Viewport: Travel/extrusion separation: Fixed travel points being rendered as thick extrusion lines — the preview pipeline now carries per-point travel flags (travelFlags: Uint8Array) from engine through worker to viewer.

1.5.3 February 2026

  • Engine validation: Entry guards in runEngine() reject non-finite or invalid printer.layerHeight, printSpeed, and travelSpeed (defense-in-depth for CLI/direct API)
  • Contour-wave path: Layer count calculation now uses Math.max(0.1, layerHeight) for consistency with other generation paths and to avoid edge cases
  • New Design: 3D model clears immediately when choosing "New Design" (empty preview state applied before worker run)

1.5.2 February 2026

  • Navigation Gizmo: Blender-style viewport widget (orbit disc, zoom/pan/frame/projection) with drag-to-orbit, axis-aligned views, and Numpad shortcuts; added documentation
  • Viewport & Gizmo Fixes: Viewport rendering fixed after ortho/perspective camera swap; layer slider moved below gizmo; layer range commits on pointer release
  • Pan Control: Gizmo pan button supports drag-to-pan and click-to-frame-all

1.5.1 February 2026

  • Codebase Refactoring: Full formatting pass with Prettier (2-space indent, single quotes, trailing commas), standardized import ordering across all source files
  • Dead Code Removal: Removed unused barrel files, duplicate type definitions, and orphaned modulator modules
  • Naming Consistency: Renamed 18 generic Props interfaces to ComponentNameProps; consolidated duplicate viewer type exports
  • TypeScript Strict Compliance: Fixed all 40+ TypeScript errors — corrected ElectronAPI type definitions, added missing imports, fixed readonly array assignments, and resolved unsafe type casts
  • Developer Tooling: Added .prettierrc config and format script for automated code formatting

1.5.0 February 2026

  • Professional UI Redesign: Complete layout overhaul — multi-panel workspace with fixed toolbar, resizable left dock, central viewport with floating controls, and bottom status bar
  • Blender-Style Numeric Fields: All numeric inputs replaced with drag-to-edit fields featuring modifier-key precision (Shift), snapping (Ctrl), locale-agnostic decimal input, and auto-adaptive precision
  • Resizable Side Panels: Left dock, documentation panel, and presets panel are now drag-resizable with smooth direct DOM updates to prevent viewport flickering
  • Viewport Overlay Controls: Auto/Manual update toggle and "Needs Update" indicator moved to top-left viewport overlay; Fit/Solid/Quality/View controls moved to top-right
  • Layer Range Slider: Vertical dual-handle slider with pointer-based drag for smooth interaction — set top and bottom layer bounds via drag or direct text input
  • Themed Custom Tooltips: All native browser tooltips replaced with styled, animated tooltips matching the app theme — centralized styling in styles.ts for easy tweaking
  • Documentation Panel Improvements: Reduced font sizes for compact layout, wider panel, full-width content, and resizable width with drag handle
  • Bottom Status Bar: Generation status ("Ready" / "Generating...") with timing displayed alongside in the status bar
  • Resize Handle Indicators: Visual drag-handle lines on all resizable panel borders matching the G-code inspector style

1.3.3 February 2026

  • Blob Push Effect Overhaul: Completely fixed the Blob Push (metaball) effect with proper edge coverage and consistent behavior from bottom to top
  • Blob Push Boundary Fix: Effect no longer fades near top/bottom edges — mirror blobs ensure full metaball influence at boundaries
  • Blob Push Last Layer Fix: Fixed off-by-one error causing the top layer to lose all effect (appeared circular/shifted)
  • Blob Push Baseline Fix: Effect no longer adds constant offset to entire surface — only blob peaks push outward, valleys remain at profile radius
  • Spiral Parameter Fix: Spiral (Rot) now properly applies twist to effects — converted from degrees to radians internally
  • Spiral Units: Spiral parameter now uses degrees everywhere (range: -1800° to +1800°)
  • Growth Curve: New multi-point curve editor replaces the linear Growth slider — control effect strength at any height with draggable points
  • Growth Curve Semantics: Y-axis shows 0 = no change, +2 = maximum (3× strength), -2 = inverted (-1× strength)
  • Growth Curve Table: Points table below the curve allows direct numeric editing of height % and value
  • UI Border Fixes: Fixed semi-transparent divider lines in Profile Points table, Growth Curve table, and sidebar icons
  • Docked Documentation: Help/docs panel now docks to the right side — read documentation while continuing to use the app
  • Docked Presets: Presets panel also docks to the right — browse and load presets without losing your workspace
  • Enhanced Guided Tour: Completely revamped 11-step interactive onboarding with live demonstrations
  • Tour: Effect Demo: Tour now opens the effect picker and adds a Hex Iso Flow effect to show how effects work
  • Tour: Printer Setup: Tour opens Print Settings, shows the printer dropdown, and selects Bambu Lab A1 as an example
  • Transparent Screenshots: Screenshot capture now exports with transparent PNG background
  • Viewer Centering: 3D viewer properly re-centers when side panels open or close
  • Material Color Performance: Fixed heavy geometry rebuilds when changing material color — now updates instantly
  • G-code Load All: Added "Load all" button in G-code Inspector to view entire file at once
  • Dark Theme Default: Dark color scheme is now the default for new users
  • Cleaner Console: Removed verbose preset loading messages from browser console
  • HTML Validation: Fixed nested button elements in Print Settings panel
  • UI/UX Audit - Accessibility: Added aria-labels to 15+ icon-only buttons, aria-expanded to collapsible sections, aria-describedby support in Modal component, and keyboard support for interactive elements
  • UI/UX Audit - Theme consistency: Replaced 150+ hardcoded zinc- color classes with semantic CSS variables (--bg-, --text-*) for proper light/dark theme support
  • UI/UX Audit - Color system: Fixed hardcoded hex colors in SplineEditor, Viewer3DSimple, CaptureOverlay; migrated status colors to --danger/--warning/--success variables
  • UI/UX Audit - Typography: Added text-xl/text-2xl to design system, documented capture mode font sizes in styles.ts
  • UI/UX Audit - Premium badge: Updated SVG gradients to use --premium-amber/--premium-orange CSS variables
  • Comprehensive bug audit: Fixed 38 potential issues identified through systematic code review including edge cases, security hardening, and stability improvements
  • Engine stability: Added guards against division-by-zero, NaN propagation, and edge cases in spline evaluation, cap generation, and effect calculations
  • Performance optimizations: Replaced Math.sin/cos with fast lookup tables in hot loops, added linear interpolation to fastSin for smoother output
  • Memory management: Added memory budget tracking to undo history, worker cleanup mechanism, and gradient texture disposal to prevent GPU memory leaks
  • Project validation: Enhanced drag-and-drop loading with file size limits, spline point validation, and proper schema migration for older presets
  • Theme switch fix: Fixed 3D model disappearing when switching color themes by decoupling color updates from scene recreation
  • Security hardening: Added input validation to Electron IPC handlers, path containment checks, and file size limits
  • Numerically stable geometry: Improved discriminant calculation for line-circle intersections to handle near-tangent cases correctly
  • WebGL resilience: Added context loss/restore handlers for graceful recovery when GPU resources are reclaimed

1.3.2 February 2026

  • Theme system overhaul: Simplified border colors from 4 types to 2 (Border Default + Border Input)
  • Full theme support: Fixed 100+ hardcoded color classes to use semantic theme variables
  • SVG icons: Replaced PNG sidebar icons with SVG components that use currentColor
  • Color audit tools: Added developer scripts (border-audit.mjs, color-audit.mjs) to detect hardcoded colors
  • Consistent UI: Export buttons and dropdown menus now match the sidebar icon styling

1.3.1 February 2026

  • Collapsible cards: Profile, Julia Stack, and Contour Wave panels are now collapsible for a cleaner interface
  • Contour Wave UI split: Contour Wave (Woven) mode now shows Profile and Wave Settings as separate collapsible cards
  • Preview statistics: Print time, filament usage, and layer count now display accurate estimates in preview mode
  • Contour Wave layer count: Layer slider now shows accurate count for Contour Wave mode
  • Custom Overrides: New Print Settings section to manually override layer height, print speed, and flow rate
  • Contour Wave + Caps: Bottom Cap and Top Cap modules now work with Contour Wave (Woven) mode
  • Cap fill patterns: Contour Wave caps now support both Rectilinear and Concentric fill patterns
  • Cap preview fix: Cap layers in Contour Wave mode now show full preview matching standard Profile mode
  • Layer seam fix: Fixed visible vertical seam line in Contour Wave mode caused by extrusion during layer transitions

1.3.0 February 2026

  • Bambu Lab profiles: Added 9 new printer profiles — A1, P1P, P1S, P2S, X1, X1 Carbon, X1E, H2D, H2D Pro
  • Default nozzle: Changed default nozzle preset from 1.0mm to 0.4mm Standard
  • Profile folder cleanup: Reorganized printer profiles folder structure for cleaner codebase
  • Cap Fill Patterns: Bottom/Top Cap now supports Rectilinear and Concentric fill patterns
  • Concentric Fill: New circular infill pattern generates smooth concentric loops with proper hole support
  • Travel rendering fix: Fixed travel lines appearing in 3D preview
  • 3D highlight: Selected G-code lines are highlighted in red in the 3D viewer
  • Contour Wave controls: Restored 8 hidden parameters — Valley Dip, Peak Lift, Wave Speed, Dwell times, Retraction settings
  • Contour Wave preview fix: Preview now matches G-code output exactly
  • Contour Wave rendering: Fixed gaps/clipping in preview when using high frequency or large Z modulation
  • G-code Inspector: Added "Generate" button to preview G-code without exporting
  • G-code line selection: Click lines in the inspector to select them (Ctrl+click, Shift+click)
  • G-code pagination: Inspector shows 1500 lines at a time with "Load more" button
  • Viewport update fix: Fixed effects not updating the 3D preview when parameters changed
  • Z-seam fix: Fixed extrusion drop at layer boundaries in Spline mode

1.2.6 January 2026

  • Preview generation ~5x faster: Separated preview from export generation — G-code is only generated when you export
  • Auto-Update toggle: Switch between automatic preview updates and manual mode for complex models

1.2.5 January 2026

  • Massive printer profile library: 300+ built-in machine profiles, grouped by brand with search
  • Machine profiles are now real: build volume + leveling + startup/shutdown G-code templates are used during export
  • Settings UI redesign: Print Settings panel uses compact collapsible groups
  • Preset modals rebuilt: Machine/Material/Nozzle managers are consistent, in-screen, two-column
  • Better workflows: Apply no longer auto-closes modals
  • Bug fixes: fixed a Settings crash that could cause a black screen

1.2.1 December 2024

  • New Effects: Contour Flow, Flow Ridges, Julia Flow Ridges, Topo Contour, Hex Iso Flow, Hex Topo Contour
  • Transforms: Twist, Bend, Taper, Stretch — global shape transformations
  • Julia Stack: Fractal-based pattern generation (experimental)
  • Pattern Offset: Angle and Z offset controls for all effects
  • Layer Range: Restrict effects to specific layer ranges
  • Premium Features: Desktop app with full feature unlock
  • Export Options: STL, OBJ, GLTF 3D model export
  • Presets System: Save and load design presets with thumbnails
  • Mobile Preview: Browse presets on mobile devices

1.0.0 October 2024

  • Core toolpath generation engine
  • Profile Editor with bezier spline control
  • Base effects: Z-Ripple, XY-Ripple, Radial Blobs, Polygonizer
  • Bump Map textures with built-in patterns
  • Line Pattern and Single Line effects
  • Bottom Cap for closed base prints
  • Printer configuration with profile presets
  • G-code export for vase mode printing
  • 3D preview with layer visibility control
  • Keyboard shortcuts for power users
  • Documentation and onboarding tour