Skip to content

Releases: froggeric/Emberweft

v0.6.1

Choose a tag to compare

@froggeric froggeric released this 18 Aug 15:00

Framing at last: every genome keeps its authored composition at every output resolution, from the archive to the export sheet to the library thumbnail and the playback preview. This release also fixes the GUI crash when generating into any non-1080p shard, and rebuilds the context menus on a native AppKit bridge so they no longer vanish mid-use.

Added

  • Resolution-independent framing. A genome's scale is absolute pixels-per-unit authored for its own canvas, so changing the output resolution used to change the composition (720p read zoomed in, 4K zoomed out). Framing now re-anchors scale to the output width (the Electric Sheep gen-248 authoring anchor: scale/width agrees to 2 percent across the archive's three authored-size populations, while scale/height differs by 34 percent) via a multiplicative correction, the perceptually correct log-scale form. New --framing faithful|normalized flag on export (including the batch --jobs path) and flock generate|stitch (default normalized; --framing faithful restores the raw scale), a Framing picker (Normalized default / Authored) in the GUI export sheet, and an emberweft.framing video tag plus exact catalog hit-gate so a stitched archive can never mix framing modes. Legacy v0.6.0 archive artifacts re-render on the next generate or stitch. animate and the renderers are unchanged (always faithful); animate-to-export byte-identity pins stay green.
  • Normalized framing in the library and previews. Thumbnails and both playback windows (single-genome and collection sequence) now frame exactly like an export at any resolution. The thumbnail cache carries a generation marker, so pre-0.6.1 caches re-render once.

Fixed

  • GUI crash when generating into a non-1080p shard (v0.6.0). The encoder sized its pixel-buffer pool from the export settings' default resolution while frames rendered at the shard dimensions, trapping on any shard other than 1080p. The archive render path now force-aligns the encoder resolution to the shard.
  • Context menus vanishing before a click landed. The grid and list context menus (library cells, collection cells, folder and collection rows, flock browse rows) moved from SwiftUI context menus to a native AppKit responder-chain menu. SwiftUI tore the old sessions down on cell re-renders (a thumbnail finishing its load, a facet or badge publish), worst on the multi-level Add to Collection submenu. Menus are now built as a snapshot at right-click time and cannot dismiss or mutate mid-session. Destructive items are styled in the system red. Left-click behavior (taps, buttons, drag-reorder) is unchanged.

Install: download the zip, unzip, move Emberweft.app to /Applications. If macOS flags the un-notarized download, clear it with: xattr -dr com.apple.quarantine Emberweft.app

v0.6.0: the flock archive

Choose a tag to compare

@froggeric froggeric released this 15 Aug 23:17

This release changes how long videos get made. Instead of rendering every
frame of a long export in one shot (a 5-genome sequence at top quality took
over 3 hours), Emberweft now keeps an archive of pre-rendered loops and
edges, and composes long videos from those files. Material is rendered once
and reused forever: a fully cached sequence stitches in seconds.

How you use it

  • The new Flock area in the app has three tabs. Generate pre-bakes loops and
    edges into the archive. Stitch composes the long video: it tells you up
    front how much is already cached versus what it will render, then hands you
    the finished file. Browse shows what you have, per shard, with sizes and
    thumbnails.
  • Everything sources from your library: your favorites, your collections, or
    whatever you have selected. No file pickers.
  • Pick the quality once (Standard is the default and is fast; genome-default
    is the mastering tier) and how many times each loop plays. The archive
    upgrades itself: re-rendering at higher quality replaces the old file
    rather than adding a duplicate.
  • Progress is honest: per-video frame counters, an ETA, a running indicator
    in the sidebar, and a Cancel that takes effect within a couple of frames.

A real Mac app

Emberweft now ships as Emberweft.app with its own icon. Double-click it and
it opens, with no Terminal window left behind. The CLI is unchanged and sits
beside the app.

Also in this release

  • Stitched videos no longer jump at segment boundaries (the frame-to-frame
    difference at every seam now matches a one-shot export).
  • Generation is dramatically faster (renders were quietly using the genome's
    ~1000 temporal samples instead of the chosen tier's).
  • Electric Sheep genomes keep their real generation and id in the archive.
  • One-shot export moved out of the playback windows into the library
    selection, with a default quality in Settings.
  • You can create collections and add to them from anywhere.
  • New CLI: emberweft flock generate | stitch | browse | rebuild |
    export-list, including an Electric Sheep list XML export.

Download the zip, unzip it, and drag Emberweft.app to /Applications (or run
it in place; keep the emberweft CLI next to its bundle if you use it). The
first launch of a downloaded copy may need:
xattr -dr com.apple.quarantine Emberweft.app

Engine parity, determinism, and the animate/export byte-identity guarantees
are unchanged.

v0.5.7: fix jerky half-speed motion (remove loop-repeat)

Choose a tag to compare

@froggeric froggeric released this 11 Aug 20:35

v0.5.7 removes the loop render-once-repeat feature, which caused exported motion to play at half speed (the jerky, slowed-down, flickering playback). Each frame is now rendered and appended exactly once.

Removed

  • loopRepeatCount and the GUI "Loop repeat" stepper, the CLI --loop-repeat flag, and the loopRepeatMemoryExceeded RAM guard. The repeat-greater-than-one cache-and-replay branch in the render loop is deleted; every loop and transition frame is rendered once and appended once.

Why
The default repeat count was 2, so each loop frame was written twice as identical bytes. A 30 fps container showed only 15 fps of real motion: the rotation advanced every other output frame, producing the jerky, flickering, slowed-down playback. The frame-rate and blend-time model was sound; the duplication was the cause.

Backward compatibility

  • A v0.5.6 export checkpoint (with a loopRepeatCount key) still decodes on v0.5.7 (Swift keyed decoding ignores unknown keys), so resume works across the version boundary.
  • Renderer math, determinism, Metal/CPU parity, and the animate/export mastering path are unchanged.

Install
Download and unzip. The binary is unsigned, so clear quarantine before running:
xattr -dr com.apple.quarantine emberweft emberweft_FlameRenderer.bundle
Run the GUI from the folder that holds the resource bundles:
./emberweft-gui
Or the CLI:
./emberweft --help
Requires macOS 26 on Apple Silicon.

v0.5.6: smoother, cleaner, faster low-quality exports

Choose a tag to compare

@froggeric froggeric released this 11 Aug 19:19

v0.5.6 consolidates the documentation for the temporal-smoothing quality work shipped across v0.5.2 through v0.5.5. The code is unchanged from v0.5.5 and the binary is identical. This note summarizes what that arc delivered for anyone upgrading from v0.5.1.

Low-sample exports no longer flicker. Draft, Standard, and High quality exports are now smooth from the first frame (no grainy ramp-in, no lag) and visibly cleaner than before. A Standard export reaches roughly genome-default cleanliness at about 33x the render speed, and Draft exports are over 2x faster (the temporal-samples default was wasteful at low samples-per-pixel).

What changed, in plain terms:

  • Smoothing from frame 1. A centered box window replaced the original causal filter, so smoothing applies immediately with no startup ramp and no motion lag.
  • Cleaner quality tiers. Draft, Standard, and High were under-sampled (they inherited the realtime preview's sample counts). They are now tuned (samples-per-pixel 8, 30, 100), with temporal smoothing layered on as free supersampling.
  • Faster, smarter defaults. The named tiers no longer inherit the genome's high temporal-samples, which added up to +136% render time at low spp for motion blur that is invisible on slow ambient loops. Choosing a quality tier now auto-sets the appropriate temporal-samples (Draft single-pass, Standard 4, High 16; Genome-default keeps the full genome value).
  • Genome-default is untouched. It remains the byte-exact mastering path, identical to emberweft animate.

Nothing about the renderer math, determinism, or the animate/export mastering path changed. If you only export at genome-default, your output is byte-identical to v0.5.1.

Install
Download and unzip. The binary is unsigned, so clear quarantine before running:
xattr -dr com.apple.quarantine emberweft emberweft_FlameRenderer.bundle
Run the GUI from the folder that holds the resource bundles:
./emberweft-gui
Or the CLI:
./emberweft --help
Requires macOS 26 on Apple Silicon.

v0.5.5: quality tier auto-sets temporal samples

Choose a tag to compare

@froggeric froggeric released this 11 Aug 19:12

v0.5.5 makes the export quality tier automatically set temporal-samples to its most-appropriate value when picked.

Added

  • Quality tier auto-sets temporal samples. Picking Draft sets ts to 1 (single-pass, fastest), Standard to 4 (free mild blur at spp 30), High to 16 (free moderate blur at spp 100), and Genome-default to 1 (use genome default, the mastering path). The user can override the temporal-samples stepper after picking.

Notes

  • Complements v0.5.4 (named tiers default to single-pass at ts=1) by making each tier proactively set its best ts. Temporal samples is motion blur, not grain (grain scales with samples-per-pixel). Genome-default quality is unchanged (byte-identical to animate).

Install
Download and unzip. The binary is unsigned, so clear quarantine before running:
xattr -dr com.apple.quarantine emberweft emberweft_FlameRenderer.bundle
Run the GUI from the folder that holds the resource bundles:
./emberweft-gui
Or the CLI:
./emberweft --help
Requires macOS 26 on Apple Silicon.

v0.5.4: temporal-samples default fix

Choose a tag to compare

@froggeric froggeric released this 11 Aug 13:39

v0.5.4 fixes a temporal-samples default that made the named quality tiers (Draft, Standard, High) slower than necessary.

Changed

  • Named tiers default to single-pass rendering. The "use genome default" fallback for temporal-samples=1 now applies only to genome-default quality (the mastering path, byte-identical to animate). For the named tiers, temporal-samples=1 is literal single-pass. This removes the dispatch overhead of about 64 sub-passes at low samples-per-pixel (measured +136% at spp 8, +35% at spp 30) for within-frame motion blur that is invisible on slow loops. Users can still raise temporal-samples explicitly for motion blur.
  • The export sheet label reflects this ("single-pass" for named tiers, "genome default" for genome-default).

Notes

  • Genome-default quality is unchanged (byte-identical to animate). animate/export byte-identity and Metal/CPU parity are preserved.
  • Temporal samples is motion blur, not grain; it does not affect the noise level (grain scales with samples-per-pixel).

Install
Download and unzip. The binary is unsigned, so clear quarantine before running:
xattr -dr com.apple.quarantine emberweft emberweft_FlameRenderer.bundle
Run the GUI from the folder that holds the resource bundles:
./emberweft-gui
Or the CLI:
./emberweft --help
Requires macOS 26 on Apple Silicon.

v0.5.3: export quality-tier retune

Choose a tag to compare

@froggeric froggeric released this 11 Aug 08:32

v0.5.3 retunes the export quality tiers and makes the temporal-smoothing window uniform, based on an empirical grain and performance sweep. Low, Medium, and High exports are now substantially cleaner for modest extra render time.

Changed

  • Quality tiers raised: Draft, Standard, and High now use samples-per-pixel 8, 30, and 100 (was 2, 8, 30, which were inherited from the realtime preview and under-sampled for export). Effective samples after smoothing: Draft about 88, Standard about 330 (about genome-default cleanliness), High about 1100 (cleaner than genome-default).
  • Uniform smoothing window: the centered-box-window half-width is now h=5 (an 11-frame window) for all tiers, replacing the tier-dependent ramp that turned smoothing off at samples-per-pixel 64 or higher. Temporal smoothing is free supersampling: one render per frame regardless of h, so a uniform h=5 gives the maximum grain reduction that stays within moderate motion blur.
  • The export sheet label now shows the effective samples-per-pixel after smoothing.

Notes

  • Genome-default quality is unchanged (smoothing off; byte-identical to animate). The animate/export byte-identity and the Metal/CPU parity are preserved.
  • Standard (spp 30 with smoothing) reaches about genome-default cleanliness at roughly 33x the speed of a genome-default export.

Install
Download and unzip. The binary is unsigned, so clear quarantine before running:
xattr -dr com.apple.quarantine emberweft emberweft_FlameRenderer.bundle
Run the GUI from the folder that holds the resource bundles:
./emberweft-gui
Or the CLI:
./emberweft --help
Requires macOS 26 on Apple Silicon.

v0.5.2: temporal smoothing (centered box window)

Choose a tag to compare

@froggeric froggeric released this 10 Aug 18:49

v0.5.2 adds temporal smoothing for low-spp exports and fixes an early-pause resume bug.

Temporal smoothing (export)
Low, Medium, and High quality exports no longer flicker ("tiny dots moving around"). A centered box window averages per-frame histograms before the display pipeline, so smoothing applies from the first frame with no startup ramp and no temporal lag. It is centered (non-causal) because the export is offline; box weights give the minimum-variance estimate for the per-frame Monte-Carlo noise. The half-width scales with the quality tier (Low 10, Medium 5, High 3 frames).

Smoothing is OFF at genome-default quality and on the single-frame PNG mastering path, so those outputs are byte-identical to before. The feature is export-only; the realtime preview is unchanged.

Metal reuses the existing fused chaos pass and reads the atomic histogram buffer back to the host. No new shader. Existing render paths are byte-unchanged.

Fix
Pausing before the first checkpoint interval completed left no checkpoint on disk, so resume failed with "checkpoint unreadable". An initial checkpoint is now written at the start of the run, so an early pause is always resumable.

Known limitations
Smoothing-on peak memory is 2h+1 Double histograms (about 1.7 GB at 1080p for h=10, about 7 GB at 4K); a RAM guard is pending. A transition between two genomes with different spatial-filter radii throws a graceful error; uniform-filter genomes are unaffected.

Install
Download and unzip. The binary is unsigned, so clear quarantine before running:
xattr -dr com.apple.quarantine emberweft emberweft_FlameRenderer.bundle
Run the GUI from the folder that holds the resource bundles:
./emberweft-gui
Or the CLI:
./emberweft --help
Requires macOS 26 on Apple Silicon.

v0.5.1: M6.1 export pause/resume

Choose a tag to compare

@froggeric froggeric released this 09 Aug 16:12

M6.1 export pause/resume. Long GUI exports (a multi-day genome-default sequence) are now pausable and resumable without losing rendered work, plus crash recovery. Engine parity is unchanged: no renderer math changed, and the resume pixel-identity pins hold.

Pause/resume and crash recovery

  • ExportCoordinator.runResumable chunks the timeline at frame-count edges (default 30), encodes each chunk, and writes a checkpoint after each. Pause keeps completed work. Resume rebuilds the identical plan and re-parses SHA-256-verified source bytes, so resumed frames are byte-identical (determinism, rule #2).
  • A checkpoint left by a quit or crash is resumable at the next launch.
  • Recoverable failures (disk full) surface as a paused state with a Resume offer, not a terminal failure.

renderFramesInterleaved

  • A new per-frame render loop for the resumable path, byte-identical to the existing renderFrames. It decides repeat-count per frame, so frame-count chunks can span a loop to transition boundary. The existing renderFrames is unchanged.

GUI

  • The progress banner gains a Pause button and a paused card with Resume and Discard.

CLI

  • --checkpoint-frames N: checkpoint every N frames.
  • --resume : resume a checkpointed run. The checkpoint recipe is authoritative; conflicting flags error.
  • --discard : remove a checkpoint and its chunks.
  • Ctrl-C keeps the checkpoint so --resume works as crash recovery.

Install

Download emberweft-v0.5.1-macos-arm64.zip and unzip it. From the unzipped folder, clear quarantine (the build is unsigned):
xattr -dr com.apple.quarantine .
Run the GUI from that folder:
./emberweft-gui
Apple Silicon, macOS 26. The CPU renderer works without the Metal bundle; the GUI and Metal exports need the sibling bundles (included in the zip).

Deferred

  • Temporal smoothing (across-frame histogram EMA for low-spp quality) is the next slice, M6.1 slice 2.

v0.5.0: M6 GUI export (the video-export studio)

Choose a tag to compare

@froggeric froggeric released this 08 Aug 20:24

The export feature is complete: a full GUI export studio, mastering-quality encoding, and a calmer animation pacing. The emberweft export CLI gains the same settings. Engine parity is unchanged (no renderer math changed; the export↔animate byte-identity pins hold).

GUI export studio

  • Export sheet with three sources: single genome, collection-as-sequence, multi-select batch.
  • Non-blocking progress banner in all windows: Cancel, Show in Finder, and an ETA (EMA-smoothed, "estimating..." during cold-start).
  • NSSavePanel / NSOpenPanel destination; ProcessInfo sleep prevention.

Mastering-quality encoding

  • ProRes 422 HQ is the default (intra-frame, so no smearing on busy fractal content; visually lossless). Container is .mov.
  • H.264 / HEVC tiers raised (~5x bitrate, High / Main10 profile, 1-sec GOP) for the .mp4 alternatives.

Animation pacing

The animation is no longer flam3-parity-bound: the owner decided Emberweft may improve on flam3's motion (renderer, determinism, and Metal↔CPU parity are unchanged).

  • Separate loop and transition durations (loops and edges can differ).
  • Transition rotation velocity-matched easing: the rotation eases so its velocity matches the loops at the boundaries, so short edges stay smooth. The realtime preview matches the export.
  • Defaults: 15s loop, 12s edge, loop render-once-repeat x2 (a 15s loop renders once and outputs twice = 30s perceived, seamless, halving the loop render cost). A RAM guard refuses an oversized loop cache (4K is over; a disk-cache follow-up).

Engine (parity-neutral)

  • Off-main temporal Metal (renderTemporalOffMain): the temporal twin of renderOffMain, byte-identical, so motion-blurred exports never freeze the UI.
  • Shared ExportSettings.resolve (CLI and GUI build byte-identical jobs).

Fixed

  • Sequence export no longer truncates the timeline (segmentCount is now 2N-1 to cover every genome's loop plus the transitions).
  • Batch output now carries the .mp4 extension.
  • Silent isRenderable skips are surfaced in the banner.

Deferred to M6.1

  • Export pause/resume (frame-count checkpointing + chunked-encode + concat) and temporal smoothing (across-frame histogram EMA for low-spp quality).