app
Shotlog - Screenshot Log
Public Made by Adomby adom
See the shots your AI never showed you, and know it actually SAW them. adom-shotlog streams every screenshot the AI gathers into a live gallery (webview/pup/browser/phone), reports whether a human is really watching and on which surface, and ingests Adom Bridge child-window arrays via --meta.
← Commit history
Publish 0.6.2
7 files changed
+37−9
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-shotlog"-version = "0.6.1"+version = "0.6.2" edition = "2021" description = "Screenshot log viewer and CLI for Adom" license = "MIT"
SKILL.md+21@@ -12,6 +12,27 @@ description, source, and **both** the stored and original resolution. Binary: `/usr/local/bin/adom-shotlog` (the `shotlog` command is a back-compat alias). +## ⚠ WHY THIS EXISTS: you can't show the human images in a text thread++When you run as **Claude Code (VSCode / any text-only thread)** you **CANNOT+display an image to the human.** Calling `Read` on a PNG, or taking a+`desktop_screenshot` / pup screenshot, loads the image into **your** context —+the human sees **nothing** in the thread. (Maybe someday Claude Code renders+images inline; until then, assume it can't.)++So, as an ironclad rule:++- **NEVER** write "see the screenshot above", "look at this image", "as shown+ below", or any phrase that assumes the human can see a picture in the thread.+ To them it's a blank reference — this exact failure is the whole reason shotlog+ exists.+- The **only** way the human sees an image is on a surface they actually have+ open: the **shotlog viewer** (webview / pup / phone), or a **URL you hand them**.+ So `inject` it into a channel they're viewing, **verify** they're watching+ (`shotlog viewers -c <ch>` — see below), and refer them to *that surface*+ ("in the shotlog viewer" / "the pup window on your screen" / a link), never to+ an inline image.+ ## Inject — one command ```bash
VERSION+1−1@@ -1 +1 @@-0.6.1+0.6.2
bin/adom-shotlog⋯ 1 unchanged line ⋯
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-shotlog",- "version": "0.6.1",+ "version": "0.6.2", "type": "app", "title": "Adom Shotlog", "description": "See the shots your AI never showed you \u2014 and know it actually SAW them. adom-shotlog streams every screenshot the AI gathers into a live gallery (webview/pup/browser/phone), reports whether a human is really watching + on which surface, and ingests Adom Desktop owned-popup arrays via --meta.",
page.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-shotlog",- "version": "0.6.1",+ "version": "0.6.2", "type": "app", "title": "Adom Shotlog", "description": "See the shots your AI never showed you — and know it actually SAW them. adom-shotlog streams every screenshot the AI gathers into a live gallery (webview/pup/browser/phone), reports whether a human is really watching + on which surface, and ingests Adom Desktop owned-popup arrays via --meta.",
src/main.rs+12−5@@ -452,20 +452,27 @@ fn run_inject( let surfaces = getvec("surfaces"); let visible = val.get("visible_viewers").and_then(|v| v.as_u64()).unwrap_or(0); let vis_surf = getvec("visible_surfaces");- // The hint the human asked to ride on EVERY inject.+ // Two reminders ride on EVERY inject: let verify = "Are you sure the human is seeing the shotlog? Is it open in a webview or pup? Have you verified it's truly showing?";+ // The core reason shotlog exists — image-blindness in text threads.+ let cant_show = "You're in Claude Code / a text thread: you CANNOT display images to the human. Reading or capturing a screenshot loads it into YOUR context, not their view — so NEVER write \"see the screenshot above\" / \"look at this image\". This viewer is the ONLY way they see it: point them to the viewer or a URL.";+ // Status line (state-specific), then the two universal reminders,+ // then any state-specific follow-up. if visible > 0 { let s = if vis_surf.is_empty() { String::new() } else { format!(" [{}]", surface_label(&vis_surf)) }; ok(&format!("{visible} of {viewers} viewer(s) ON-SCREEN{s} — a human can see this shot."));- hint(verify); } else if viewers > 0 { let s = if surfaces.is_empty() { String::new() } else { format!(" [{}]", surface_label(&surfaces)) }; warn(&format!("{viewers} viewer(s) connected to '{channel}'{s} but ALL are BACKGROUNDED / minimized — the human is NOT looking right now."));- hint(verify);- hint(&format!("Bring the viewer to the FOREGROUND (the pup window / webview tab / phone), then re-check: `shotlog viewers -c {channel}`.")); } else { warn(&format!("NO live viewer is connected to '{channel}' — the human is NOT seeing this shot."));- hint(verify);+ }+ hint(cant_show);+ hint(verify);+ if visible == 0 && viewers > 0 {+ hint(&format!("Bring the viewer to the FOREGROUND (the pup window / webview tab / phone), then re-check: `shotlog viewers -c {channel}`."));+ }+ if viewers == 0 { hint(&format!("Open it, then RE-CHECK before continuing: `shotlog open -c {channel}` (Hydrogen webview) — or load the viewer in pup / on the phone — then `shotlog viewers -c {channel}`.")); hint("A viewer was force-opened as a fallback, but do NOT assume the human sees it — verify their actual surface."); }