Fixed
Shape Asset Icons Vector Rendering (`desktop.html`, `editor.html`, `js/shapes.js`, `css/desktop.css`, `css/drawer.css`)
Replaced generic font icons in Project Asset Shape grid with crisp rendered SVG vector previews using normalized shape contours and theme-token colors.
Fixed
Shape Edit Live Canvas Invalidation Bug (`js/editor.js`, `js/desktop.js`)
Fixed live shape preview rendering not updating when adjusting shape parameters (roundness, points, sides, inner radius, size, and stroke); serialized all shape properties in `shapeKey` and cleared stale buffer canvas cache flags so the canvas updates immediately without requiring a browser refresh.
Fixed
Desktop Inspector Effects & Transform Layout (`desktop.html`, `css/desktop.css`)
Cleaned up transform mode buttons into clean text-only controls and adjusted effect parameter spacing in desktop inspector.
Fixed
Motion Blur Hue Breakup on Trails (`js/motion-blur-engine.js`, `js/text-engine.js`, `js/fishtool-engine.js`, `effects/fsmb.js`, `effects/shatter.js`)
Fixed
One-Sided Motion Blur Trails (`js/motion-blur-engine.js`, `js/text-engine.js`, `js/fishtool-engine.js`, `effects/fsmb.js`)
Fixed
3D Layer Penetration Lost Under Motion Blur (`js/fishtool-engine.js`, `js/editor.js`)
Fixed
True-Shape 3D Extrude for Text & Shapes (`js/fishtool-engine.js`)
Fixed
Effects Gallery Sticky Chip Gap (`css/effects-rack.css`)
Fixed
Project Background Colors & Custom Picker (`index.html`, `editor.html`, `desktop.html`, `css/modal.css`, `js/main.js`, `js/editor.js`)
Improved
Deep Glow Radiant Bloom & True Optical Falloff Engine (`effects/deep_glow.js`)
Improved
HDR Exposure Accumulation
Replaced single-clamp alpha limiter with progressive multi-pass accumulator, allowing `exposure` (up to 500%) to scale light exponentially without premature 1.0 clamping.
Improved
6-Octave Optical Bloom Pyramid
Expanded from 5 to 6 progressive octaves (from 0.15x hot core to 6.8x atmospheric dispersion) with 500px boundary padding to eliminate border cutoff.
Improved
Universal Linear De-Gamma
Applied `deGammaLut` (`pow(x, 1/2.2)`) and clean alpha unmulting across all blend modes, restoring luminous inverse-square glow in mid-tones and outer halos that were previously squashed dark.
Improved
Non-Destructive Composite
Re-engineered `source-over`, `screen`, and `lighter` compositing so the glow layers additively over the source without muting or dimming the crisp white cores.
New
3D Particle Engine Layer Effect (`effects/particle_engine.js`, `assets/icon-particles.svg`)
New
Source Fill Suppression
When placed on a Solid Layer or any layer, the original fill color or image is suppressed by default (`hideSource: 1`), turning the layer into a pure particle canvas.
New
3D Camera Depth & Tracking
Full real-time integration with scene 3D Camera (`cam.posX`, `cam.posY`, `cam.posZ`, `cam.rotX`, `cam.rotY`, `cam.rotZ`, `cam.cameraZoom`, `cam.cameraLens`). Moving, panning, tilting, dollying, and orbiting the camera renders particles with authentic 3D parallax, depth scaling, near/far depth fade, and painter's algorithm Z-sorting.
New
Comprehensive Emitter Controls
Point, Box, Sphere, and Disc emitters with 3D positions, volumes, directional angles, cone spread, and initial velocity with randomness.
New
Physics & Dynamics
Analytical 3D physics with gravity, air resistance/drag, 3D directional wind, and harmonic curl turbulence wiggle.
New
Particle Styles & Optimization
Glow Sphere, Sparkle Star, Crisp Circle, Glowing Ring, Smoke Puff, and Streak with cached sprite rendering, color blending over life, and 100% deterministic frame scrubbing and export.
Improved
Mobile & Low-End Laptop Performance Engine (`js/editor.js`, `js/text-engine.js`, `js/motion-blur-engine.js`, `js/fishtool-engine.js`, `js/preview-cache.js`)
Improved
Adaptive Canvas DPR
Capped preview canvas to 1.0 DPR on mobile and 1.5 on desktop/laptop (0.5 in Draft Mode), cutting GPU pixel redraw load by up to 75% on high-DPI smartphone displays.
Improved
Text Buffer Cache & WebGL Texture Re-upload Bypass
Implemented state-keyed buffer caching via `_lastRenderKey` and `_contentVersion` in `FishTextEngine.renderTextToCanvas`. Static and resting text layers bypass canvas clearing, glyph re-measurement, and `gl.texImage2D` texture re-uploads completely during playback and scrubbing.
Improved
Timeline Playhead DOM Thrashing Reduction
Cached `.desktop-workstation, .desktop-viewport` query selector checks and throttled playhead timecode DOM string updates to ~25fps (40ms interval) during active playback, significantly relieving mobile browser main-thread load.
Improved
Adaptive Motion Blur Sampling
Preview multi-sampling on mobile and Draft Mode is reduced to 2 passes with equal weight distribution, slashing multi-pass compositing overhead by 33% while preserving high-quality rendering (up to 64 samples) during export.
Improved
Adaptive RAM Preview Cache Memory Budget
Dynamically scales RAM preview frame limits based on mobile detection and `navigator.deviceMemory` (180 frames on mobile, 150–300 on low-RAM machines), protecting mobile browsers from OS memory pressure and OOM tab crashes.
Fixed
Baked Precompose Mechanism Removal (`js/preview-cache.js`, `js/editor.js`)
Purged baked image sequence precompose pipeline that caused massive lag and memory pressure.
Fixed
Warp 1/2/3 Layer Purge Bug (`js/openhaomi-controller.js`)
Fixed layer disappearance bug when repeatedly clicking Warp presets across different playback timestamps.
Fixed
Text Layer Canvas Boundary Disappearance (`js/text-engine.js`, `js/editor.js`, `js/fishtool-engine.js`)
Fixed issue where large text or text positioned near canvas bounds disappeared due to premature bounding box clipping.
New
Volumetric 3D Effects Suite (`effects/box_3d.js`, `effects/extrude_3d.js`, `effects/pyramid_3d.js`, `effects/sphere_3d.js`)
Fixed
Invisible 3D Layer Rendering Without Effects (`js/fishtool-engine.js`)
Fixed
Duplicate 3D Cube Gallery Item (`effects/box_3d.js`)
Fixed
Transform Scale Z Auto-Reveal (`js/editor.js`)
Fixed
Overlap Camera & Overlap Null — Flag Persistence Bug (`js/editor.js`)
`isOverlapCamera` and `isOverlapNull` flags were missing from `serializeLayer`, causing them to be stripped on every IDB save. On project reload/refresh, layers silently reverted to plain Camera / Null with no leapfrog behavior. Both flags are now explicitly serialized and preserved across all save paths (IndexedDB, `.ofts` export).
Fixed
Overlap Keyframe Drag Delay (`js/editor.js`)
During keyframe drag (`window.isTransformInteracting === true`), leapfrog accumulation is bypassed and standard linear interpolation is used instead. This makes the composition preview snap directly to the dragged keyframe's destination value, giving immediate visual feedback without the leapfrog phase offset delay.
Fixed
Overlap Camera & Overlap Null — Authentic Leapfrog Math (`js/editor.js`)
Rewrote leapfrog accumulation in `getLayerEffectivePropsAtTime` to correctly mirror the `_OVERLAP` null-rig architecture from `host/modules/misc.jsx`. Each transition `i` now contributes a **relative delta** `(K_{i+1} − K_i) × progress_i` additively on top of `K_0` baseline (`finalValue = K0 + Σ (K_{i+1} - K_i) × progress_i`), exactly matching the physical null-rig behavior in `applyKeyframeOverlap`. Previously, the label `accumulated` implied absolute interpolation but the math was computing sequential delta sums that double-counted intermediate keyframe values in 4+ keyframe scenarios.
Fixed
Overlap Last-Keyframe Overshoot (`js/editor.js`)
Final transition span extends to `t_M + (t_M − t_{M-1})`, so the animation continues past the last keyframe by one interval duration before clamping. Keyframe `K_M` value is now reached at `tEndFinal`, not at `t_M`, giving the last segment the same leapfrog momentum feel as intermediate transitions.
Fixed
CONTROL Grid Layout — Mobile Drawer & Desktop Panel (`css/drawer.css`, `css/desktop.css`)
Fixed asymmetric control grid. Mobile drawer `#add-layer-control-grid` now uses `repeat(3, 1fr)` (was misaligned with hanging empty slot). Desktop panel control grid uses `repeat(3, minmax(0, 1fr))` matching Shape grid symmetry. Button order reorganized into logical paired rows: Row 1 — Camera / Null / Adjustment; Row 2 — Overlap Camera / Overlap Null / Solid.
Improved
Overlap Camera & Overlap Null Default Easing
Default leapfrog Bezier curve uses dynamically computed `influenceOut`/`influenceIn` based on the interval span ratio (0.85 base influence, clamped 0.33–1.0), providing smooth organic overlap momentum. User-set graph easing is respected and propagated across all keyframes simultaneously via `setActiveEasing`.
New
Frischluft Lenscare Out of Focus Architecture (`effects/camera_lens_blur.js`)
New
Gamma
Continuous optical light accumulation power curve (`gamma`: 100 to 1000 / 1.0 to 10.0, default 220, supports extreme filmic bokeh at 626.0) replacing artificial gain/threshold bloom.
New
View Iris
Live aperture shape preview mode toggle rendering the isolated aperture diaphragm footprint on black background.
New
Iris Shape
6 Sides (Hexagon), 5 Sides (Pentagon), 7 Sides, 8 Sides (Octagon), 9 Sides, 10 Sides, Circle, 3 Sides, 4 Sides.
New
Iris Curvature
Dual-direction continuous blade curvature from -500.0 (concave star blades) to 0.0 (straight polygon blades) to +500.0 (convex circular blades).
New
Scale X & Scale Y
Independent horizontal and vertical anamorphic squeeze/stretch controls.
New
Bokeh & Bokeh Shading
Radial energy distribution bias (-100 to +100) and optical aperture edge falloff shading.
New
Quality
Sharper (112 samples), Standard (72 samples), and Faster (48 samples).
New
Magic Bullet Looks Anamorphic Flare & Haze Flare Porting (`effects/anamorphic_flare.js`, `effects/haze_flare.js`)
New
Anamorphic Flare (`anam`)
Complete Magic Bullet Looks architecture with `Boost`, `Threshold`, `Threshold Softness`, `Size`, `Thickness`, `Reflection` (secondary inverted ghost flare across optical axis center `1.0 - uv`), `Reflection Boost`, `Tint`, `Core Glow`, `Chromatic Fringe`, `Blend Mode`, and `Flare Only`. WebGL multi-pass GPU pipeline and Canvas 2D fallback.
New
Haze / Flare (`haze`)
Full Magic Bullet Looks optical diffusion and light scattering architecture with `Spillage` (controls highlight threshold & midtone bleed), `Softness` (multi-octave spherical Gaussian diffusion), `Reach` (horizontal cylindrical flare streak), `Exposure`, `Reflection` (secondary ghost flare bounce), `Reflection Exposure`, `Matte Box Size` & `Matte Box Shade` (lens hood light occlusion), `Tint`, `Blend Mode`, and `Haze Only`. WebGL multi-FBO pipeline and Canvas 2D fallback.
New
Per-Layer 3D Toggle Switch (After Effects Parity)
New
3D Depth Space Partitioning (`js/fishtool-engine.js`)
2D layers between 3D layers now properly split 3D depth passes, compositing in strict timeline stack order just like Adobe After Effects.
New
Dynamic Transform Controller & Keyframe Inspector (`js/editor.js`)
Automatically adapts UI controls (Z ruler, Z value cards, rotation axis segmented switch X/Y/Z) based on the layer's 3D switch state.
Fixed
3D Preview XYZ Gizmo Inversion & Camera Screen Projection (`js/scene-editor.js`, `js/3d_element_manager.js`)
Replaced naive axis delta guesswork with exact 3D camera screen projection of axis vectors, ensuring moving mouse along any axis (X, Y, Z) smoothly and intuitively drives object movement in world space matching cursor direction under all camera angles and rotations. Fixed inverted Y axis movement in `moveSelectedOnAxis`.
Fixed
Model Sinking Below Grid & Position Reset (`js/3d_element_manager.js`, `effects/3d_element.js`)
Fixed `mesh.position.set(posX, posY, posZ)` in `updateModelTransform` which previously inverted `posY` with `-posY`, causing objects to sink 50 units below the floor grid whenever properties or scenes were restored. Protected 3D manager models from being overridden by background timeline/composition render while Scene Editor is open.
Fixed
Proportional Gizmo Sizing & Hit Detection (`js/3d_element_manager.js`, `js/scene-editor.js`)
Compacted gizmo arrow length from 80 to 50 and refined camera distance scale factor from `dist / 400` to `dist / 650`, eliminating oversized arrows that dwarfed models. Added origin sphere and replaced `visible: false` on hit cylinder with `transparent: true, opacity: 0` so Three.js Raycaster reliably registers grab clicks. Added dynamic `grab` / `grabbing` cursor feedback.
Fixed
Restored `editor.html` & Bundled 3D Scene Editor Suite (`editor.html`)
Restored full 4900+ lines `editor.html` core layout and wired `css/scene-editor.css`, `js/three-loader.js`, `js/3d-element-db.js`, `js/3d_element_manager.js`, `js/scene-editor.js`, and `effects/3d_element.js`.
Fixed
Window Dragging Jumping & Offset Fix (`js/scene-editor.js`)
Replaced flex-relative `style.left/top` manipulation with cumulative `transform: translate3d(...)` tracking, eliminating all jump offsets when dragging the floating Scene Setup window.
Fixed
3D Visual Light Helpers (`js/3d_element_manager.js`, `js/scene-editor.js`)
Added visual 3D wireframe helpers (`THREE.PointLightHelper`, `THREE.SpotLightHelper`, `THREE.DirectionalLightHelper`) rendered live inside the 3D viewport with real-time update on position and intensity slider changes.
Fixed
Cleaned Scene Setup Header & Viewport (`css/scene-editor.css`, `js/scene-editor.js`)
Removed macOS traffic lights, menubar (`File`, `Window`, `Help`), and subtitle, replacing them with a crisp vector `✕` close button. Removed "No Model — click create" text overlay.
Fixed
Starter Primitive Spawning Crash Fix (`js/3d_element_manager.js`)
Fixed `ReferenceError: mesh is not defined` in procedural primitive creation, enabling instant click-to-spawn for Box, Cone, Cylinder, Plane, Sphere, and Torus.
New
Native 3D Rendered Primitive Thumbnails (`assets/primitives/`, `js/scene-editor.js`, `css/scene-editor.css`)
Replaced flat vector SVGs with true Three.js WebGL 3D rendered thumbnails (`box.png`, `sphere.png`, `cylinder.png`, `plane.png`, `torus.png`, `cone.png`) featuring studio 3-point lighting, metallic surface shading, and transparent backgrounds matching Adobe After Effects Video Copilot Element 3D Scene Setup. Deleted inaccurate primitive SVGs.
New
Cone Procedural Primitive (`js/3d_element_manager.js`, `js/scene-editor.js`)
Added 3D Cone primitive support across procedural mesh generation and scene tree hierarchy.
Fixed
Text Overlap & Panel Containment (`css/scene-editor.css`, `js/scene-editor.js`)
Replaced shared `.se-viewport-empty` (`position: absolute; inset: 0`) in materials, properties, and tree panels with dedicated `.se-panel-empty`, preventing "No Materials in Scene" and "No Selection" labels from breaking out and overlapping on top of the 3D viewport canvas. Added strict `position: relative` containment to drawer tabs and property panes.
Fixed
Pure Vector SVG Starter Primitives & UI Icons (`assets/`, `js/scene-editor.js`, `css/scene-editor.css`)
Eliminated all emojis across the 3D suite. Replaced primitive card emojis with crisp, dedicated vector SVGs (`assets/primitive-box.svg`, `primitive-sphere.svg`, `primitive-cylinder.svg`, `primitive-plane.svg`, `primitive-torus.svg`). Replaced navigation toolbar emojis (Orbit, Pan, Zoom, Reset Camera), hierarchy eye visibility buttons, and item deletion icons with crisp theme-token bound vector SVGs.
Fixed
Scale Factor TypeError on Primitives (`js/3d_element_manager.js`)
Fixed `TypeError: can't access property "scaleFactor", entry.bounds is undefined` when creating procedural primitives or updating transforms by computing bounding box and scaling factor upon primitive instantiation, and adding optional chaining in `updateModelTransform`. Primitives now serialize and restore cleanly across scene sessions.
Fixed
Effects Registry `onButtonClick` Dispatch (`js/effects.js`)
Fixed `FishEffectsRegistry.register()` dropping custom descriptor callbacks including `onButtonClick`. Custom action buttons (like "Open Scene Editor") now correctly trigger their target handler without failing silently.
Fixed
Instant Floating Window Display for Scene Editor (`js/scene-editor.js`)
Scene Editor floating popup window now appears instantly upon button click with smooth animation, running background 3D initialization and environment maps asynchronously with comprehensive try-catch safeguards.
Fixed
Three.js r128 Color Space Compatibility (`js/3d_element_manager.js`)
Added dual fallback between modern `THREE.SRGBColorSpace` and Three.js r128 `THREE.sRGBEncoding` for renderer output and texture encoding.
Fixed
3D Suite Asset Loading & MIME Types (`editor.html`, `desktop.html`, `server.js`)
Bundled Scene Editor stylesheets and scripts into `editor.html` with cache buster query parameters, and registered 3D asset MIME types (`.glb`, `.gltf`, `.bin`, `.hdr`) in `server.js`.
Fixed
Local Three.js Vendoring & Offline Support (`vendor/three/`, `js/three-loader.js`)
Vendored Three.js r128 UMD build (`three.min.js`, `GLTFLoader.js`, `OrbitControls.js`) locally into `vendor/three/` to eliminate external CDN 404s, CORS blocking, and subresource integrity errors. Provides 100% offline 3D element rendering with automatic CDN fallback.
Fixed
Select Parameter Handling in Effects Rack (`js/effects.js`)
Fixed `Uncaught TypeError: o.toLowerCase is not a function` when rendering effects with structured `{ value, label }` options (such as `alphaMode` in 3D Element), preventing effects rack inspector crashes.
Fixed
Service Worker Fetch Interception (`sw.js`)
Replaced invalid `null` return on external fetch failure with a valid 408 Request Timeout Response, preventing browser worker interception failures.
Fixed
Keyframe Deselection in Expand Layer (`js/editor.js`, `js/desktop.js`)
Clicking on empty track space (`.desktop-kf-track-row`, `.desktop-kf-tracks-wrapper`) or clicking on an already-selected single diamond now reliably deselects keyframes. Empty timeline clicks now prioritize deselecting keyframes before closing/deselecting layers.
Fixed
AE-Style Dual-Tone Keyframe Diamonds (`css/desktop.css`)
Overhauled keyframe diamonds to precisely match Adobe After Effects visual hierarchy. Unselected keyframes now render as subtle 8px dual-tone silver/gray diamonds (`::before` split). Selected keyframes expand to 12px with a prominent 2px solid primary selection border and dark perimeter outline, eliminating visual confusion between selected and unselected states.
New
Solid Layer Button in Control Camera Layer Panel (`desktop.html`, `editor.html`, `js/editor.js`, `css/desktop.css`, `css/drawer.css`, `assets/control-solid.svg`)
Added Solid Layer button alongside Camera, Null, and Adjustment in the Control Camera Layer category panel. Creates a full-bleed shape layer automatically dimensioned to match project resolution, with interactive timeline drag-and-drop support.
New
3D Element Plugin & Three.js Scene Setup (`effects/3d_element.js`, `js/3d_element_manager.js`, `js/scene-editor.js`, `css/scene-editor.css`)
Isolated Three.js rendering plugin directly inside Effects Rack. Features Scene Editor floating window with resizable panels, scene tree hierarchy, 3D viewport with OrbitControls, multi-model support, customizable point/directional lighting, material inspector (color, roughness, metalness, wireframe, opacity), and project save/discard confirmation dialog.
New
IndexedDB 3D Model Storage (`js/3d-element-db.js`)
Persistent offline model storage via `HAOMI3DModels` IndexedDB store for imported OBJ/GLTF/GLB models.
New
Effects Rack Button & Hidden Param Types (`js/effects.js`, `js/editor.js`, `css/effects-rack.css`)
Effects definition now supports `type: 'button'` for interactive action triggers and `type: 'hidden'` for persisting serialized scene state.
Fixed
Effects Rack Actions Persistence (`js/effects.js`, `css/effects-rack.css`)
Hide/show effect toggle (eye button) and reorder drag handle no longer disappear when an effect card is expanded. Both buttons remain permanently accessible in both collapsed and expanded states, alongside kebab menu and quick delete.
Fixed
Desktop Inspector Effects Rack Theme Overhaul (`css/desktop.css`, `css/effects-rack.css`, `js/editor.js`)
Overhauled effect cards for desktop mode to sync with desktop inspector design language ("mengkotak dan rounded dikit"). Cards now feature `border-radius: var(--desktop-radius-sm)` (3px), elevated surface contrast (`--bg-panel` on `--bg-dashboard`), compact 28px header height, and 20px squared action buttons. Controls area inside cards now features recessed interior (`--bg-panel-inner`), compact 22px rows, and squared scrubbers (`--bg-canvas` with 3px radius) replacing rounded mobile pills. Mobile swipe-to-delete is disabled on desktop.
Fixed
Anamorphic Flare Overhaul (`effects/anamorphic_flare.js`)
Replaced broken whole-frame squash/stretch and contrast filter with genuine optical anamorphic lens flare engine. Implements strict Rec.709 specular highlight extraction with smooth shoulder (midtones and darks zeroed out), 1D directional horizontal streak shader with progressive exponential decay, white-hot specular core hotspot preservation, chromatic dispersion fringe, and universal Canvas2D fallback.
Fixed
Haze / Flare Overhaul (`effects/haze_flare.js`)
Replaced flat full-screen milky fog box (`fillRect lighter`) and contrast filter with authentic cinematic diffusion haze and 35mm film halation. Implements soft-shoulder highlight roll-off extraction, Kodak Vision3 5219 red scatter halation rim bleed along highlight boundaries, multi-octave atmospheric diffusion bloom, color temperature warmth control, and zero contrast destruction in unlit shadows.
New
Desktop After Effects-Style Context Menu (`js/popover.js`, `css/popover.css`, `js/editor.js`, `editor.html`, `desktop.html`)
New
Desktop Parent Dropdown Entrance Animation (`css/desktop.css`, `js/desktop.js`)
Fixed
Mobile Parent & Playback Popover Primary Outline (`css/popover.css`)
New
Multi-Selection Batch Layer Reordering (`js/editor.js`, `js/desktop.js`, `css/editor.css`)
New
Smooth Animated Row Shifting on Desktop & Mobile (`js/desktop.js`, `js/editor.js`)
Fixed
Multi-Selection Batch Motion Blur Toggle (`js/desktop.js`, `js/editor.js`)
Fixed
Multi-Selection Batch Parent & Self-Parent Guard (`js/desktop.js`, `js/editor.js`)
Improved
Balanced Attributes Matrix Grid (`css/popover.css`)
Improved
Pure Effect Category Label (`js/attributes-clipboard.js`, `demo.html`)
Fixed
Clean Selection-Bound Copy & Paste Toolbar Buttons (`js/attributes-clipboard.js`, `js/desktop.js`)
Fixed
Attribute Clipboard Fill Copy & Paste (`js/attributes-clipboard.js`)
Fixed
Proportional Keyframe Time-Stretching (`js/attributes-clipboard.js`)
Fixed
Empty Timeline Track Hover Stabilization (`css/desktop.css`)
Fixed
Wireframe Playback Lookahead Cache Desync (`js/editor.js`)
New
AE-Style Auto-Scrolling Marquee Selection (`js/desktop.js`)
Improved
Minimalist Attribute Matrix Popover (`desktop.html`, `editor.html`, `demo.html`, `css/popover.css`)
Improved
Zero-Lag Batch Layer Selection (`js/editor.js`, `js/desktop.js`)
New
Desktop Expanded Keyframes Multi-Selection, Drag, Copy, Paste & Delete (`desktop.html`, `js/desktop.js`, `js/editor.js`, `css/desktop.css`)
New
Interactive Multi-Selection
New
Simultaneous Multi-Drag & Re-timing
New
Keyboard Copy & Paste (Cmd+C / Cmd+V)
New
Keyboard Delete & Deselect (Delete / Backspace / Escape)
New
Event Delivery & Interception Hardening
New
Desktop Exclusive Collapsible Layer Keyframe Tracks (`desktop.html`, `js/desktop.js`, `js/editor.js`, `css/desktop.css`)
Fixed
Instant Save Settings Pop-up Dismissal (`js/editor.js`, `js/main.js`, `js/db.js`)
Improved
Hardware WebGL Motion Blur for 3D Layers (`js/fishtool-engine.js`, `js/editor.js`)
Improved
Identity & Zero-Opacity Adjustment Layer Bypass (`js/effects.js`, `js/editor.js`)
Improved
Canvas Shape Texture Caching & Background Pre-warming (`js/editor.js`, `js/fishtool-engine.js`)
New
Direct `.ofts` Project Drag & Drop (`js/editor.js`)
Dropping `.ofts` project archives anywhere onto the desktop canvas, timeline, or media pool automatically unpacks and loads the project with the Template Editor open.
Fixed
`markerNames` ReferenceError & Snapshot Crash (`js/editor.js`)
Fixed `ReferenceError: Can't find variable: markerNames` in `_computeFingerprint` and `saveCurrentProjectLayers`, which caused unhandled promise rejections and prematurely halted project loading.
Fixed
Template Editor Auto-Open on Import (`desktop.html`, `js/editor.js`, `js/desktop.js`)
Restored reliable automatic pop-up of Template Editor on initial `.ofts` import across desktop and mobile workstations. Added multi-attempt polling, project state hydration, and idempotency protection.
Fixed
Mobile View Switch Modal Prompt (`js/desktop.js`, `desktop.html`)
Widened viewport threshold (`<= 900px`), added coarse pointer / touch detection, removed stale dismissal traps, and ensured the "Switch to Mobile View?" modal prompts promptly on phone screens and responsive viewports.
Improved
Network-First Service Worker Strategy (`sw.js`)
Switched static asset caching to Network-First with cache fallback, preventing stale cached script traps while preserving full offline PWA functionality. Added `desktop.html` and `editor.html` to pre-cached core assets.
New
Dedicated Beatmark Shortcut "M" (`js/editor.js`)
Assigned the `M` key to toggle markers/beatmarks at the current playhead time across desktop workstations. Updated timeline toolbar button tooltips and labels to `Add Marker / Beatmark (M)`.
New
Desktop Timeline Layer Row Dividers (`css/desktop.css`, `css/editor.css`)
Added clean, high-contrast horizontal divider lines (`border-bottom: 1px solid var(--border-panel)`) between all timeline track lanes and lane head pills. Expanded track lanes across the full scrollable width (`width: max(100%, 20000px)`) so divider lines seamlessly span the entire timeline.
New
Floating Sticky Timeline Zoom Slider (`desktop.html`, `css/desktop.css`, `js/desktop.js`)
Added a floating zoom control widget (`.desktop-timeline-floating-zoom`) pinned to the bottom-right of the desktop timeline with `-` / `+` steppers, direct slider scrub (20–400px/s), and reset badge.
New
Dedicated Magnet Snapping Control (`#editor-btn-magnet`, `js/desktop.js`)
Introduced a dedicated magnet button in the desktop timeline toolbar with keyboard toggle `N`. Playhead scrubbing now snaps directly to nearby beatmarks when magnet mode is enabled.
Fixed
Shape Layer Persistence ("Shape Ga Ke Save") (`js/editor.js`, `js/db.js`)
Fixed critical bug where navigating back via `#editor-project-back-btn` unloaded the page before pending IndexedDB transactions committed. Implemented synchronous active project snapshots (`oft_active_project_backup_<id>`), auto-save upsert guards, full shape transform serialization (`transformScaleX`, `transformScaleY`, `isSolid`), and self-healing fallback project recovery.
Fixed
Instant Marker Style Consistency ("Style Marker Ga Konsisten") (`js/editor.js`, `css/editor.css`)
Fixed bug where newly added markers initially rendered with the legacy pentagon pin and only updated to the circle neon pin upon scrubbing. `createBeatmarkItemEl` and `createBeatmarkLineEl` now generate the modern circle pin (`<circle cx="5" cy="5" r="4.5"/>`), panel hole, `.is-beatmark` class, and dashed vertical line from element creation.
Fixed
Duplicate Beatmark Keydown Cancellation (`js/desktop.js`)
Removed duplicate `keydown` handler in `desktop.js` that triggered a double-toggle on `M` keypress (adding and immediately deleting the marker).
Improved
Hold-Before-Drag Beatmark Protection (`js/desktop.js`)
Implemented a 250ms press-and-hold delay with haptic feedback before unlocking marker drag-and-drop, preventing accidental displacement when scrubbing the timeline over markers.
Improved
Desktop Workstation Navigation Routing (`js/main.js`)
Opening or creating projects on desktop viewports (`window.innerWidth >= 900`) now routes automatically to `desktop.html` and persists workstation layout preferences.
New
Smart Look-Ahead Playback Caching (`js/preview-cache.js`)
Introduced `startLookaheadWorker(fromSec, fps)` — during playback, a background worker pre-renders frames **ahead** of the current playhead into the RAM preview cache (default 1.5 s window, configurable via `window.cacheLookaheadSec`). Uses `MessageChannel` macro-tasks to fire reliably between `requestAnimationFrame` ticks without blocking the main render thread. The lookahead window slides forward with the playhead and auto-restarts only when the playhead advances past the worker's range. Worker stops cleanly on pause, scrub, or export.
Fixed
Look-Ahead Worker Cancel Bug
Previous implementation called `stopLookaheadWorker()` on every 3rd tick, cancelling the worker before it could render a single frame. Fixed: worker now persists until the playhead advances past its pre-baked range.
Fixed
Canvas Corrupt Mid-Encode Bug
Worker now `await`s `setFrameFromCanvas` (bitmap encode) **before** scheduling the next step, preventing the offscreen canvas from being overwritten while `createImageBitmap` is still running.
Fixed
O(1) Queue Tail Tracking
Replaced `Math.max(...queue)` spread (O(n), stack risk on large queues) with a `_lookaheadQueueTail` pointer for O(1) queue extension as the lookahead window slides.
Improved
Canvas 2D Context Caching (`js/editor.js`)
`renderCanvasFrame` now caches the `2d` context on the canvas element (`canvas._cachedCtx`) instead of calling `getContext()` on every frame. Context is only re-created when `alpha` mode changes (normal → export path). Eliminates redundant browser context lookup overhead per tick.
Improved
`imageSmoothingQuality` Per-Frame Write Eliminated
Safari smoothing quality (`'high'`) is now set once per canvas context creation instead of being written every frame, removing a GPU state write per render tick.
Improved
Look-Ahead Cache Write Guard (`js/editor.js`)
`renderCanvasFrame` now excludes `triggerSource === 'lookahead-cache'` from the main live-frame cache write path — the lookahead worker writes directly via `setFrameFromCanvas`, preventing double-encode of the same frame.
New
Single Source of Truth (SSOT) Versioning (`scripts/sync-version.js`)
Unified project version management into `version.json`. Changing `version.json` (or running `npm run bump <version>`) automatically synchronizes `package.json`, HTML badges, script cache busters, and release notes feeds across `index.html`, `editor.html`, and `demo.html`.
New
Live Dev Server Version Synchronizer (`server.js`)
Hooked `syncVersion()` directly into `fs.watch(ROOT)`. Editing and saving `version.json` in any editor immediately propagates new version data and reloads the browser.
Improved
Template Editor Initial-Import Auto-Open & Clean Refresh
Exported `.ofts` project packages now include `isTemplate: true` so the Template Editor pops up automatically on first import. Once displayed, `isTemplate` immediately resets to `false` in memory and IndexedDB and `&template=1` is removed from the URL, guaranteeing the Template Editor never re-appears unexpectedly on browser refresh.
Improved
Zero Hardcoded Fallback Versions
Completely eliminated hardcoded fallback version strings in `js/main.js`, `js/editor.js`, and `js/FishExport-Enggine.js`. Runtime components now dynamically query `version.json` or the DOM changelog feed, degrading cleanly without hardcoded version literals.
New
Mobile Preview Splitter Drag Handle
Interactive horizontal drag handle anchored right on the boundary between preview canvas and controller on mobile viewports. Fluidly resize preview height (22%–78%).
Improved
Borderless Theme-Bound Splitter Styling
Pill surface styled seamlessly with controller background without outlines or borders, featuring vibrant primary neon feedback on touch and drag.
Improved
Persistent Mobile Sizing & Showcase
Custom preview split height is saved to local storage with real-time ruler and needle recalibration. Showcase added to component catalog.
Fixed
Image Sequence (.ZIP) Cancel & Cache Purge
Clicking Cancel Export during Image Sequence export now immediately aborts frame loops, halts ZIP packing, purges memory buffers, and wipes all studio caches.
Fixed
Safari Full Video + Audio MP4 Export
Resolved audio-only output on Safari. Tier 1 WebCodecs GPU renders full-resolution uncropped frames, and single-threaded FFmpeg seamlessly attaches AAC audio in <200ms without SharedArrayBuffer errors.
Improved
Unified Export Cancellation & Deduplication
Synchronized cancellation handlers across all export engines with in-flight lock on cache purges to eliminate redundant operations.
Fixed
Safari Modal Popstate & Popover Dismissal
Eliminated popstate race conditions that caused export modals to close prematurely in Safari, and fixed popover tail arrow rotation.
Fixed
Template Editor Cut Media Deduplication
Cuts and splits of the same source media are now grouped cleanly into a single card with cumulative duration and occurrence badges.
Improved
Timeline Left/Right Lane UI Overhaul
Removed clutter layer preview circle in favor of compact eye button, and added automatic theme token contrast for reorder handles.
Fixed
Null Expression Beat Marker Scoping
Resolved stacked null layers losing beat markers outside adjacent null duration windows.
Improved
Timeline Parent-Child Link Connectors
Restructured hierarchy connector lines to match After Effects 1:1 with non-overlapping channels and smooth curves.
Fixed
Motion Blur on Null-Driven Layers
Enabled velocity detection and sub-frame multi-sampling for layers animated via parent expressions.
Added
Timeline Empty State
Added centered 'Drop media here to import' placeholder with interactive dragover highlight.
Added
OpenHAOMI Warp Presets
Added Preset section under Beat Effects featuring one-click multi-layer adjustment presets (WARP1, WARP2, WARP3).
Fixed
Timeline Playhead Synchronization
Resolved playhead drift during background cache renders; frame-snapped preset placement precisely to the current playhead frame.
Fixed
Wave Warp Effect Rendering
Enhanced Wave Warp canvas shader to support smooth-noise synthesis, directional angle rotation, and seamless edge tiling.
Fixed
Debug Panel Relocation
Moved Debug / Layer Inspector from Composition Settings header to OpenHAOMI settings panel.
Fixed
IndexedDB Storage Calculation
Accurate project database storage calculation including raw binary media blobs and frame render cache.
Fixed
Template Editor Layout
Pinned media replacement dock to the top on desktop and enlarged touch-friendly cards on mobile.
Fixed
UI Scrollbar Visibility
Removed forced scrollbar hiding; enabled clean, theme-matched slim scrollbars across all scrollable lists.
Added
OFTS Export Progress Modal
Real-time export progress indicator with DEFLATE Level 9 compression for fast and lightweight .ofts project files.
Added
FSMB Effect & Playback Popover
Fish Motion Blur velocity-based frame blending and long-press Play menu with Loop, Speed, and Cache controls.
Improved
Welcome Notice Refinement
Clean, objective presentation with complete transparency regarding the active Alpha development phase.
Added
Multi-layer Selection & Drag
Select and drag multiple layers simultaneously across the timeline.
Added
Null Object & Layer Parenting
Hierarchical transform parenting between layers and null object controllers.
Added
Group Masking (Alight Motion style)
Mask and Exclude group creation with destination-in and destination-out blend modes.
Fixed
Audio Scrubbing Glitch
Eliminated audio noise artifacts during rapid timeline playhead scrubbing.
Added
Modular Layer Effects Registry
Extensible modular JavaScript layer effects plugin architecture under effects/.
Added
Interactive Graph Curve Editor
Interactive bezier curve editor with control nodes, tangent lines, and timing presets.
Improved
Matcha Theme Standardization
Standardized color tokens from css/theme.css and 100% Cal Sans typography.