$ framewatch gallery
See it work
The interactive piece from the front page, with room to try it, followed by framewatch’s logo, colors and type.
Five seconds of tests, three frames worth keeping.
If you record a screen continuously, a coding agent drowns in near-identical frames. If you take a screenshot on demand, you miss everything that happened in between. framewatch watches one window and saves a frame only when something meaningful happens.
$ cargo test Compiling framewatch v0.8.5 running 10 tests test engine_static::static_window_emits_only_initial ... ok test engine_static::single_change_then_static_settles_once ... ok test engine_spinner::spinner_collapses_to_busy_then_settled ... ok test engine_value::volatile_region_is_throttled_not_per_frame ... ok test engine_auto_spinner::auto_spinner_collapses_to_busy_then_settled ... ok test engine_auto_spinner::scattered_churn_is_not_an_auto_spinner ... ok test engine_sustained_motion::sustained_change_produces_periodic_keyframes ... ok test dedup::identical_busy_end_frame_is_deduped ... ok test crop::crop_clamps_and_handles_out_of_bounds ... ok test crop::watch_with_crop_produces_cropped_images ... ok test result: ok. 10 passed; 0 failed
.framewatch/2026-06-14T06-22-17_Terminal/timeline.jsonl
- {"seq":0,"kind":"initial","elapsed_ms":0,"image":"frames/000000_initial.png","note":"Session start."}
- {"seq":1,"kind":"busy_start","elapsed_ms":1200,"image":null,"note":"Test runner started (spinner active)."}
- {"seq":2,"kind":"busy_end","elapsed_ms":4830,"image":"frames/000002_busy_end.png","coalesced_frames":71,"note":"Spinner stopped after 3.63s; 71 animation frames collapsed."}
- {"seq":3,"kind":"settled","elapsed_ms":5180,"image":"frames/000003_settled.png","note":"Settled: test results rendered."}
-
initial 0.00s
$ cargo test -
busy_end 4.83s
$ cargo test Compiling framewatch v0.8.5 running 10 tests test engine_static::static_window_emits_only_initial ... ok test engine_static::single_change_then_static_settles_once ... ok test engine_spinner::spinner_collapses_to_busy_then_settled ... ok test engine_value::volatile_region_is_throttled_not_per_frame ... ok test engine_auto_spinner::auto_spinner_collapses_to_busy_then_settled ... ok test engine_auto_spinner::scattered_churn_is_not_an_auto_spinner ... ok test engine_sustained_motion::sustained_change_produces_periodic_keyframes ... ok test dedup::identical_busy_end_frame_is_deduped ... ok test crop::crop_clamps_and_handles_out_of_bounds ... ok test crop::watch_with_crop_produces_cropped_images ... ok
-
settled 5.18s
$ cargo test Compiling framewatch v0.8.5 running 10 tests test engine_static::static_window_emits_only_initial ... ok test engine_static::single_change_then_static_settles_once ... ok test engine_spinner::spinner_collapses_to_busy_then_settled ... ok test engine_value::volatile_region_is_throttled_not_per_frame ... ok test engine_auto_spinner::auto_spinner_collapses_to_busy_then_settled ... ok test engine_auto_spinner::scattered_churn_is_not_an_auto_spinner ... ok test engine_sustained_motion::sustained_change_produces_periodic_keyframes ... ok test dedup::identical_busy_end_frame_is_deduped ... ok test crop::crop_clamps_and_handles_out_of_bounds ... ok test crop::watch_with_crop_produces_cropped_images ... ok test result: ok. 10 passed; 0 failed
- A recorder at 14 fps would keep
- 73 frames
- framewatch keeps
- 3 frames, 4 events
Assets
Logo, colors, and type.
Mark
The project’s generated logo mark. The grid gets finer with the commit count, and the cells show the split between languages. It’s redrawn as the project grows.
Palette
The colors framewatch uses across this site: one hue from its discipline’s band, plus the shades that make it work on both dark and light backgrounds.
Type
The two typefaces on the site: a sans-serif for the interface and a serif for headlines.
Next
Install framewatch
It’s on crates.io. Pick the capture backend for your platform. The detection engine is the same on all three.
cargo install framewatch --features wgc
cargo install framewatch --features macos
cargo install framewatch --features linux-x11
cargo add framewatch --no-default-features
Add gui for the window picker, or record for narrated capture. On macOS you’ll be asked for Screen Recording permission the first time it runs. Wayland isn’t supported yet.
Questions, or something it doesn’t do yet? Email dmoore@