<feed xmlns='http://www.w3.org/2005/Atom'>
<title>albumen.git/app.rb, 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>Speed up update.rb and fix UI always forcing full rescan</title>
<updated>2026-05-22T22:50:35+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-22T22:50:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=d32b5e99afc6f0cffefa594510cda0e4f414db75'/>
<id>d32b5e99afc6f0cffefa594510cda0e4f414db75</id>
<content type='text'>
- update.rb: skip exiftool on images marked exif_absent (set after first
  failed attempt); prevents repeated slow scans of old photos with no EXIF
- update.rb: explicit directory argument now implies force — passing a path
  always rescans that subtree regardless of sentinel mtime
- app.rb: /admin/update no longer hardcodes --force; sentinel-based skipping
  is used by default, making UI updates finish in seconds instead of minutes
- admin/album.erb: add "Force rescan all" checkbox to Run Update button;
  checked state passes force=1 to the server and restores --force behavior
- README.md, DESIGN.md: document sentinel skipping, exif_absent flag, and
  explicit-directory force behavior

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: skip exiftool on images marked exif_absent (set after first
  failed attempt); prevents repeated slow scans of old photos with no EXIF
- update.rb: explicit directory argument now implies force — passing a path
  always rescans that subtree regardless of sentinel mtime
- app.rb: /admin/update no longer hardcodes --force; sentinel-based skipping
  is used by default, making UI updates finish in seconds instead of minutes
- admin/album.erb: add "Force rescan all" checkbox to Run Update button;
  checked state passes force=1 to the server and restores --force behavior
- README.md, DESIGN.md: document sentinel skipping, exif_absent flag, and
  explicit-directory force behavior

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>Add per-photo delete checkbox to admin edit form</title>
<updated>2026-05-14T04:14:31+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-14T04:14:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=9cebd2e909793e12f7b9e5125d4fba671b5b660d'/>
<id>9cebd2e909793e12f7b9e5125d4fba671b5b660d</id>
<content type='text'>
Checking Delete and saving permanently removes the file and its
thumbnail; a JS confirm dialog gates the submit. Deleted files are
stripped from params before save_edits so they don't linger in
album.json.

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>
Checking Delete and saving permanently removes the file and its
thumbnail; a JS confirm dialog gates the submit. Deleted files are
stripped from params before save_edits so they don't linger in
album.json.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add folder rename and background update trigger to admin UI</title>
<updated>2026-05-13T17:46:28+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-13T17:46:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=7950acb21b22e7bc6f10c50e1427850de2834b24'/>
<id>7950acb21b22e7bc6f10c50e1427850de2834b24</id>
<content type='text'>
- Admin edit form: "Folder name" field renames the directory on save;
  also moves the thumbnail cache subtree to match the new path
- Admin edit page: "Run Update" button spawns update.rb in a background
  thread, streams output into a terminal-style log panel via 1.5s polling;
  shows Done/Error status when complete

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>
- Admin edit form: "Folder name" field renames the directory on save;
  also moves the thumbnail cache subtree to match the new path
- Admin edit page: "Run Update" button spawns update.rb in a background
  thread, streams output into a terminal-style log panel via 1.5s polling;
  shows Done/Error status when complete

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Use albumen.png as OG image for root URL</title>
<updated>2026-05-12T17:31:29+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T17:31:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=63ee58aac2ab7b24eecbec791757cf6ecb5a2296'/>
<id>63ee58aac2ab7b24eecbec791757cf6ecb5a2296</id>
<content type='text'>
Root album leaves @og_image_rel nil so layout.erb falls back to
/img/albumen.png; photo-based OG image only applies to 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>
Root album leaves @og_image_rel nil so layout.erb falls back to
/img/albumen.png; photo-based OG image only applies to sub-albums.

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>v1.01: replace bcrypt with PBKDF2-SHA256; update README and DESIGN docs</title>
<updated>2026-05-11T18:50:51+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-11T18:50:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=b40e95ca17f8c9f17af5f475d001c8ec33728e6d'/>
<id>b40e95ca17f8c9f17af5f475d001c8ec33728e6d</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>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>Add Open Graph meta tags for social media link previews</title>
<updated>2026-05-11T18:01:35+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-11T18:01:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=c19b0854543abd5d05e0f1c0615c45464c169d29'/>
<id>c19b0854543abd5d05e0f1c0615c45464c169d29</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>
</feed>
