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.24.4
8 files changed
+40−7
Cargo.lock+1−1@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adom-shotlog"-version = "0.24.3"+version = "0.24.4" dependencies = [ "axum", "base64",
Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-shotlog"-version = "0.24.3"+version = "0.24.4" edition = "2021" description = "Screenshot log viewer and CLI for Adom" license = "MIT"
VERSION+1−1@@ -1 +1 @@-0.24.3+0.24.4
bin/adom-shotlog⋯ 1 unchanged line ⋯
dev-skills/adom-shotlog-dev/SKILL.md+10@@ -346,3 +346,13 @@ BROKER (long-lived) calls home to the wiki, not the short-lived CLI: - Every inject reply carries a gated self-update Hint -> `adom-wiki pkg update adom/adom-shotlog` then restart serve. So the AI's most common command nudges the update without any per-call network latency (broker already knows latest).++## Direct-to-fullscreen from the feed (2026-08-04)+Each feed thumbnail has a hover-revealed ⛶ button (.card-fill-btn) that calls+fillWindow(imgUrl(e), ...) directly - straight to the fullscreen lightbox,+SKIPPING the modal. The image's own click still opens the modal (the 2-step+path is unchanged; this is purely additive, per John's ask). fillWindow already+resets the backFromFill toggle, and exiting with the modal closed just returns+to the list (openModal resets state on the next open, so no stale flag).+NOTE (bridge drift): the pup verb is now `browser_eval` (not browser_evaluate)+and the eval result is TOP-LEVEL `d.result` (not d.output.result).
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-shotlog",- "version": "0.24.3",+ "version": "0.24.4", "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.",
page.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-shotlog",- "version": "0.24.3",+ "version": "0.24.4", "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+25−2@@ -215,6 +215,20 @@ header { .shot-card-img { display: block; width: 100%; height: 220px; flex-shrink: 0; background: #111; object-fit: contain; object-position: center top; transition: opacity .15s; } .shot-card:active .shot-card-img { opacity: .85; }+/* Direct-to-fullscreen shortcut: a ⛶ button on the thumbnail (hover-revealed)+ that skips the modal and fills the window in ONE click. The image itself+ still opens the modal on click — this is purely additional. */+.card-img-wrap { position: relative; }+.card-fill-btn { position: absolute; top: 10px; right: 10px; width: 32px; height: 32px;+ display: inline-flex; align-items: center; justify-content: center;+ background: rgba(13,17,23,.72); color: var(--text); border: 1px solid rgba(255,255,255,.18);+ border-radius: 8px; cursor: zoom-in; backdrop-filter: blur(3px);+ opacity: 0; transition: opacity .15s, background .15s, border-color .15s; }+.shot-card:hover .card-fill-btn, .card-fill-btn:focus-visible { opacity: 1; }+.card-fill-btn:hover { background: rgba(0,184,176,.22); border-color: rgba(0,184,176,.6); color: var(--accent-bright); }+.card-fill-btn svg { width: 16px; height: 16px; }+/* No hover on touch devices — keep it visible there. */+@media (hover: none) { .card-fill-btn { opacity: .9; } } /* Child-window-array badge + nerd info chip on a card */ .shot-card-meta .badge-pop { background: rgba(0,184,176,.16); color: var(--accent); border: 1px solid rgba(0,184,176,.4); border-radius: 999px; padding: 0 7px; font-weight: 600; cursor: help; }@@ -867,9 +881,18 @@ header { chip.setAttribute('data-tooltip','Tap to reveal EVERYTHING shotlog knows about this shot: the full entry record (thread, context, source, sizes), all capture metadata (coordMap, DPI, screen rect, child windows), and the raw JSON.'); meta.appendChild(chip); } c.appendChild(meta);+ const imgWrap=document.createElement('div'); imgWrap.className='card-img-wrap'; const img=document.createElement('img'); img.className='shot-card-img'; img.src=imgUrl(e); img.alt=e.description||e.filename;- img.addEventListener('click', ()=>openModal(e)); // image still zooms if you want it- c.appendChild(img);+ img.addEventListener('click', ()=>openModal(e)); // 1st click still opens the modal (unchanged)+ imgWrap.appendChild(img);+ // Additional path: jump STRAIGHT to fullscreen, no modal first. The click+ // is the user gesture the Fullscreen API needs.+ const fillBtn=document.createElement('button'); fillBtn.className='card-fill-btn'; fillBtn.setAttribute('aria-label','Fullscreen this shot');+ fillBtn.setAttribute('data-tooltip','Zoom STRAIGHT to fullscreen (skip the popup).\nIn Hydrogen Desktop it fills 90% of the window; in pup/browser it goes fullscreen. Esc / click / × to exit.');+ fillBtn.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/></svg>';+ fillBtn.addEventListener('click', ev=>{ ev.stopPropagation(); fillWindow(imgUrl(e), e.description||e.filename); });+ imgWrap.appendChild(fillBtn);+ c.appendChild(imgWrap); // All child windows in ONE row, inline — no need to open the shot. if (pops.length){ const row=document.createElement('div'); row.className='card-popups';