{"slug":"mp3-agentabrams","total":8,"limit":100,"offset":0,"since":null,"commits":[{"hash":"28d232a","date":"2026-07-03 08:08:07 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"08073d2","date":"2026-05-31 16:56:04 -0700","author":"SteveStudio2","subject":"Link favicon.svg in head (use branded SVG, not .ico fallback)","body":""},{"hash":"d4839ec","date":"2026-05-31 16:32:35 -0700","author":"SteveStudio2","subject":"Add per-site favicon (kills /favicon.ico 404)","body":""},{"hash":"b6948f8","date":"2026-05-19 21:15:15 -0700","author":"SteveStudio2","subject":"add 404-guard middleware so .bak/.pre-/~ snapshot paths never serve from static root","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"a0211fd","date":"2026-05-19 21:14:41 -0700","author":"SteveStudio2","subject":"broaden .gitignore to cover snapshot/backup/editor cruft","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"066f365","date":"2026-05-13 08:36:31 -0700","author":"steve","subject":"launchd: two opt-in plists for reboot-survival + tailscale access","body":"Mirrors the ollama-tailscale-bridge pattern:\n\n  com.steve.mp3-agentabrams-server          → node server.js on 127.0.0.1:9696\n  com.steve.mp3-agentabrams-tailscale-bridge → socat 100.65.187.120:9696 -> 127.0.0.1:9696\n\nBoth: RunAtLoad=true, KeepAlive=true, plutil-lint clean. Logs land in\nproject logs/. Server plist deliberately omits MP3_HOST so server.js\nkeeps defaulting to loopback — Tailscale access is layered on top via\nthe separate bridge plist, never by exposing the server directly.\n\nTo enable on Mac2:\n  cp launchd/com.steve.mp3-agentabrams-server.plist ~/Library/LaunchAgents/\n  cp launchd/com.steve.mp3-agentabrams-tailscale-bridge.plist ~/Library/LaunchAgents/\n  launchctl load -w ~/Library/LaunchAgents/com.steve.mp3-agentabrams-server.plist\n  launchctl load -w ~/Library/LaunchAgents/com.steve.mp3-agentabrams-tailscale-bridge.plist\n\nVerified post-load:\n  loopback 127.0.0.1:9696       = 200\n  tailscale 100.65.187.120:9696 = 200\n  home LAN 192.168.1.53:9696    = refused\n\nIf Tailscale IP ever changes (tailscale ip -4), update bind= in the\ntailscale-bridge plist and launchctl unload+load."},{"hash":"adfdb26","date":"2026-05-13 08:28:19 -0700","author":"steve","subject":"server: lock to loopback (127.0.0.1) — was silently bound to 0.0.0.0 via global $HOST","body":"Initial app.listen(PORT, cb) defaulted to all interfaces; Steve caught\nit on first review. The fix has two parts:\n\n1. Pass explicit HOST to app.listen.\n2. Use MP3_HOST (project-specific) instead of HOST. Steve's shell sets\n   HOST=0.0.0.0 globally for other projects, which would have silently\n   undone any 'default to 127.0.0.1' fix.\n\nOverride path preserved: MP3_HOST=0.0.0.0 npm start exposes on LAN.\nVerified post-fix: netstat shows 127.0.0.1.9696 LISTEN only;\ncurl http://192.168.1.53:9696/ -> connection refused;\ncurl http://127.0.0.1:9696/ -> 200."},{"hash":"6a16909","date":"2026-05-13 08:16:40 -0700","author":"steve","subject":"initial: mp3-agentabrams — grid+list of every MP3 on Mac2","body":"358 tracks indexed across ~/Projects/, ~/Videos/, ~/Desktop/, ~/.claude/skills/.\n154MB total. Express on port 9696 (override MP3_PORT).\n\nStack:\n  scan-mp3s.js  walks SCAN_ROOTS, writes manifest.json (gitignored)\n  server.js     /api/manifest, /api/refresh (re-scan), /audio?id=<id> with\n                Range support, /healthz, static public/.\n  index.html    grid + list toggle, density slider (2-10 cols), sort\n                (Newest/Oldest/Title/Size/Duration/Source), text + source\n                filter, pseudo-waveform card art, inline range-aware player\n                bar at bottom. All controls persist via localStorage mp3aa.*\n                and hydrate BEFORE first render per Steve's standing rule.\n\nPaths never appear in URLs — every track is referenced by stable sha1-12\nid, so the filesystem layout is hidden from the frontend.\n\nffprobe duration probe gated by PROBE_DURATIONS=1 (first scan ran with\n=0 for speed; durations show as -- in the UI until re-scan with\nffprobe enabled).\n\nNext: DNS hookup at mp3.agentabrams.com (same pattern as\nvideos.agentabrams.com), optional auth gate if exposed publicly.\n"}]}