Changelog

What's new in GIFmeta

Notable changes to the gifmeta crate, CLI and desktop app β€” straight from the source repositories and releases.

v0.7.0Create GIFs, insert, duplicate & re-order frames

  • Create a GIF from images: `gifmeta create a.png b.png c.jpg -o out.gif` (PNG, JPEG or WebP, same size; `--delay`, `--delays`, `--loop-count`).
  • Insert images as frames: `mod --insert 3=logo.png` (repeatable, `--insert-delay`); insert before N + `--delete N` replaces frame N.
  • Duplicate frames: `mod --duplicate 2,5`. Re-order frames: `mod --order 4,3,2,1,0` (play backwards).
  • All of it works on frame-optimized GIFs β€” frames whose neighbours changed are rebuilt as full images.
  • Fewer transparency glitches: when a frame needs transparent pixels, the frame before it is cleared instead of showing through.
  • Smaller dependency tree: the `image` crate only uses png/jpeg/webp. Signed + notarized macOS binaries, now also for Apple Silicon.

v0.6.2New homepage

  • The crate homepage is now gifmeta.com. No code changes.

v0.6.1Better crates.io description

  • New crate description, keywords (animation, frames) and categories (multimedia::encoding) so gifmeta is easier to find. No code changes.

v0.6.0Delete frames, keyframes & unoptimize

  • Delete frames: `gifmeta mod in.gif --delete 2,5 -o out.gif` β€” dependent frames are automatically re-written as full images, so every remaining frame looks exactly like before.
  • The deleted frame’s delay is merged into the previous frame (total duration unchanged); `--delete-mode drop` makes the animation shorter instead.
  • Convert frames to full images: `--keyframe 3,7`.
  • Unoptimize: `--unoptimize` writes every frame as a full image (bigger file, every frame independent).
  • Re-keyed frames use an exact local palette; with > 256 colours they are colour-reduced (NeuQuant) with a reserved transparent index and a warning.
  • New lib API: `ModOptions { delete_frames, delete_mode, keyframes, unoptimize }`, `DeleteMode`, `modify_gif_with_report()` β†’ `ModReport`.
  • All frame indices (delays, deletes, keyframes) refer to the original frame numbers.

v0.5.1Render all frames in one pass

  • New `FrameRenderer`: renders every frame in one pass (frame n builds on frame n-1) instead of replaying the animation from the start for each frame.
  • forge-preview.gif (40 frames, 800Γ—516): 2.29 s β†’ 0.15 s. stars-transparent.gif (150 frames): 31.4 s β†’ 0.56 s.
  • CLI: `gifmeta preview in.gif --all --output-dir frames/` exports every frame as `frame_000.png`, … (works with `--raw`).

v0.5.0Delta-frame detection, correct previews & clear loop settings

  • Fixed: a GIF without a loop block played once, but was reported as infinite β€” now `info` shows `πŸ”„ Loop : ∞ infinite`, `1Γ— (plays once)` or `3Γ—`.
  • New `--infinite` flag; `--loop-count N` now means "plays N times".
  • `info` now detects frame-optimized GIFs β€” `--show-frames` marks each frame πŸ”‘ keyframe / Ξ” delta.
  • Corrected frame previews for optimized GIFs: new disposal-aware renderer composites earlier frames correctly (verified pixel-identical to ImageMagick `-coalesce`).
  • New `preview --raw`: show only the pixels stored in a frame.
  • New JSON fields: `keyframe_count`, `is_delta_optimized` and per-frame `left`, `top`, `width`, `height`, `disposal`, `uses_transparent_pixels`, `is_keyframe`.

v0.4.1Hotfix keep dimension for transparent images

  • Fixed preview frame rendering for transparent images.
  • Preview images now preserve full canvas dimensions with proper composite layering.

v0.4.0Frame by Frame

  • New ability to extract any frame from a GIF as a PNG β€” with support for `--output`, `--as-base64`, fully in-memory processing and doc-tested accuracy.

v0.3.0Sacred CLI for GIF Metadata

  • Modify GIF loop count and frame delays with a single command; smart delay editing using frame-index maps.
  • CI-integrated test suite with HTML previews, prebuilt binaries for macOS/Windows/Linux and new `--json` flag.

v0.2.0The Loop Awakens

  • `info` command: frame count, size and total duration.
  • `get-loop` / `set-loop`, `set-delay`, `set-frame-delay`, hybrid CLI + library design, clear clap v4 CLI with named flags.

πŸ–₯️ Desktop app releases

Native Tauri desktop app for macOS, Windows and Linux β€” built on the gifmeta crate.

v0.4.0Create GIFs from images, insert, duplicate & re-order frames

  • New from images: pick or drop PNG / JPEG / WebP files, arrange them, set delays and loop, and click Create GIF β€” the new GIF opens right away for further editing.
  • Insert images as new frames (button, `I`, or drop files onto the window), duplicate frames with `D`, re-order by dragging β Ώ or with Alt+↑/↓.
  • Works on frame-optimized GIFs: frames that lose their neighbour are rebuilt automatically.
  • Save opens the Save tab first; βœ• Close to start over; β†Ί Reset also for a new GIF; built-in unsaved-changes dialog.
  • πŸ” macOS apps are signed and notarized by Apple, with a native Apple Silicon build.
  • Built on gifmeta 0.7.0.

v0.3.1A proper name

  • The app is now called GIFmeta – in the Dock, Start menu, window title and installer file names.
  • New app identifier `dk.mp-it.gifmeta`.
  • Upgrading on macOS: the new version installs as `GIFmeta.app` next to the old `gifmeta-gui.app` – you can delete the old one. Your theme setting resets once.
  • Faster builds: Rust build cache in CI/release workflows, each platform only builds the installer that gets uploaded.
  • Built on gifmeta 0.6.0 (no functional changes since v0.3.0).

v0.3.0Delete frames

  • Delete frames (button or keyboard) – frames that depended on a deleted frame are rebuilt automatically, so the rest of the animation stays pixel-identical.
  • Convert selected frames to full images.
  • Unoptimize: turn every frame into a full image.
  • Choose what happens to a deleted frame’s delay: add it to the previous frame (keeps total duration) or drop it.
  • Playback skips deleted frames, so you see the result before saving.
  • Save report: shows rebuilt frames and warns if a frame had to be colour-reduced.
  • All frames load in one streamed pass instead of one call per frame.
  • Built on gifmeta 0.6.0; Tauri 2.12.

v0.2.1Instant playback

  • Instant playback: all frames are rendered in one pass and streamed to the app as they’re ready (40-frame GIF ~15x faster, 150-frame GIF ~56x faster to load).
  • Desktop feel: no more accidental text selection in the UI (cmd/ctrl + A / double-click) – inputs and JSON stay copyable.
  • Release pipeline fixed: aligned Tauri versions (2.12) and pinned CLI -> reliable builds for all three platforms.

v0.2.0Play, Pretty/Raw & a brand new crab

  • Now powered by gifmeta 0.5.0, which understands frame-optimized GIFs and renders every frame exactly as it plays.
  • Play your GIF with the edited delays – before you save.
  • Keyframe vs. delta frames view.
  • Pretty / raw view – the frame as it plays, or only the pixels it stores.
  • Correct previews for optimized GIFs (no more "ghost" frames).
  • Loop forever toggle or a fixed number of plays – and "plays once" GIFs stay that way.
  • Native save dialog, unsaved-changes indicator and reset.
  • Drag & drop a GIF onto the window.
  • Keyboard: up/down change frame, space play/pause.
  • Faster frame loading, bigger window, theme is remembered.
  • New crab logo & app icons.

v0.1.0First Release

  • Lightweight desktop app to inspect, edit, and purify GIFs – powered by Tauri, Rust and React.
  • Open GIF files via native dialog; edit frame delays, loop counts, metadata.
  • Dark mode support, idle mascot animation, offline with no tracking.