Linux digital picture frame: plays a photo/video library as a fullscreen mpv slideshow with fade transitions and an EXIF date/filename overlay. Bash orchestration scripts + Lua mpv scripts. Configured via a gitignored slideshow.conf (see slideshow.conf.example).
| File | Purpose |
|---|---|
.claude/settings.json |
Permissions and environment variables |
.claude/skills/release/SKILL.md |
Cuts a new release: bumps version, updates changelog, tags, and pushes |
.github/workflows/claude-code-review.yml |
Auto-reviews every pull request |
.github/workflows/claude.yml |
Runs Claude on @claude mentions in issues/PRs |
.github/workflows/release.yml |
Publishes GitHub Releases from pushed version tags |
.gitignore |
Git ignore patterns |
bash install.sh # copy Lua scripts to ~/.config/mpv/scripts/
./generate-slideshow-playlist.sh # convert TIFFs + build shuffled playlist
./slideshow.sh # start the fullscreen slideshowNo build step. Verify loop (install with apt install shellcheck / go install mvdan.cc/sh/v3/cmd/shfmt@latest / luarocks install luacheck):
shellcheck *.sh tests/*.sh # lint Bash scripts (incl. tests/)
shfmt -i 2 -d . # check Bash formatting (2-space indent)
luacheck mpv-scripts/ # lint Lua mpv scripts
for f in tests/*.test.sh; do bash "$f"; done # run all unit tests*.sh— Bash entrypoints (install, playlist generation, slideshow launch)mpv-scripts/— Lua mpv scripts:crossfade.lua(fade transitions),photo-info.lua(overlay),blurred-background.lua(letterbox/pillarbox fill)slideshows/<name>.conf— one file per slideshow (sources + per-slideshow overrides); every slideshow is equal, there's no defaultsystemd/— user service for playlist pre-generation on loginslideshow.conf.example— documented config template (app-wide settings); realslideshow.confis gitignored
Local git config (not tracked, set once per clone): git config core.hooksPath .githooks — wires up scripts/sync-config-table.sh, which keeps the Key Config Files table above in sync on commit.
- All runtime config comes from
slideshow.conf— never hardcode paths; add new options toslideshow.conf.examplewith a default and a doc-table row inREADME.md. - Lua overlay options are exposed via mpv
script-optsso users override without editing scripts. - Keep scripts POSIX-friendly Bash with
set-guarded variable expansion (: "${VAR:?...}").
- Don't commit secrets or credentials to git —
slideshow.confstays untracked. - Don't use
--forceflags — fix the underlying issue instead. - Don't put private/absolute photo paths in committed files.
When the user corrects a mistake or points out a recurring issue, append a one-line summary to .claude/learnings.md. Don't modify CLAUDE.md directly.
When compacting, preserve: list of modified files, current test/lint status, open TODOs, and key decisions made.
Auto-generated by headroom learn on 2026-06-26 — do not edit manually
~900 tokens/session saved
.env.exampleand.envare denied by.claude/settings.jsonby default; the user must explicitly remove the deny entry before agents can read them. When only searching, usegit show HEAD:.env.example | grep ...as a workaround.rm -rfon any path (including/tmp/) is denied by project permissions. Clean up temp files individually withrm -f file1 file2and directories withrmdir, neverrm -rf.
~600 tokens/session saved
- Commits require interactive GPG passphrase input (TTY). Subagents launched without the
claudefish function (which unlocks the key via Headroom) will fail ongit commitwith a PINENTRY_LAUNCHED error. Stage changes and ask the user to confirm they can enter the passphrase before committing from a subagent.
~400 tokens/session saved
shellcheck,shfmt, andluacheckare NOT installed. Usebash -nfor shell syntax checks.luajitIS available for Lua testing;lua,luac,lua5.xare NOT.exiftoolIS available for EXIF inspection.PIL/Pillowis NOT (No module named 'PIL').sudorequires a password;sudo -nalways fails — do not attempt passwordless sudo.
~350 tokens/session saved
- Always
Reada file beforeEditing it — the Edit tool fails withFile has not been read yetif skipped. This applies even after aWriteto the same file: re-read before the nextEdit.
~300 tokens/session saved
- Two copies of
photo-info.luamust be kept in sync:~/Slideshow/mpv-scripts/photo-info.lua(repo) and~/.config/mpv/scripts/photo-info.lua(live). Always edit both. - Photo library path contains spaces:
/home/familie/OneDrive/Familie/Fotos, Videos— always quote it in shell commands. - Desktop folder is
~/Schreibtisch(German locale), not~/Desktop.
~150 tokens/session saved
- Backticks inside
greppatterns are interpreted by bash as command substitution. To count/match markdown fences, usegrep -nc '^\``'(single-quoted) orgrep -nc $'^```'`.