<feed xmlns='http://www.w3.org/2005/Atom'>
<title>albumen.git/views/album.erb, branch v1.1</title>
<subtitle>Ruby/Sinatra photo album</subtitle>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/'/>
<entry>
<title>Fill viewport with media in lightbox and slideshow</title>
<updated>2026-05-14T23:11:20+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-14T23:11:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=de80b9871ebe1497c672f3c7c7bb5467dabcb83a'/>
<id>de80b9871ebe1497c672f3c7c7bb5467dabcb83a</id>
<content type='text'>
Lightbox: .lb-media now fills the full stage (flex, 100%x100%) and
#lb-img/#lb-video use width/height:100% + object-fit:contain so at
least one axis always reaches the edge. Click-to-close updated to
check event.target===stage instead of stopPropagation.

Slideshow: #ss-img/#ss-video likewise changed from max-width/max-height
to width/height:100% so small or portrait media fills the stage.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Lightbox: .lb-media now fills the full stage (flex, 100%x100%) and
#lb-img/#lb-video use width/height:100% + object-fit:contain so at
least one axis always reaches the edge. Click-to-close updated to
check event.target===stage instead of stopPropagation.

Slideshow: #ss-img/#ss-video likewise changed from max-width/max-height
to width/height:100% so small or portrait media fills the stage.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Hide transcoded originals from non-admins; mark them visually for admins</title>
<updated>2026-05-14T22:59:59+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-14T22:59:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=c76ea393777897e0c367e186d1a3b243193d8377'/>
<id>c76ea393777897e0c367e186d1a3b243193d8377</id>
<content type='text'>
update.rb records transcoded_to in album.json (even on re-runs where
the MP4 already exists) so the marker survives across scans.

app.rb filters files with transcoded_to from non-admin views.
album.erb renders them greyed-out with an amber "⚠ original" badge in
admin mode. admin/album.erb marks the edit-table row and shows the
target filename under the original.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
update.rb records transcoded_to in album.json (even on re-runs where
the MP4 already exists) so the marker survives across scans.

app.rb filters files with transcoded_to from non-admin views.
album.erb renders them greyed-out with an amber "⚠ original" badge in
admin mode. admin/album.erb marks the edit-table row and shows the
target filename under the original.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Show slideshow button for folders with media anywhere in hierarchy</title>
<updated>2026-05-12T17:26:06+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T17:26:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=d58a77164dc37c445bc275d0bee5dbc7f06d7e7d'/>
<id>d58a77164dc37c445bc275d0bee5dbc7f06d7e7d</id>
<content type='text'>
- slideshow_view now uses all_media_entries for non-root dirs so the
  slideshow traverses sub-albums instead of only direct files
- album.erb condition simplified: show launcher when albums OR media
  entries exist (previously hidden for folders with only sub-albums)

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- slideshow_view now uses all_media_entries for non-root dirs so the
  slideshow traverses sub-albums instead of only direct files
- album.erb condition simplified: show launcher when albums OR media
  entries exist (previously hidden for folders with only sub-albums)

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add photo counts, EXIF details, video duration badges, slideshow launcher UI</title>
<updated>2026-05-12T14:45:00+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T14:45:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=b47fdda4fe1bf6fe90d0ba30eedac435dde7c034'/>
<id>b47fdda4fe1bf6fe90d0ba30eedac435dde7c034</id>
<content type='text'>
- Album cards show recursive photo count (bubbles up through sub-albums).
- Lightbox info panel shows camera, aperture, shutter speed, and ISO;
  update.rb now extracts and stores these EXIF fields.
- Video thumbnail cards show a duration badge (e.g. "1:23").
- Slideshow launcher redesigned: button on its own line, with Shuffle /
  Full screen / Interval options on a second line, all inside a rounded
  border to make the grouping clear.
- Fixed album-actions alignment so Interval sits level with the checkboxes.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Album cards show recursive photo count (bubbles up through sub-albums).
- Lightbox info panel shows camera, aperture, shutter speed, and ISO;
  update.rb now extracts and stores these EXIF fields.
- Video thumbnail cards show a duration badge (e.g. "1:23").
- Slideshow launcher redesigned: button on its own line, with Shuffle /
  Full screen / Interval options on a second line, all inside a rounded
  border to make the grouping clear.
- Fixed album-actions alignment so Interval sits level with the checkboxes.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Move slideshow interval control to album page; fix mobile viewport clipping</title>
<updated>2026-05-12T12:33:17+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T12:33:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=ca717d9625cdd60272226db50f0f148c949565c7'/>
<id>ca717d9625cdd60272226db50f0f148c949565c7</id>
<content type='text'>
- Interval input (default 5 s) now lives beside Shuffle/Full screen on
  the album page; passed as ?interval= param to the slideshow and seeded
  into the hidden ss-interval input on load.
- Added "Interval" label text next to the input.
- Fixed slideshow controls being pushed off-screen on mobile by using
  100dvh (dynamic viewport height) with 100vh as a fallback, so the
  layout accounts for mobile browser chrome.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Interval input (default 5 s) now lives beside Shuffle/Full screen on
  the album page; passed as ?interval= param to the slideshow and seeded
  into the hidden ss-interval input on load.
- Added "Interval" label text next to the input.
- Fixed slideshow controls being pushed off-screen on mobile by using
  100dvh (dynamic viewport height) with 100vh as a fallback, so the
  layout accounts for mobile browser chrome.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix OG image previews: use ?photo= param so server can set correct og:image</title>
<updated>2026-05-11T18:35:57+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-11T18:35:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=723a9bc34c30ddb0decedd9efe64af5b91b71541'/>
<id>723a9bc34c30ddb0decedd9efe64af5b91b71541</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Always show filename in lightbox info panel</title>
<updated>2026-05-11T11:28:39+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-11T11:28:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=15fda4f8d6baa53eedf45d736383607eece02a63'/>
<id>15fda4f8d6baa53eedf45d736383607eece02a63</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Limit slideshow to filtered albums when search filter is active</title>
<updated>2026-05-11T05:43:28+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-11T05:43:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=35a72d21075c9d2331ee4388fe34fe6efd5b65fc'/>
<id>35a72d21075c9d2331ee4388fe34fe6efd5b65fc</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add slideshow: root-level, shuffle, fullscreen, click-to-album</title>
<updated>2026-05-10T14:38:04+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-10T14:38:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=a7c16b99a4284826ac5ac0ace4ee0f760a548ff4'/>
<id>a7c16b99a4284826ac5ac0ace4ee0f760a548ff4</id>
<content type='text'>
- Root slideshow: all_media_entries walks the full media tree so
  /slideshow/ shows every photo across all albums; Slideshow button
  always appears on the root album page
- Shuffle and Full screen checkboxes sit next to the Slideshow button
  on the album page; options pass as ?shuffle=1&amp;fullscreen=1 URL params
- Fullscreen uses a tap-to-activate overlay (browsers block auto-entry
  on page load); webkit-prefixed for Safari; ⛶ button and F key for
  mid-session toggle
- Fullscreen mode hides controls, counter, caption bar, and site header
- Exiting fullscreen auto-pauses so the current photo stays visible
- Click/tap anywhere in the stage navigates to the photo's album
  lightbox; reads the live src attribute instead of ssIdx to avoid a
  race where ssIdx advances during the cross-fade while the old photo
  is still on screen
- layout.erb excluded from slideshow (layout: false) so the site header
  never appears there
- CSS cache-busted with ?v=2

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Root slideshow: all_media_entries walks the full media tree so
  /slideshow/ shows every photo across all albums; Slideshow button
  always appears on the root album page
- Shuffle and Full screen checkboxes sit next to the Slideshow button
  on the album page; options pass as ?shuffle=1&amp;fullscreen=1 URL params
- Fullscreen uses a tap-to-activate overlay (browsers block auto-entry
  on page load); webkit-prefixed for Safari; ⛶ button and F key for
  mid-session toggle
- Fullscreen mode hides controls, counter, caption bar, and site header
- Exiting fullscreen auto-pauses so the current photo stays visible
- Click/tap anywhere in the stage navigates to the photo's album
  lightbox; reads the live src attribute instead of ssIdx to avoid a
  race where ssIdx advances during the cross-fade while the old photo
  is still on screen
- layout.erb excluded from slideshow (layout: false) so the site header
  never appears there
- CSS cache-busted with ?v=2

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add info overlay to lightbox showing photo metadata</title>
<updated>2026-05-09T15:50:10+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-09T15:50:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=b1ffa9050e63329ac72cfc9cca5b44800984e34c'/>
<id>b1ffa9050e63329ac72cfc9cca5b44800984e34c</id>
<content type='text'>
Tap "ℹ Info" in the caption bar to toggle a semi-transparent panel at
the bottom of the image showing filename (if different from title),
date taken, and pixel dimensions. Panel resets to hidden on each
photo change. Button is hidden automatically when no metadata is
available. Width/height are now included in the ENTRIES payload.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Tap "ℹ Info" in the caption bar to toggle a semi-transparent panel at
the bottom of the image showing filename (if different from title),
date taken, and pixel dimensions. Panel resets to hidden on each
photo change. Button is hidden automatically when no metadata is
available. Width/height are now included in the ENTRIES payload.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
