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.23.2
8 files changed
+33−14
Cargo.lock+1−1@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adom-shotlog"-version = "0.23.0"+version = "0.23.2" dependencies = [ "axum", "base64",
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-shotlog"-version = "0.23.0"+version = "0.23.2" edition = "2021" description = "Screenshot log viewer and CLI for Adom" license = "MIT"
VERSION+1−1@@ -1 +1 @@-0.23.0+0.23.2
bin/adom-shotlog⋯ 1 unchanged line ⋯
hooks/shotlog-on-read.sh+4−2@@ -81,8 +81,10 @@ fi ORIG_ARGS="--native" case "$f" in *.safe.png)- full="${f%.safe.png}.full.png"- [ -f "$full" ] && ORIG_ARGS="--orig-file $full"+ # full sibling naming differs by bucket: screen saves <stem>.full.png, window saves <stem>.png+ for full in "${f%.safe.png}.full.png" "${f%.safe.png}.png"; do+ [ -f "$full" ] && { ORIG_ARGS="--orig-file $full"; break; }+ done ;; esac
package.json+4−3@@ -1,6 +1,6 @@ { "slug": "adom-shotlog",- "version": "0.23.0",+ "version": "0.23.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 and on which surface, and ingests Adom Desktop child-window arrays via --meta.",@@ -56,7 +56,6 @@ ], "discovery_pitch": "Your AI screenshots its work into channels and you review it live anywhere, even your phone. Every shot records its original capture resolution, and Adom Desktop child-window arrays come through with their coordMap.", "visibility": "public",- "bundled": true, "tags": [ "cli", "screenshot",@@ -67,5 +66,7 @@ ], "hero": { "path": "screenshots/hero.png"- }+ },+ "org": "adom",+ "platform": "any" }
page.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-shotlog",- "version": "0.23.0",+ "version": "0.23.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 and on which surface, and ingests Adom Desktop child-window arrays via --meta.",
src/html/index.html+21−5@@ -701,10 +701,24 @@ header { function card(e) { const c=document.createElement('div'); c.className='shot-card'; c.dataset.id=e.id;- const desc=document.createElement('div');- if (e.description) { desc.className='shot-card-desc'; desc.textContent=e.description; }- else { desc.className='shot-card-desc no-desc'; desc.textContent='⚠ No description — inject with -d "what and why"'; }- c.appendChild(desc);+ // For auto-captures the WHY is the headline: show the prompt the thread+ // was serving, and demote the generic "auto-captured: file.png" to a+ // small mono sub-line. Deliberate injects keep their description first.+ const isAuto=(e.source||'').startsWith('read-hook');+ if (isAuto && e.context) {+ const why=document.createElement('div'); why.className='shot-card-why';+ why.innerHTML='<span class="q">"</span>'+esc(e.context)+'<span class="q">"</span>';+ why.setAttribute('data-tooltip','The prompt this AI thread was working on when it read the image - the REASON this capture exists.');+ c.appendChild(why);+ const sub=document.createElement('div'); sub.className='shot-card-sub';+ sub.textContent='auto-captured: '+(e.filename||'').replace(/^auto-captured-screenshot-claude-read-for-analysis-/,'');+ c.appendChild(sub);+ } else {+ const desc=document.createElement('div');+ if (e.description) { desc.className='shot-card-desc'; desc.textContent=e.description; }+ else { desc.className='shot-card-desc no-desc'; desc.textContent='⚠ No description — inject with -d "what and why"'; }+ c.appendChild(desc);+ } const meta=document.createElement('div'); meta.className='shot-card-meta'; const ts=document.createElement('span'); ts.className='ts'; ts.textContent=fmtDate(e.timestamp); ts.setAttribute('data-tooltip', new Date(e.timestamp).toLocaleString()); meta.appendChild(ts);@@ -762,7 +776,9 @@ header { function openModal(e) { mImg.src=imgUrl(e); mImg.alt=e.description||e.filename;- mDesc.textContent=e.description||''; mDesc.style.display=e.description?'':'none';+ const isAutoM=(e.source||'').startsWith('read-hook');+ mDesc.textContent=(isAutoM&&e.context)?('"'+e.context+'"'):(e.description||'');+ mDesc.style.display=(mDesc.textContent)?'':'none'; let why=document.getElementById('mWhy'); if(!why){ why=document.createElement('div'); why.id='mWhy'; why.className='m-why'; mDesc.after(why); } if(e.context){ why.innerHTML='<span class="k">while working on</span>'+esc('"'+e.context+'"'); why.style.display=''; }