gifmeta is a small, focused tool for inspecting and modifying GIF metadata.
It’s designed for developers, artists, and anyone needing loop control and timing tweaks — fast and reliably.
❤️ Built with Rust. Sacredly simple. Zero bloat.
Because changing loop count or frame delays in GIFs was a pain.
Most tools were too heavy, too raw, or lacked reliable preview/testing.
gifmeta
was born to fix that — with precise CLI commands, minimalism, and full test coverage.
- 🔁 Set infinite or fixed loop count (
--loop-count
) - ⏱️ Apply fixed delay to all frames (
--delay
) - 🎯 Set specific frame delays (
--delays 1=30,4=60
) - 📤 Output JSON metadata (
--json
) - 🖼️ Extract any frame as PNG (to file or base64)
- 🧪 CLI + doc tests for core functions
- 🖼️ Side-by-side visual preview reports via
run-visual-preview.sh
You can — and should, if you need full encoding pipelines.
But gifmeta
wraps just the things most of us need quickly:
- 🔁 Loop control (infinite or fixed)
- ⏱ Frame delay override (global + selective)
- ✅ Verified, minimal changes
- 🔍 Human-friendly reports
- ⚙️ Ideal for future GUI integration or scripting
- ❌ Not a full GIF encoder
- ❌ Not for image content editing
- ❌ Not a general-purpose wrapper
gifmeta
lives in a small, useful space — metadata tuning and clarity. Nothing more.
GIFs are still everywhere — especially in messaging, memes, and UI loaders. But modifying timing or loop behavior often requires heavy tools.
gifmeta
lets you do it instantly, with:
- 🦀 Native Rust speed
- 🧼 Zero bloat
- 🖥️ CLI-first ergonomics
Install via crates.io!:
cargo install gifmeta
Or use directly with:
cargo run -- <command>
Install via GitHub
git clone https://github.com/madspaaskesen/gifmeta.git
cd gifmeta
cargo build --release
./target/release/gifmeta --help
Absolutely. Here’s a clean and helpful section you can add to your README.md
under the Installation section:
Download the binary for your platform from the latest release.
If you see a warning when trying to run gifmeta
, macOS may have quarantined the file because it's unsigned.
To allow execution:
xattr -d com.apple.quarantine gifmeta
chmod +x gifmeta
Then run it with:
./gifmeta info yourfile.gif
You only need to do this once per download. After this,
gifmeta
will run normally.
Let me know if you want the same clarity for Windows (e.g., SmartScreen warnings) or Linux permissions 💛
--json
: Get output in json format
You can combine any of the following:
--loop-count <n>
: Set loop behavior (0 = infinite, 1 = once, 2 = twice…)--delay <n>
: Set same delay for all frames. Unit is centiseconds (1 = 10ms).--delays <csv>
: Override specific frames. Format:1=15,3=50
(in centiseconds).
gifmeta info --input tests/testdata/loop/10frame-rainbow.gif
gifmeta info --input tests/testdata/loop/10frame-rainbow.gif --json
gifmeta mod --input tests/testdata/loop/loop-once.gif --loop-count 10 --output tests/testdata/loop/loop-once-modified.gif
gifmeta mod --input tests/testdata/timing/zero-delay.gif --delay 10 --output tests/testdata/timing/zero-delay-modified.gif
gifmeta mod --input tests/testdata/timing/zero-delay.gif --delays "0=1,1=20" --output tests/testdata/timing/zero-delay-modified2.gif
gifmeta mod --input tests/testdata/timing/zero-delay.gif --delay 15 --delays "0=2,1=20" --output tests/testdata/timing/zero-delay-modified3.gif
gifmeta mod --input tests/testdata/timing/zero-delay.gif --loop-count 0 --delay 15 --delays "0=2,1=20" --output tests/testdata/timing/zero-delay-modified4.gif
You can now extract a specific frame from any GIF and output it as a PNG image — either as a file or directly as base64 for web previews:
gifmeta preview --input path/to/input.gif --frame 0 --output frame0.png
gifmeta preview --input path/to/input.gif --frame 3 --as-base64
If
--frame
is omitted, it defaults to the first frame (0
). You must specify either--as-base64
or--output
.
Command | Description |
---|---|
info |
Display GIF metadata (dimensions, loop, delays) |
mod |
Apply metadata modifications (loop/delays/output) |
preview |
Extract a single frame as PNG (file or base64) |
You can run:
./run-visual-preview.sh
It will:
- Apply a set of metadata modifications
- Generate side-by-side comparisons
- Output a beautiful
tests/visual/report.html
This is useful for testing transparency, timing, or human-visible playback changes.
- Set loop count (v0.2.0)
- CLI structure with
clap v4
- Set per-frame delays (v0.3.0)
- Frame editing with duration visuals (experimental)
- GUI Companion (Tauri, optional)
These are best handled externally with scripting or shell tooling.
Wanna help? Fork, clone, and PRs welcome. You can also suggest Codex tasks or open issues 💛
- gif
- Rust 2021
- Love, frustration, and sacred formatting
MIT — do good things with it.
Built by Mads Paaskesen with Rust and a soft spot for retro formats.