{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"github","url":"https://ejfox.com/github/ai-art-coach","json_url":"https://ejfox.com/github/ai-art-coach.json","generator":"ejfox.com/json-twin@1","data":{"stats":{"totalRepos":214,"totalContributions":1090,"followers":128,"following":58},"contributions":[],"dates":[],"detail":{"commits":[{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"Make article dates prominent","occurredAt":"2026-11-07T18:17:15Z","url":"https://github.com/ejfox/website2/commit/1253fa0a95e11eb5875f97261e8c8226cc601dbf","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"og-image: Dither contrast pass\n\nTighter sun with steep falloff and near-zero ambient, god rays at 0.14,\nsolid #000 bed under the title with a dithered edge, and long titles step\nthe bitmap font down to four lines. Mean luminance across the seven\ncontact-sheet posts drops from 23.5% to 8.0%; every title reads at 500px.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>","occurredAt":"2026-11-05T21:47:42Z","url":"https://github.com/ejfox/website2/commit/a215d7a751a1f7e233da15300af049c42c7bee2e","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"og-image: more reroll variety for Academic, header comments caught up\n\nAcademic now seeds strip height, title ceiling and which sentences become\nmargin footnotes, and the dek yields room to the figure instead of the\nfigure squashing. palette.mjs/render.mjs headers describe the box-free,\ncolorless Dither pipeline.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>","occurredAt":"2026-11-05T21:31:03Z","url":"https://github.com/ejfox/website2/commit/8e2b5eb9c29b18e15e5aa482e907299f726b83a3","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"og-image: four house styles per variant slot (dither, academic, vulpes, broadcast)\n\nEach slot of the Dispatch picker is now a distinct look instead of a reroll\nof one: Dither (1-bit sun, god rays, floating cards, bitmap title with a\nhalftone halo, no box or color), Academic (academic.css typographic card\nwith a block-structure small multiple, numbered sections, margin\nfootnotes), Vulpes (OLED black, pink glyph flow field from the post's own\nsentences, teal cursor, tmux status line, scanlines) and Broadcast\n(Archivo Black lower-third over a halftone of the post's first image or a\nseeded spotlight). extract.mjs now returns a flattened outline with\nlevels, a sentence pool and a per-block structure strip from both the\nprocessed JSON and markdown fallback. CLI flags, output paths and the\n:batchN reroll contract are unchanged. contact-sheet.mjs tiles posts x\nstyles for art direction.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>","occurredAt":"2026-11-05T21:28:01Z","url":"https://github.com/ejfox/website2/commit/366003ab260bf84e5270b31e9b29f805d15ca172","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"Merge pull request #155 from ejfox/tags/thread-vocab-2026-11-01\n\ntags.json: six thread vocabulary tags","occurredAt":"2026-11-02T04:33:12Z","url":"https://github.com/ejfox/website2/commit/c3459d83b15ec2cba983e87fc09504635d1f17d8","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"tags.json: add energy, labor, misinformation, privacy, surveillance, transit\n\nSix words EJ's chart-desk threads had no tag for (threads 1, 2, 5, 6, 7, 8).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-02T04:29:47Z","url":"https://github.com/ejfox/website2/commit/e9840a016ea82229d47f819e5449a973a7a1a6d1","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"Merge pull request #154 from ejfox/ci/webmentions-cron\n\nci(webmentions): hourly run so scheduled posts get announced","occurredAt":"2026-11-01T01:32:00Z","url":"https://github.com/ejfox/website2/commit/fa5e3913e6453721107784af949042fdce6cc55c","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"ci(webmentions): hourly run so scheduled posts get announced\n\nA scheduled post goes live at publishAt with no deploy, and webmentions\nonly ran after a deploy, so it was never announced until some unrelated\npush. Now also hourly (:17), using the latest successful deploy's\nprocessed-content artifact (falls back to committed JSON).\n\n- The 7-day window uses publishTime (publishAt || date), not the display\n  date, so a post scheduled well past its date still qualifies.\n- Sent-cache key is per run (github.sha repeats across hourly runs and an\n  existing key can't be saved over, which silently dropped the sent list\n  and re-sent). restore-keys picks up the newest.\n- concurrency group: two runs on the same cache double-sent.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-01T01:29:06Z","url":"https://github.com/ejfox/website2/commit/8d6b08e3841c20fc41a9de4b2e839a1fceeafe46","type":"ci"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"Merge pull request #153 from ejfox/fix/deploy-rollback\n\ndeploy: snapshot live content before checkout; every failure path alerts","occurredAt":"2026-11-01T01:16:36Z","url":"https://github.com/ejfox/website2/commit/22940c9bbf3dfd877c9b51259c32580450360c45","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"Merge pull request #152 from ejfox/fix/scraps-seal-catalog\n\nfix: sealed keys can't be silently replaced; unshared scraps expire; catalog","occurredAt":"2026-11-01T01:13:24Z","url":"https://github.com/ejfox/website2/commit/2d33f832e754a2001c3b1c17f4ae3e57646c8436","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"style: prettier on files flagged by lint\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-01T01:10:30Z","url":"https://github.com/ejfox/website2/commit/83bedea7767aa77a160a9de9016ad77224c016e3","type":"style"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"deploy: snapshot live content before checkout; every failure path alerts\n\nFrom the 2026-10-31 state-machine audit (deploy swap machine).\n\n- .processed.old was taken AFTER `git reset --hard BUILT_SHA`, which had\n  already rewritten the tracked content/processed to the new commit's\n  committed JSON. A rollback restored that, not what was live. The\n  snapshot now happens before the reset, and every failure path calls\n  restore_live (reset to PREV_SHA + restore the snapshot).\n- A truncated tarball failed `tar` under set -e: no alert, checkout left\n  at BUILT_SHA. It's now treated as a bad transfer (restore + alert).\n- Rollback with no .output.old moved the new build aside and then failed,\n  leaving no .output at all. Now it keeps the new build and alerts that\n  no rollback was possible.\n- After a rollback, poll the healthcheck for PREV_SHA and say whether the\n  rollback actually took.\n- EXIT trap: any unplanned exit (rsync, pm2, …) alerts instead of dying\n  silently half-swapped. Checked under zsh (the deploy user's shell).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-01T01:07:54Z","url":"https://github.com/ejfox/website2/commit/2e162cd2a8787cf6eb84bee5e8c812ab39c0f8a0","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"fix: sealed keys can't be silently replaced; unshared scraps expire; catalog\n\nFrom the 2026-10-31 state-machine audit.\n\n- Sealed posts. sealResult minted a key whenever .postkeys.json lacked\n  the slug (any worktree, a lost or older keyring), then re-sealed the\n  envelope under it: every shared link broke and the log said \"re-sealed,\n  same key\". It also re-sealed when the envelope didn't open with the\n  stored key. Both are now fatal, checked before anything is minted or\n  saved. A keyring that exists but can't be read is fatal too; it used to\n  parse to {} and get overwritten, losing every key. Tests cover all\n  three (worktree, mismatched key, corrupt keyring).\n- Scrap permalinks (/api/scraps/[id]): swr off, maxAge 10 min. With\n  Nitro's default stale-while-revalidate, a refresh that 404s (scrap\n  unshared) kept serving the cached copy until a restart.\n  (Cloudflare doesn't cache /api/*: cf-cache-status is DYNAMIC.)\n- apiCatalog: add /api/scraps/{id}. The api-catalog test was the one\n  red test on main.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-01T01:06:50Z","url":"https://github.com/ejfox/website2/commit/754970fef716821a9557f01047fb6f80034fbef8","type":"fix"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"Merge pull request #151 from ejfox/fix/cache-key-and-server-state\n\nfix: renderer-hashed cache key, named stats caches, pg pool error handlers","occurredAt":"2026-11-01T00:58:45Z","url":"https://github.com/ejfox/website2/commit/ce72c11e3b09cf4c5802775f4c9aa7f67b197849","type":"other"},{"repository":{"name":"website2","url":"https://github.com/ejfox/website2"},"message":"fix: renderer-hashed cache key, named stats caches, pg pool error handlers\n\nFrom the 2026-10-31 implicit-state-machine audit.\n\n1. Processing cache. CACHE_VERSION was a hand-bumped string, and\n   ba062fc8 (getPostType fix) shipped without a bump, so prod listed\n   43 projects and 97 reading notes as type \"post\" (/blog.json included\n   projects). The key is now RENDER_EPOCH + a hash of the renderer's own\n   code (processMarkdown, plugins, helpers, internal-links, vue-body,\n   visibility, theme, yarn.lock). Data files a plugin reads are still\n   not in it; bump RENDER_EPOCH for those. Full reprocess included:\n   types are now projects:project 43, reading:reading 97.\n\n2. Stats caches. github.get.ts and photos.get.ts were unnamed cached\n   handlers called from /api/stats with its event, so Nitro keyed both\n   on /api/stats's URL and they overwrote each other's slot. Each now\n   has a name and a fixed key (one entry whoever calls it). /api/stats\n   and /api/stats-lite drop the etag/last-modified/cache-control the\n   inner handlers set, so they stop serving github's etag (stale 304s).\n   stats-lite also strips If-None-Match/If-Modified-Since first: it runs\n   the inner handlers on the real request, and a 304 from github's\n   handler ended the response and cached stats with no GitHub for 5 min.\n\n3. pg pools (reach, website-stats) get an 'error' listener. pg-pool\n   re-emits idle-client errors on the pool; with no listener one Umami\n   DB blip was an uncaught error that killed the process (and every\n   in-memory cache).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-01T00:08:38Z","url":"https://github.com/ejfox/website2/commit/eb0d741c0b065423cb2b9c649d20aaa91f3bf13c","type":"fix"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"autoplace learns from EJ: created-window logging + nightly gated trainer\n\n- Window log entries now carry window ids; new windows of 15 watched apps\n  log a \"created\" event; autoplaces log which rule placed them (\"placed\").\n- bin/autoplace-train (LaunchAgent 04:30): follows each new window to\n  where it settled, replays history past-only, and writes\n  ~/.config/autoplace-learned.json. An app gets a learned slot order only\n  at >=80% replay accuracy over >=10 new windows; \"he leaves it where it\n  opens\" disables it; a rule he re-snaps >30% of the time over 14 days\n  (judged only on its own placements) is disabled. Never learns Obsidian\n  (booth places it). Changes append to usage-logs/autoplace-learning.log.\n- Hammerspoon prefers learned rules (alert says \"(learned)\"), honors\n  disables, and autoplacePreview reflects both.\n\nTested on synthetic logs: learns Dell top->bottom for a Discord-like app\n(100% over 11), disables an always-floating app, demotes a rule corrected\n5 of 10 times. Earlier analysis: predicting manual snaps directly topped\nout at 34%, which is why this learns from new windows instead.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T18:35:40Z","url":"https://github.com/ejfox/dotfiles/commit/c93eca254a746c7404db0ad1d0d655de3a848e64","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"hammerspoon autoplace: screen-aware occupancy; Fantastical | Things pair on Dell\n\n- Free-slot check now counts every visible window of any app (not just the\n  same app), ignoring full-screen windows, matching the mined 'fill the\n  free half' rule. Safari still lands over a full-screen Ghostty.\n- Fantastical and Things share a Dell half as two quarters (top row if\n  free, else bottom); Discord, Things and Fantastical are no longer\n  float-class.\n- autoplacePreview(app) needs no running app.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T18:27:28Z","url":"https://github.com/ejfox/dotfiles/commit/ceb918a54017005601c719fcfe94a11d738486c3","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"bin/window-habits: mine window logs for snap habits and autoplace accuracy\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T18:21:56Z","url":"https://github.com/ejfox/dotfiles/commit/da287a1a909c33917866479e2070a2db139280bc","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"hammerspoon autoplace: fill-the-free-half for Chrome, Discord, Claude\n\nMined 1,052 manual snaps (Jul-Nov 2026): placing a new window in the free\nhalf of its screen explains 68% of half-snaps (Claude 6/6; 64 of 76\nSafari right-snaps happened with the left half taken). Chrome goes Dell\ntop then bottom (top-only was 8% wrong), Discord Dell top then bottom,\nClaude iMac left then right. Ghostty (full vs right is a real choice) and\nObsidian (placed by the booth script) are deliberately left manual.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T18:21:42Z","url":"https://github.com/ejfox/dotfiles/commit/0fe6b98c14267487b2aad69732eb861ba3723815","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"hammerspoon autoplace: Safari fills iMac left, iMac right, Dell top, Dell bottom\n\nEach new Safari window takes the first slot no other Safari window covers\n(>=50% overlap); unplugged screens are skipped; past the last slot macOS\nplacement stands. autoplacePreview(app) answers where the next window\nwould land, read-only.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T18:19:59Z","url":"https://github.com/ejfox/dotfiles/commit/53c53666127d959008443e0e6d0cf762bae8de54","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"second-opinion: drop the never-send list (EJ's call); --private gate and secret scan stay\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T03:32:04Z","url":"https://github.com/ejfox/dotfiles/commit/4e77fc8817565a375ce74a74eeec6612b5a64aae","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"bin/second-opinion: cross-model review via Codex on computah\n\nShips a diff, commit range or files to computah, where the Codex CLI\n(ChatGPT sign-in) reviews them and the findings print here. Everything\nsent goes to OpenAI, so public GitHub repos only by default, --private for\nprivate repos, a hard never-send list (dnr-archive, landwatch,\nstanding-watch, osint-tools, kingston-twins, egoscan, Obsidian vaults,\n~/.claude, .env) that no flag overrides, and a secret scan that aborts.\nThe payload is inlined in the prompt because Codex's Windows sandbox can't\nstart its command runner from an SSH session. Never wakes the PC.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T02:50:51Z","url":"https://github.com/ejfox/dotfiles/commit/67f66d89e528fb3310dc37517453c311cc43562b","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"upgrade pass: node 22.23.4 pin with fallback, yazi 26.9 schema, relbins\n\n- .zshrc: pin node v22.23.4; if a machine lacks it, fall back to its newest\n  installed node instead of dropping node from PATH (glob runs only on a miss)\n- yazi 26.9: fetchers id/name -> group/url; theme mgr.hovered -> [indicator],\n  [select] -> [pick], help on/run -> chord/action, border keys; yazi ignores\n  unknown keys silently, so the old names had stopped applying\n- bin/relbins: Intel-iMac installer for CLI release binaries in ~/.local/opt\n  (Homebrew no longer ships Intel bottles); sha256-checked, old versions kept\n- CLAUDE.md: never blanket brew upgrade on the iMac; use relbins\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T01:19:54Z","url":"https://github.com/ejfox/dotfiles/commit/42ef0162aa6d8fbceabad42df3f3182c362993c0","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"computah preview-server: launch fave/unstar posters with pythonw (no console windows)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T00:08:40Z","url":"https://github.com/ejfox/dotfiles/commit/bafac71b4c3cb8f9bc1e03b786fa9cc9874d6a38","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"bin: add tmux-focus-color, vtsls-wrapper, hue-latency; add tweakcc apply script\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-04T18:11:05Z","url":"https://github.com/ejfox/dotfiles/commit/75e0a1b37cd59c875c259c2858f9cd4495d84fe3","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"tmux: index usage-log hooks so they stop wiping reading-mode hooks; ignore bin backups\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-04T18:10:33Z","url":"https://github.com/ejfox/dotfiles/commit/e0b893b47e5a45fffd3a9d48b91cd3bca20fc4b7","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"add connectology-push, Vera agent, regenerate cheatsheet\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-04T18:10:33Z","url":"https://github.com/ejfox/dotfiles/commit/6aab8f79610149f403713b6b4afe1faecdb2cb52","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"obs: scene and profile updates\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-04T18:10:33Z","url":"https://github.com/ejfox/dotfiles/commit/81135e2dc366921ca2a5915166c512d55888137c","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"mac-backup: Homebrew on launchd PATH, report exit 3 as a partial snapshot\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-04T18:10:33Z","url":"https://github.com/ejfox/dotfiles/commit/a20822531474dd431632bc4debf190ebdae71376","type":"other"},{"repository":{"name":"dotfiles","url":"https://github.com/ejfox/dotfiles"},"message":"computah: guard on the power plan's wake-timer setting, skip non-lease files\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-04T18:10:33Z","url":"https://github.com/ejfox/dotfiles/commit/8b8c46a61ffe16ff3d62de6204df1eccb7ababf4","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge pull request #14 from ejfox/ci/build-workflow\n\nCI: build an unsigned DMG on every push and PR","occurredAt":"2026-10-26T18:30:09Z","url":"https://github.com/ejfox/website-dispatch/commit/54ad1914bb54dee80580214c508c8ac7ded31976","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"ci: build an unsigned Dispatch DMG on every push and PR\n\nrelease.yml has never produced a release past v0.2.0: the Apple and Tauri\nsigning secrets aren't set, so it stops at its secrets check. This builds\nwithout them (typecheck, unit tests, tauri build) and uploads the DMG as an\nartifact.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-26T18:21:16Z","url":"https://github.com/ejfox/website-dispatch/commit/98098095d4735fbd6f8cc0c608894a1dd1f642ac","type":"ci"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge pull request #11 from ejfox/release/0.8.2\n\n0.8.2: postmark icon, Settings window, full menu bar, first-use tips, honest publish flow","occurredAt":"2026-10-26T18:20:17Z","url":"https://github.com/ejfox/website-dispatch/commit/8956982c6cfe3d76278943bf4a529c74c8e9511f","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"test: preview smoke checks body content, not the dropped title heading\n\nSince 2026-10-11 website2 drops an opening heading that repeats the title,\nso the fixture's '# Smoke Test' never reaches the body and the test failed.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-26T18:19:56Z","url":"https://github.com/ejfox/website-dispatch/commit/dde4d5e025b46062315b89a90835a573b9df930b","type":"test"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge main into release/0.8.2\n\nKeeps 0.8.2's inspector layout and prose help, and ports main's inline\ndiff (D) into it: the toggle and summary now sit above the rendered post.\n0.8.2's PublishDiffPanel stays too. Also brings in Convert to Vue Page →\nyarn crown.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-26T18:19:56Z","url":"https://github.com/ejfox/website-dispatch/commit/1a4b86e015a43b58733f66f436938a8a3e4b1197","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge pull request #13 from ejfox/feat/convert-via-yarn-crown\n\nConvert to Vue Page runs yarn crown","occurredAt":"2026-10-26T18:14:51Z","url":"https://github.com/ejfox/website-dispatch/commit/c2c9c963d795ea466b854a824f8380aa353caf20","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"convert to vue page: run website2's yarn crown instead of a template copy\n\nThe Rust command wrote its own copy of the crowned template, which had\nalready drifted from website2's. It now runs scripts/author/crown.mjs in the\nrepo, which also moves the post's prose into the Vue page.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-26T16:25:21Z","url":"https://github.com/ejfox/website-dispatch/commit/986feaed140b4a5340e4d0f7e879cf73f27e3c4a","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge pull request #12 from ejfox/feat/inline-diff\n\nPreview: inline diff mode (D)","occurredAt":"2026-10-12T15:30:00Z","url":"https://github.com/ejfox/website-dispatch/commit/4f0b4c11aadf8fbf164c2822880b72746cb75f0a","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Inline diff: README shortcut row, screenshot, strip-types flag for Node <22.18\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-12T15:20:50Z","url":"https://github.com/ejfox/website-dispatch/commit/99cf53be5f9a16f8561d1b0d645d338a384e0f74","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Preview: inline diff mode (D)\n\nDiff toggle in the Preview pane (button on the CONTENT divider, Shift+D,\npalette action, help row). The post stays typeset like Preview while changes\nare marked inline, direction vault -> live (what publishing would do):\nvault-only words underlined, live-only words struck and dimmed, a margin\ntick beside each changed block, and a header with words added/removed that\ncalls out live words publishing would erase. Esc or D exits.\n\nBoth sides render through the same worker pipeline (new passive renders so\nthe main Preview render never goes stale), then diff per block (LCS over\ntag + text, pairing same-kind blocks, recursing into lists/quotes/footnotes)\nand per word within blocks via jsdiff. Only text nodes are split, so links\nand footnote refs survive. get_publish_diff now also returns published_body.\n\nPure core in src/utils/inlineDiff.ts with node:test unit tests (npm run\ntest:unit, now part of npm test). The See changes panel is unchanged.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-12T15:18:13Z","url":"https://github.com/ejfox/website-dispatch/commit/a789b348ba8a6ca982d3241b6eba31d04142fdb6","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Sign local installs so macOS keeps vault access; log frontend errors\n\nUnsigned builds change identity on every rebuild, so TCC silently denied\nthe iCloud Drive vault and Dispatch listed 0 posts when launched from Finder.\nscripts/install-local.sh builds, preserves the installed .env, and signs with\nthe Apple Development identity. Release builds now forward console errors\nto dispatch.log via a log_frontend command.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-12T01:20:21Z","url":"https://github.com/ejfox/website-dispatch/commit/383ed1d99b9e6b4fcc9977bcc0c80b8c56151d73","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Release 0.8.2: icon, Settings window, menus, first-use tips, honest publish flow\n\nMerges feat/icon-082, feat/publish-082, feat/onboarding-082, feat/menus-082\nand feat/settings-082. Wires Help > Show Tips Again to resetTips() and makes\nSettings (cmd-,) open only the Settings window.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-12T01:00:44Z","url":"https://github.com/ejfox/website-dispatch/commit/0a07029ff343e10fffdf7394b196623cf70d3d87","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge branch 'feat/menus-082' into release/0.8.2","occurredAt":"2026-10-12T00:58:54Z","url":"https://github.com/ejfox/website-dispatch/commit/6cb6d570ab4a7cc050a6ce0bcc7474c2d72ad629","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge branch 'feat/onboarding-082' into release/0.8.2","occurredAt":"2026-10-12T00:58:54Z","url":"https://github.com/ejfox/website-dispatch/commit/945f7cac0524c32517d6299ad44b1e2b086bb1f0","type":"other"},{"repository":{"name":"website-dispatch","url":"https://github.com/ejfox/website-dispatch"},"message":"Merge branch 'feat/publish-082' into release/0.8.2","occurredAt":"2026-10-12T00:58:54Z","url":"https://github.com/ejfox/website-dispatch/commit/82526fe14e9f7f1dbc89f6263f31c5653a971f78","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Windows: mock-vendor test purchases don't count against real vendors' caps\n\nThe live mock approval test ($80.40) blocked a real $20 joy pick on the $100/day cap.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-12T00:17:20Z","url":"https://github.com/ejfox/errand-joy-bot/commit/734fd26544cfe229bf6cb658ba5fd2a94002c3db","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Zinc quote: small-order shipping floor under the $35 free-shipping threshold\n\nThe first live joy pick (~$14) failed with max_price_exceeded: offers reported $0\nshipping but Amazon charges shipping under $35, pushing the real total past the\n10% max_price headroom. Quote now assumes $6.99 shipping under the threshold\n(ZINC_FREE_SHIPPING_THRESHOLD_CENTS / ZINC_SMALL_ORDER_SHIPPING_CENTS; 0 disables).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-12T00:13:38Z","url":"https://github.com/ejfox/errand-joy-bot/commit/df10121cc3b93db3965e65ed02f22d7e9b0eb1cd","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Merge CJdropshipping adapter (off by default; sandbox first)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:59:25Z","url":"https://github.com/ejfox/errand-joy-bot/commit/025aa8e82729395bd250443d5e0ed1af93623488","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"cj adapter: CJdropshipping, DDP-only, prepaid wallet, sandbox by default\n\nquote(): variant price + freightCalculate to the owner ZIP; only lines with a\nCJ-collected US taxesFee (cj_not_ddp otherwise); CJ duties under half of a\n40%+$3 estimate refuse as cj_duty_suspicious. place(): createOrderV2 with\npayType 3 (no payment), re-read total vs hard cap and quoted duties, wallet\ncheck, then pay the whole order from balance and confirm it is paid.\norderNumber = the gate idempotency key. listCharges from paid orders by\npaymentDate. cjSourcingRequest() is an exported research errand, not wired\ninto purchases. Built from CJ's REST docs only; CJ's MCP is not used.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:58:46Z","url":"https://github.com/ejfox/errand-joy-bot/commit/9d21d51125e67002d2fdec0805477a460b560a1a","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"docs: generic host in Lob key example\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:47:18Z","url":"https://github.com/ejfox/errand-joy-bot/commit/5fb33e701faea15052e1866bcbc511dc09ff8f57","type":"docs"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Merge Lob credit check + send_date\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:46:19Z","url":"https://github.com/ejfox/errand-joy-bot/commit/6a5f3eeff80c92b064ae58443f1e42200c0d1c21","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Merge OSH Park PCB handoff adapter\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:46:19Z","url":"https://github.com/ejfox/errand-joy-bot/commit/9e7931544d503b81f947255652d5fb121de81bd5","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Lob: refuse on short Lob Credits; send_date window for cancel\n\nLob holds postcards when credits run out and mails the backlog on top-up, so place() now reads\nthe credits balance (GET /accounts/credits_balance, /accounts fallback) and refuses\nlob_insufficient_credit unless it covers this piece plus our unsent pieces; an unreadable\nbalance refuses lob_balance_unavailable unless LOB_ALLOW_UNCHECKED_BALANCE=1. Test keys skip it.\nEvery postcard gets send_date = now + LOB_SEND_DELAY_MINUTES (default 60) so cancel() works.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:45:53Z","url":"https://github.com/ejfox/errand-joy-bot/commit/fc9aaccb7dd2e276cd1aee0b0cc3f3288cd038b5","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Merge Lob postcard adapter\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:45:26Z","url":"https://github.com/ejfox/errand-joy-bot/commit/cdb00d43959d774ab7480c3980faa81ed08efc81","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"OSH Park handoff adapter + tools/pcb Gerber bbox pipeline\n\nquote() prices locally from the published per-sq-in table (verified 2026-10-11) using the\noutline bbox read from the Gerber zip (stdlib zip reader, X2 Profile / Edge_Cuts / GKO / GM1,\narcs included). place() uploads to the documented anonymous import endpoint and records $0:\nthe owner checks out on oshpark.com. status() open until a marker file; listCharges() [].\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:42:56Z","url":"https://github.com/ejfox/errand-joy-bot/commit/3f0d4ccc486b874557d4c84e33f3ed7cd977eb25","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Lob postcard adapter (id \"lob\")\n\nOne US First Class postcard per request: front = item.url (pdf/png/jpg), back = item.message\nor item.title, escaped into a left-column HTML layout. quote() is offline from Lob's published\nall-in per-piece table (4x6 91c, 6x9 103c, Developer plan) + 3% card fee; no tax, no separate\npostage. place() sends an Idempotency-Key and metadata ejb_cents so listCharges() matches;\nstatus() maps tracking events (Returned to Sender stays shipped: it is billed). Owner-home\nreuses zinc's OWNER_SHIP_TO_JSON parser; any other recipient is reach \"others\". Opt-in\nLOB_LIVE=1 test makes one free test-mode postcard and refuses live_ keys.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:42:41Z","url":"https://github.com/ejfox/errand-joy-bot/commit/632c90d365ca946040db51c2a5a86eb76b54c3bd","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"Slant upload host in allow-net map; verified Lulu package ids\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:42:37Z","url":"https://github.com/ejfox/errand-joy-bot/commit/a76dc6bb78ded049a77d65b7d0294a1b7c1f2e0f","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"docs: generic host name in key-name examples\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:39:43Z","url":"https://github.com/ejfox/errand-joy-bot/commit/81f91a91fd04719a65b1d4be53fffb96ff750e1d","type":"docs"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"deno task check covers gate/vendor_hosts.ts (install.sh runs it)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:38:55Z","url":"https://github.com/ejfox/errand-joy-bot/commit/33d30e6bd346b9489f5b3b99c4015abc6acec86b","type":"other"},{"repository":{"name":"errand-joy-bot","url":"https://github.com/ejfox/errand-joy-bot"},"message":"install.sh derives vendor --allow-net hosts; vendors table, env vars, MCP item fields\n\n- VENDOR_HOSTS + vendorHosts() in registry.ts (test: covers exactly the\n  registered vendors); gate/vendor_hosts.ts prints them for a config.\n  install.sh adds the enabled vendors' hosts (example config on a first\n  install), keeps --allow-net additions, dedupes, and dies on a bad config.\n  install.sh's test step now matches `deno task test` (tools too).\n- docs/vendors.md: one table of all vendors (reach, payment, cap, env\n  vars, key name), the new Item fields, links / needs-action, the\n  hard-cap reconcile rule; per-vendor item docs updated; stale gaps out.\n- README roadmap, runbook, threat model; .env.example lists every\n  vendor env var (commented, empty).\n- MCP request_purchase item schema: message, files, pageCount, sizing,\n  attributes, aoi.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T23:35:38Z","url":"https://github.com/ejfox/errand-joy-bot/commit/416aaedef5c9dd13804ee35e10c6ce4db1af0276","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Wall text: cut the flourishes, end on facts\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T05:13:22Z","url":"https://github.com/ejfox/417am-site/commit/0df7d4a15fe86e9b1915a8c4ca99bffadb5fc2a8","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Archive pages: each bot piece linked to its script, seed and tweet\n\n/a/:no gives every @417am1975 archive piece its own page: the image, a\nchecklist entry (script, seed as tweeted, Eastern post time, original post,\nsource at the commit), the script's CoffeeScript in a scrolling block, and\nwall text on the 10-15 and 12-20 pieces. The archive grid now links to these\npages and names the script on the wall label. Information gains Archive notes.\n\ndata/archive-meta.json and data/artscripts/ are generated by\ntools/build-archive-meta.py from the tweet list and a twitter-artbot clone;\n60 of 145 pieces match, 15 scripts vendored. 3-4-4 is pinned to its\n2018-03-04 version, the word list that made the spring 2018 pieces.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T04:53:30Z","url":"https://github.com/ejfox/417am-site/commit/5ce1f0afcab67440e9173f87913539275301bfed","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Per-piece materials: each work's own art supplies\n\nOptional `materials` on /api/post and a new token-auth POST /api/materials\n({slug|id, materials}) to attach them to existing entries. Both go through one\nstrict per-kind allow-list (type + range/enum/pattern per key, 2 KB cap);\nanything else, prompts included, is dropped and never stored.\n\nStudio: dither, bit depth, pixel scale, render/output size, render time, seed,\nred, CRT. Flux: model, quant, steps, sampler, CFG, guidance, seed, size,\nimg2img + strength + \"from a studio render\".\n\nWall label goes per-piece (\"Blender 5.2, Cycles; Atkinson dither\",\n\"FLUX.2 [klein] 9B, img2img, 19 steps\"); the piece page lists the generic\nsupplies then the specifics; RSS/JSON Feed items carry the wall label.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T03:36:32Z","url":"https://github.com/ejfox/417am-site/commit/b69409fab33be8bce5981f3550ed3ceb51b2c55e","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"4:17 am party: the white cube goes black-box for the whole minute, every day\n\n04:17 America/New_York (one shared nightly opening): works come off the wall and drift,\nspin and bob on their own rhythms, a slow saturated hue spin, a giant 4:17 AM marquee,\nlabels read NOW; snaps back at 04:18. ?party forces it for previews. No flashing over\n3/s (WCAG 2.3.1); prefers-reduced-motion gets the color flip only. Umami: party-417.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T03:24:18Z","url":"https://github.com/ejfox/417am-site/commit/e572c86c31b041a502f93e6f5440c700b24b4b52","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Materials named like art supplies; Information gets its own page\n\nWall labels: FLUX.2 [klein] 9B, stable-diffusion.cpp / Blender 5.2, Cycles; 1-bit dither.\nPiece pages list the full supplies (model, text encoder, VAE, runtime, GPU / Blender,\nCycles, Python, dither + nearest-neighbor scaling). /information: about, materials incl.\nthe dither methods, hours, feeds (a footer anchor on a long page read as a dead link).\nTools and hardware only: never the machine name, prompts, recipes or piece names.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T03:20:15Z","url":"https://github.com/ejfox/417am-site/commit/c9716cdaefc1bdcd0c4ca7882c3dbeb19fedc56c","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"White cube: grotesk type, works hung with wall labels, checklist piece pages\n\nNYC gallery-site register (EJ: \"nyc art world vibe\"): white walls, one small Helvetica\nsize, generous gutters, each work contained and bottom-aligned with an always-visible\nwall label (italic title, year, medium from the existing public kind words), hairline\nedge for white-ground pieces. Nav Works / Archive / Information; piece page = work +\ntombstone (artist, title, year, medium, px, date). Feeds and permalinks unchanged.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T02:57:56Z","url":"https://github.com/ejfox/417am-site/commit/375e7c21823e78ac7ab210513616352bd8198eac","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Gallery: dense square grid, hover labels, one-line section bars, short colophon\n\nCells are uniform squares on 1px rules (2/3/4/6 columns), the whole piece contained;\nnumber + kind glyph on hover/focus; captions, dates and the video player move to the\npermalink page (upload captions now shown there). Header carries rss/json.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T02:53:49Z","url":"https://github.com/ejfox/417am-site/commit/083f78e0c88fb998812cb24000cf3bd38069c1ec","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Video entries: mp4/webm with metadata stripped, poster frame, feeds\n\n- /api/post (field \"video\") and /upload accept H.264 mp4 or VP8/VP9 webm, sniffed from\n  magic bytes and forced on ffprobe/ffmpeg; caps 90 MB, 180 s, 4096 px\n- re-mux drops all container/stream/chapter metadata, extra tracks, encoder tags,\n  creation times and H.264 SEI; AAC/Vorbis audio re-encoded bitexact\n- poster = first non-black frame as a stripped PNG\n- <video> muted loop playsinline controls preload=metadata, caption mark ▶︎ video\n- RSS enclosure + media:content, JSON Feed attachments, og:video\n- Umami video-play (once per video) and video-open\n- MEDIA_DIR dev mode stores files locally for end-to-end tests\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-11T22:42:56Z","url":"https://github.com/ejfox/417am-site/commit/c8a7add7976ad44b922ba16281383efde40cb01e","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Umami 3.4: versioned tracker + Web Vitals, umami-plus helper, recorder (heatmaps/replay)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-06T18:28:51Z","url":"https://github.com/ejfox/417am-site/commit/5917293a6b86982ec2f072e75aaaa9c3836b0c1f","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Feed items: drop inline style (W3C validator warning)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-06T18:08:21Z","url":"https://github.com/ejfox/417am-site/commit/97edd808eb0598585da04ac767dcf8342e6eee46","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Umami hooks: UMAMI_WEBSITE_ID env (no script when unset) + event attributes\n\nEvents: rss-click, feed-json-click, permalink-open, image-open, outbound,\narchive-divider-view (once, IntersectionObserver on the bot-era break).\nPermalink image links to the full-size original.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-06T18:06:00Z","url":"https://github.com/ejfox/417am-site/commit/416ec33abda31277d326c8e644e04c7478ff5c4c","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"One record, two eras: new work (2026-) above the @417am1975 archive\n\n- live manifest moves out of git (LIVE_MANIFEST, VPS /data2/417am-data/now.json) so\n  deploys (git reset --hard) can never wipe posts; data/art.json stays a read-only seed\n- posting API: POST/DELETE/PATCH /api/post, GET /api/schedule (Bearer POST_TOKEN,\n  fail closed), idempotent on id, publish_at drip scheduling, PNG metadata stripped\n- public pages show image, number, kind and date only; private ids never rendered,\n  permalinks use random slugs (/p/:slug with og:image)\n- RSS 2.0 (/rss.xml) + JSON Feed 1.1 (/feed.json), new work only, live entries only\n- brutalist-academic redesign: one monospace size, flat colors, 1px rules, numbered\n  entries, crisp pixelated 1-bit pieces\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-06T18:03:15Z","url":"https://github.com/ejfox/417am-site/commit/f8622fe3d72a2077a7b0790fd094893fdd8000a2","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Fill era gaps: Oct/Nov 2017, Feb-Mar 2018, Jul 2018 (27 pieces)\n\nSystematic month-by-month X search sweep of @417am1975's full\n2017-2019 lifespan to surface visual eras missing from the gallery.\nConfirmed Nov 2018 and Mar-May 2019 are genuinely empty (no posts).\n3 pieces flagged as having had likes/favorites.\n\nManifest: 118 -> 145 entries.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>","occurredAt":"2026-10-02T17:09:57Z","url":"https://github.com/ejfox/417am-site/commit/cfeef1ceb580dabb9b1f53909b3fba1b8523ae0a","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Add 38 more pieces from the X timeline: engagement + era sampling\n\n17 pieces with confirmed likes/retweets (May 2018 - Sep 2019), plus\nera-sampled pieces covering the bot's debut (Aug 2017 debug builds,\nparams visible in captions), late 2017, and April 2018 - filling gaps\nbetween the previously-recovered Imgur album and Nov 2019 letterform\nburst. Manifest: 80 -> 118.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>","occurredAt":"2026-10-02T16:57:28Z","url":"https://github.com/ejfox/417am-site/commit/5f52dab7b7ca649ee18c5031ba8bb61a25652cb1","type":"other"},{"repository":{"name":"417am-site","url":"https://github.com/ejfox/417am-site"},"message":"Add 20 pieces recovered directly from the @417am1975 X timeline\n\nFirst excavation pass of the live account (21.5K posts, 2017-2019+)\nbeyond the Imgur-era archive already on site. This batch is an hourly\nburst of a word/letterform-collage series posted Nov 18-19, 2019.\nTotal gallery: 80 pieces.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>","occurredAt":"2026-10-02T16:45:57Z","url":"https://github.com/ejfox/417am-site/commit/83f0fb55f5c3de07214585279f52cfdad5d558a7","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #55 from room302studio/feat/joyful-contact\n\nContact form: email first, unfolds, hand-drawn","occurredAt":"2026-10-21T18:54:22Z","url":"https://github.com/room302studio/room302studio/commit/f1a6d692b27526c07336399aaea57ffeefc14b16","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Contact: soften the reply promise (EJ)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T18:53:59Z","url":"https://github.com/room302studio/room302studio/commit/8750ce05f872ebc2619eeebe52dc3c2fbb370965","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Contact form: email first, unfolds, EJ's hand-drawn marks\n\n- One calm question first (email); answering unfolds project chips, the\n  message (with tap-to-start prompts) and name on the same page\n- EJ's scanned notebook marks (12 pieces cut from the website2 sprite, 16KB):\n  circled step numbers in the margin, a pen ring loops around picked chips\n  and the thank-you, pen arrows on next/send\n- Light/dark via existing tokens, mobile-first, reduced-motion respected,\n  16px+ inputs (no iOS zoom), Cmd+Enter to send\n- Same worker payload; chosen project types are prepended to the message.\n  Honeypot + 3s timer unchanged. Umami: contact-step + form-submit(kinds)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T18:38:48Z","url":"https://github.com/room302studio/room302studio/commit/e8267c16e223d4c3798334e130eed3a9748a4d0d","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #54 from room302studio/feat/contact-health\n\nContact worker: /health for uptime monitoring","occurredAt":"2026-10-21T18:21:49Z","url":"https://github.com/room302studio/room302studio/commit/6aef875d95594975a4c79074cbdf09bf8d2d42ce","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Contact worker: GET /health for uptime monitoring\n\nFails (503) if D1 can't be read, the email binding is missing, or any real\nlead from the last 7 days was saved but never emailed (leads under 5 minutes\nold skipped). Reports no lead details. Deployed as version 0104b63a.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T18:21:42Z","url":"https://github.com/room302studio/room302studio/commit/94a7bc9a5e7364186b046d7836c6158fb22e0e6d","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #53 from room302studio/feat/umami-replay\n\nUmami 3.4: session replay + heatmaps, Web Vitals, behavior events","occurredAt":"2026-10-06T21:15:27Z","url":"https://github.com/room302studio/room302studio/commit/f3ccd42ce8af81d68aa9df2ebe3a865e072ae9ec","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Umami 3.4: session replay + heatmaps, Web Vitals, umami-plus behavior events\n\n- recorder.js: heatmaps + session replay, STRICT masking (all text and inputs hidden;\n  forms, email and password fields blocked); sampling configured inside Umami\n- tracker pinned to ?v=3.4.0 (Cloudflare edge still caches the pre-3.4 script, which\n  lacks data-performance/getSession) + data-performance (Web Vitals)\n- umami-plus: scroll depth, engaged time, copy length, 404s; outbound + mailto stay\n  with plugins/umami-funnel.client.ts so nothing double-counts\n- CSP: allow https://umami-plus.tools.ejfox.com in script-src\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-06T18:38:55Z","url":"https://github.com/room302studio/room302studio/commit/80ae8ef02c249388ef88670d97d9e4e209293094","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #52 from room302studio/fix/contact-worker-hardening\n\nContact worker: bot-bypass fix + first test suite","occurredAt":"2026-10-06T17:25:18Z","url":"https://github.com/room302studio/room302studio/commit/a4404735c68d9daff9f7eb09f55a6baa1113ca22","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Contact worker: close the no-timer bot bypass, 400 on non-object JSON, add tests\n\nA post without elapsed_ms skipped the too-fast check (NaN < 3000 is false);\nthe site's form always sends it, so only bots posting directly are affected.\nA JSON body of null crashed with a 500. New local test suite (wrangler dev\n--local, throwaway D1, simulated mail to a .invalid address): 10 tests,\nwhich fail on the old code exactly where these bugs were.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-06T17:25:13Z","url":"https://github.com/room302studio/room302studio/commit/49f43a1904c73531c252b8da55b4724ba13a8201","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #51 from room302studio/fix-light-mode-grey\n\nFix light mode: whole page was faded to 18% opacity","occurredAt":"2026-10-05T17:11:44Z","url":"https://github.com/room302studio/room302studio/commit/c5d7c9577b7201c27b69452f70765d11eec0750f","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Fix light mode: the whole page was faded to 18% opacity\n\n`:global(:root.light) .hero-bg video { opacity: .18 }` in scoped CSS:\nVue drops everything after a :global(...), so it compiled to\n`:root.light { opacity: .18 }` and greyed out the entire site for anyone\nin light mode. Put the whole selector inside :global(), and invert the\nclip in light mode so it reads as a pale texture instead of a grey smudge.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-05T17:11:32Z","url":"https://github.com/room302studio/room302studio/commit/85dd3ef60f3eaa254114b08953ede078fbc6e402","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #50 from room302studio/lead-fallback-room302\n\nContact leads: fall back to ejfox@room302.studio","occurredAt":"2026-10-05T16:40:45Z","url":"https://github.com/room302studio/room302studio/commit/cedb21fc32fe0d17eafa51bd69b76589f60733d5","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Contact leads: fall back to ejfox@room302.studio until studio@ verifies\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-05T16:40:34Z","url":"https://github.com/room302studio/room302studio/commit/728c36d94c376b0a509583aafc1a1089778160e2","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Merge pull request #49 from room302studio/lead-recipients\n\nContact leads → studio@room302.studio","occurredAt":"2026-10-05T16:37:02Z","url":"https://github.com/room302studio/room302studio/commit/cc3519f2396ced8f4b4eaecac6c64c147fa65784","type":"other"},{"repository":{"name":"room302studio","url":"https://github.com/room302studio/room302studio"},"message":"Contact leads go to studio@ (Google group); ejfox+artie is a fallback\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-05T16:36:51Z","url":"https://github.com/room302studio/room302studio/commit/f255b61f1d8e5b6a7edb3b4527be5f066f97906b","type":"other"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"contrast fixes: preview every exported palette, keep the hue when fixing\n\n- The warning previewed fixes for one palette only (light, in \"Export\n  both\") while listing issues from both, so the preview was often empty.\n  It now previews each exported palette, and every issue and fix is\n  labeled dark/light.\n- Auto-fix used to replace any failing color with pure white or black\n  (19:1), wiping out the theme's hues. nudgeToContrast keeps OKLCH hue and\n  chroma and moves only lightness, to the smallest change that clears\n  4.5:1 (e.g. a blue comment becomes a lighter blue at 4.6:1). Black/white\n  stays as the fallback when no lightness reaches the target.\n- Tests for both directions, minimal change, and untouched passing colors.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T15:55:06Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/3dd215ca325c9b9900e3bea6b15ee14106212981","type":"other"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"contrast warning modal: readable fixed chrome instead of the failing theme's colors\n\nThe modal styled its text with the theme being edited (error, comment,\nsuccess), i.e. the very colors that had just failed contrast, at 7-9px,\nso it was unreadable exactly when it appeared. It also borrowed the global\n.btn (width 100%, 8px type), which stacked every button full-width.\n\nNow: fixed OLED-black chrome (#f2f2f2 / #a3a3a3 on #000), 12px minimum,\nseverity shown by inverted vs outlined badges instead of color, its own\ncw-btn class, one solid primary action, no blinking/pulsing, a visible\nfocus ring (found by a Codex second-opinion pass), and an honest empty\nstate when there are no auto-fixes to preview. Theme colors appear only\nin the before/after swatches.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T04:21:26Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/146d005925df3f912e3096f910feb2f2d12e6780","type":"other"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"installer: fix six issues found by a Codex cross-model review\n\n- lazygit LG_CONFIG_FILE is comma-separated; the printed hint and README\n  used a colon, so pasting it pointed lazygit at a nonexistent file\n- never cp onto a symlink or directory destination (cp follows links, so a\n  symlinked theme slot could overwrite the user's real config unbacked)\n- backup names get a -N suffix instead of colliding within one second\n- yazi 26 flavors take preview highlighting from tmtheme.xml; install the\n  matching bat tmTheme there\n- lazygit's ~/Library/Application Support default is macOS-only; use the\n  XDG dir elsewhere\n- browser zips mark install.sh executable (Unix mode 0755)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T02:50:51Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/bf84b9f2ba93bde4ab04af5bc4772b912de00507","type":"other"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"export every vulpes preset for every app; re-scheme yazi/lazygit for current versions\n\n- npm run export:all -> dist-themes/<preset>/<mode>/<app>/ for 12 monthly\n  presets x dark/light x 14 apps, per-preset zips + one all-in-one zip\n- install.sh per preset (and top-level): uses each app's own theme/include\n  dir, never edits main configs, prints the one line to add, backs up\n  anything it replaces, idempotent, refuses an empty HOME, --dry-run\n- pages/downloads.vue: client-side zips (fflate, now a direct dependency)\n- utils/generateTheme.ts: color engine pulled out of useTheme so scripts can\n  run it; useTheme is a thin wrapper (no behavior change)\n- fix: loadPreset wrote preset saturation to a nonexistent field, so the UI\n  rendered every preset at 100%; UI and exports now use the preset's 78-86%\n- yazi exporter -> 26.9 schema: [mgr], [indicator], [mode], [tabs], [pick],\n  help chord/action, url= fallbacks (26.x silently ignores the old keys)\n- lazygit exporter -> 0.66: authorColors/branchColorPatterns inside\n  gui.theme; drop removed branchColors and nonexistent selectedRangeBgColor\n- tweakcc: colorCount 63 (matches tweakcc 4.4.0 exactly)\n\nTests: 91/93 (the 2 failures are pre-existing importer tests).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-05T01:49:40Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/e65d1fefa0ac193773ef8d5d1b135178f61f0716","type":"other"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"Merge remote-tracking branch 'origin/main'","occurredAt":"2026-09-14T13:52:22Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/b539073a1957c511e50774c13857013521f51512","type":"other"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"chore(release): v0.4.0\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015gU6rjTCZufwbtEHJiGTSr","occurredAt":"2026-09-14T13:50:55Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/90c68ba1512303b689b9499aa3d813c559dd357f","type":"chore"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"perf: cut per-drag work so sliders stay responsive\n\nProfiling a live hue drag showed the cost was elsewhere than the color\nmath. Remove the biggest per-tick offenders:\n\n- Delete the URL-sync watcher that rewrote ~120 query params through the\n  history API on every state change (inbound deep-linking still works).\n- CodePreview: stop destroying/rebuilding the CodeMirror editor each tick;\n  swap the theme via a Compartment and debounce it off the drag path\n  (its DOM re-measure was the dominant cost).\n- MapPreview: lazy-init maplibre via IntersectionObserver and debounce\n  restyles so its full style-diff never runs mid-drag; drop the redundant\n  double JSON.parse.\n- useTheme: reuse the computed dark/light variant instead of generating a\n  third palette for `colors`.\n\nMain-thread blocking during a hue sweep drops ~3.4x.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015gU6rjTCZufwbtEHJiGTSr","occurredAt":"2026-09-14T13:49:26Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/39ab95b81144bf410ae32e9cdb5d2776834d249e","type":"perf"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"feat: flatten sidebar/preview nesting and redesign sliders\n\nReduce the \"boxes within boxes\" to a single layer: strip nested\nborders/fills from the sidebar controls, swatch cards, month tiles and\npreview panels so each element reads as one surface.\n\nRedesign both slider systems (sidebar + in-swatch) into an Apple-style,\ndata-vizzy control: thin pill tracks, a precise round white knob with a\nrealistic layered shadow, and signed fills that originate from a center\nzero-tick on bipolar (hue-offset) sliders. Fix the base-hue gradient that\nwas being overridden by the track background.\n\nAdd a plain-language description under every control slider and rename the\ncryptic \"offset ±\" to \"hue spread\" so it's clear what each one does.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015gU6rjTCZufwbtEHJiGTSr","occurredAt":"2026-09-14T13:49:18Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/2ef49133638e5c6f839fd86414aab2a4cbf0c915","type":"feat"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"fix: pin nuxt to 4.1.3 to resolve vue-router RouterView crash\n\nNuxt 4.5 pulls in vue-router 5, whose RouterView leaves the page vnode's\ncomponent.ref.i null, throwing \"null is not an object (evaluating\n'instance.__vrv_devtools = info')\" and blanking the SPA. Pin nuxt to the\nknown-good 4.1.3 (vue-router 4.6.x) and drop the stray yarn.lock so npm's\nlockfile is authoritative.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015gU6rjTCZufwbtEHJiGTSr","occurredAt":"2026-09-14T13:49:10Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/3c3e254f92403187bc68a066ec6fa3dedc6bb4de","type":"fix"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"feat: standalone MapLibre basemap editor at /map\n\nFull-screen interactive map editor for designers with:\n- useMapTheme composable wrapping useTheme for map-specific state\n- Interactive MapLibre map with pan/zoom/rotate and camera readout\n- Color engine: base hue, hue spread, saturation, contrast sliders\n- Per-feature color controls: water, parks, roads, buildings, POIs\n  with clickable swatches opening hue+saturation+hex popover\n- 20 extended color overrides (roads, infrastructure, landuse, POIs, labels)\n  each with native color picker and hex paste input\n- Geometry controls: building height, road width, water outline, boundary width\n- Typography: font family, size scale, halo width/opacity, label density\n- Layer visibility toggles with per-group opacity sliders\n- View angle presets (top-down, 3D, street level)\n- Location presets (10 cities)\n- Export (download JSON, copy JSON, share URL)\n- Fix: hue offset fields now actually work in mapColorAt()\n- Fix: buildings use single flat color instead of random hue spread\n- Vite optimizeDeps.include for maplibre-gl, chroma-js, @vueuse/core\n\nv0.4.0\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>","occurredAt":"2026-04-15T03:28:32Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/1b2b178419cc88c34341277f1c62f0b2dda29cd8","type":"feat"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"fix: remove problematic colors.value refs in Obsidian preview\n\nUse colors directly from template context instead of colors.value\nwhich can be undefined during SSR\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2026-01-03T19:30:27Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/e737487d3c50acacc424b9f92b911ca01ca72147","type":"fix"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"fix: ObsidianPreview undefined colors.value.property\n\nUse colors.value.variable instead which is guaranteed to exist\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2026-01-03T19:25:43Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/c119f6bbb2a165bad38a048f3b4b1b346c0d6f8e","type":"fix"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"feat: add Obsidian theme exporter and preview component\n\n- Export themes to Obsidian CSS format with semantic color mappings\n- Create preview component showing how theme renders in Obsidian vault UI\n- Includes file explorer, editor with syntax highlighting, and properties sidebar\n- Maps palette colors to Obsidian's standard CSS custom properties for consistency\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2026-01-03T18:09:07Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/d117169f88deab2e2f7bdc0caf7f7463c4ed02be","type":"feat"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"feat: add Tailwind CSS exporter\n\nExports theme as CSS custom properties with tailwind.config.js extend snippet and usage examples.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-30T05:23:11Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/7cc38f8914cdfd182bd636ce4b38684b4273bb64","type":"feat"},{"repository":{"name":"vulpes-theme-lab","url":"https://github.com/ejfox/vulpes-theme-lab"},"message":"Update README with live demo and project details\n\nAdded a screenshot and updated project description.","occurredAt":"2025-12-28T22:48:57Z","url":"https://github.com/ejfox/vulpes-theme-lab/commit/5d3372b1ccbd07c64e8b97cbd4a2c19cf76a7334","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Add --ignore and skip .claude/.output by default\n\nAgent worktrees under .claude/worktrees hold full copies of a repo; scanning\nthem inflated Connectology's graph from ~1.9k to ~20.8k duplicate nodes.\n--ignore takes comma-separated directory names on top of the defaults.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-11-02T03:17:28Z","url":"https://github.com/ejfox/code-network-gen/commit/37d2bdeefe59ce48ee138fe7c036491938e7d32c","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Modernize analyzer and clean project layout","occurredAt":"2026-10-04T18:58:56Z","url":"https://github.com/ejfox/code-network-gen/commit/2d0b1285fb54034298c38a34f019072c14872c9b","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Merge pull request #1 from ejfox/copilot/update-codebase-for-2026","occurredAt":"2026-01-11T04:18:56Z","url":"https://github.com/ejfox/code-network-gen/commit/f9a2d1a9705ed88e5cdd9b32da4eb1e75d6ac1fb","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Fix linting warning in catch block\n\nCo-authored-by: ejfox <530073+ejfox@users.noreply.github.com>","occurredAt":"2026-01-11T03:10:12Z","url":"https://github.com/ejfox/code-network-gen/commit/49cd1238e9a1a68d93b4c9ecb31da89b5d870324","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Final updates: sync package-lock.json version and complete 2026 upgrade\n\nCo-authored-by: ejfox <530073+ejfox@users.noreply.github.com>","occurredAt":"2026-01-11T03:09:18Z","url":"https://github.com/ejfox/code-network-gen/commit/32e8df102c65e60d6852a5299f41af36dc74c1d1","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Update index.js\n\nCo-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>","occurredAt":"2026-01-11T03:08:40Z","url":"https://github.com/ejfox/code-network-gen/commit/5e6ff8533a6ac2de69ad22df5eb42447e3bc0a12","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Upgrade dependencies and fix all linting errors for 2026\n\nCo-authored-by: ejfox <530073+ejfox@users.noreply.github.com>","occurredAt":"2026-01-11T03:04:39Z","url":"https://github.com/ejfox/code-network-gen/commit/07c858221f18a80c126363ff705bfde2b42b0ba4","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Initial assessment - preparing upgrade plan for 2026\n\nCo-authored-by: ejfox <530073+ejfox@users.noreply.github.com>","occurredAt":"2026-01-11T02:59:41Z","url":"https://github.com/ejfox/code-network-gen/commit/21f06bdbb2791a7d5002b0d82ecfa5567d3d457d","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"Initial plan","occurredAt":"2026-01-11T02:56:08Z","url":"https://github.com/ejfox/code-network-gen/commit/733098386beaa1c1f2b7f4d09a70883e5494f165","type":"other"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"docs: update README to reflect real import/require tracking\n\n- Clarified that --include-deps parses actual import statements\n- Updated example to show real edge format: data.js:global -> package.json:axios (imports)\n- Removed misleading 'adds all dependencies' language\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-07-24T22:41:25Z","url":"https://github.com/ejfox/code-network-gen/commit/b51aff503dffe7608ec4fcbe5cdbcba7cddf0a0a","type":"docs"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"feat: parse actual import/require statements for real dependency tracking\n\n- Parse ES6 imports and require() calls from AST during code analysis\n- Show real file-to-dependency relationships instead of fake package.json globals\n- Example: data.js:global -> package.json:@supabase/supabase-js (imports)\n- Super efficient: only tracks dependencies that exist in package.json\n- Works with both import statements and require() calls\n\nNow --include-deps shows actual code-to-dependency usage patterns\\!\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-07-24T22:38:11Z","url":"https://github.com/ejfox/code-network-gen/commit/503666ad7a26a1087c2db91f46334cdc59bf1f26","type":"feat"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"feat: add --include-deps flag for package.json dependency analysis\n\n- New --include-deps flag includes all dependencies and devDependencies\n- Dependencies shown as orange nodes with 'requires' edge type\n- Added dependency styling to mermaid diagrams with amber colors\n- Updated CLI help and README documentation\n- Package.json dependencies integrated seamlessly with code structure\n\nPerfect for understanding full project ecosystem including external deps.\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-07-24T22:34:47Z","url":"https://github.com/ejfox/code-network-gen/commit/d0b24a8da2b406dbd8a23a11e6f61b04045af691","type":"feat"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"docs: add mermaid diagram to README example\n\n- Added interactive mermaid flowchart that renders on GitHub\n- Shows visual architecture of the example CLI app\n- Demonstrates color-coded function types and module boundaries\n- Perfect for showcasing the tool's visual output capabilities\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-07-24T22:32:35Z","url":"https://github.com/ejfox/code-network-gen/commit/c8162c23c1a0e3928b02b05e10ef4925c4e94b55","type":"docs"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"docs: add concrete example output to README\n\n- Added real-world example showing nodes.csv and edges.csv output\n- Shows analysis of CLI app with 12 functions across 4 files\n- Demonstrates clear architectural patterns (data/ui/main separation)\n- Makes the tool's output more tangible for new users\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-07-24T22:31:23Z","url":"https://github.com/ejfox/code-network-gen/commit/f03f2d65cb0aa295161bd3f9d32043880fca9ea0","type":"docs"},{"repository":{"name":"code-network-gen","url":"https://github.com/ejfox/code-network-gen"},"message":"docs: update README with npx usage and version bump to 0.0.3\n\n- Updated all command examples to use npx code-network-gen\n- Added fallback node index.js usage for local development\n- Bumped version from 0.0.2 to 0.0.3\n- Verified all export formats working correctly\n- Comprehensive testing completed on multiple codebases\n\n🤖 Generated with [Claude Code](https://claude.ai/code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-07-24T22:24:43Z","url":"https://github.com/ejfox/code-network-gen/commit/50459d1e2c3c7cdeab1efefc31f21904967275c2","type":"docs"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"Add scrap search --semantic, querying the private local scrapindex on computah\n\nNew searchSemantic() in database.js calls scrapindex's hybrid FTS+embedding API\n(SCRAPINDEX_URL, default http://100.106.221.70:8095/search) and normalizes results\nto the same shape the existing JSON/TSV/CSV formatters already expect. index.mjs\nwires --semantic / --source / --limit onto the existing search command and adds a\nhuman-readable formatter for results that have no created_at. Default (non-semantic,\nSupabase ILIKE) search behavior is unchanged. If the PC is unreachable, prints a\none-line error instead of attempting to wake it.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T18:11:15Z","url":"https://github.com/ejfox/scrapbook-cli/commit/24c2e35301074e39ad14c63ed88f4295356dcf4f","type":"other"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"fix: Improve ticker filtering to exclude non-financial assets\n\n- Filter out obvious non-tickers (UNKNOWN, N/A, OTHER)\n- Exclude brand names that aren't public tickers (GLOCK, REMINGTON, ANDURIL)\n- Exclude government programs/jargon (Medicaid, Medicare, etc)\n- Enforce standard ticker format: 1-5 alphanumeric characters\n- Reduced false positives from 49 to 25 real tickers\n\nNow shows only legitimate financial assets, forex, and commodities with actual sentiment data.","occurredAt":"2025-12-16T00:55:53Z","url":"https://github.com/ejfox/scrapbook-cli/commit/dff23dd4582438dccf4c3de5c1439a2febed5bea","type":"fix"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"feat: Add financial asset tracking with ticker extraction and sentiment analysis\n\n- Add queryFinancialAssets() function to database.js with pagination support\n- Implement 'scrap financial' command with filtering by ticker, sentiment range\n- Support multiple output formats: human-readable, --json, --jsonl, --csv, --tsv\n- Display aggregate sentiment scores and mention counts for each asset\n- Include asset type (stock, crypto, forex, private_company, etc.)\n- Show latest articles mentioning each asset\n- Add 11 financial analysis piping recipes to README\n- Documentation includes examples and use cases for portfolio tracking\n\nFixes issue where financial analysis data was available but not accessible via CLI.\nLoads all scraps (with pagination) for comprehensive financial asset discovery.","occurredAt":"2025-12-16T00:53:48Z","url":"https://github.com/ejfox/scrapbook-cli/commit/d3095e470c65baeb184e6714ec78c2d240b2913c","type":"feat"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"fix: Add safeguards to prevent timeout on massive entity networks\n\nProblem: Querying highly-connected entities (like \"Elon\") at depth 2+ caused\ndatabase timeouts due to exponential growth of entities and scraps.\n\nSolution:\n- Add maxScraps parameter (default 5000) to limit query scope\n- Add early termination when scraps > maxScraps\n- Add entity explosion check (stop at 10k entities)\n- Add --limit flag to entity command for user control\n- All safeguards are non-destructive and just truncate results\n\nResults:\n- \"scrap entity Elon --depth 3\" now completes in ~32s instead of timeout\n- \"scrap entity AI --depth 3 --limit 500\" caps at 608 scraps\n- Backward compatible: default 5000 limit works for normal use\n- Users can adjust with --limit for custom queries\n\nExamples:\n  scrap entity \"Elon\" --depth 2 --limit 2000\n  scrap entity \"AI\" --depth 3 --limit 1000\n  scrap entity \"OpenAI\" --depth 2 --limit 10000\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-16T00:37:01Z","url":"https://github.com/ejfox/scrapbook-cli/commit/078b3491df52458e2ba687a9e618e30ff88b1de7","type":"fix"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"feat: Add depth-based relationship network traversal\n\n- New queryByEntityWithDepth function explores N hops from an entity\n- BFS algorithm finds all connected entities and scraps at each depth level\n- Returns enhanced graph data with depth info for each entity\n- Add --depth flag to entity command (default: 1 for backward compatibility)\n- Supports all output formats: --json, --graph, --connections\n- Example usage:\n  scrap entity \"OpenAI\" --depth 2 --json | jq '.entities'\n  scrap entity \"Claude\" --depth 3 --graph\n  scrap entity \"Tesla\" --depth 2 | llm \"Analyze relationships\"\n\nPerfect for discovering multi-hop connections and piping to external tools.\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-16T00:30:55Z","url":"https://github.com/ejfox/scrapbook-cli/commit/345aa85a814161398eaf7e836a281faaf0f9a698","type":"feat"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"Remove tips.txt - will redo properly","occurredAt":"2025-12-16T00:12:38Z","url":"https://github.com/ejfox/scrapbook-cli/commit/a253007b37492daa76e330efef7fd70b7aeb4cbb","type":"other"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"docs: Reformat tips.txt to match documentation style\n\n- Use proper markdown sections and code blocks\n- Add descriptions for each workflow\n- Consistent with CLI-EXAMPLES.md and other docs\n- Better visual organization and readability\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-16T00:11:56Z","url":"https://github.com/ejfox/scrapbook-cli/commit/3fd2482403ac1d1a8de2cd5a2ac20ebc915d83fa","type":"docs"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"docs: Add tips.txt with quick reference recipes\n\nShort, pithy tips for common workflows:\n- Quick searches and fuzzy finding\n- Extract URLs, titles, random results\n- Count and analyze data\n- Tag analysis and sorting\n- Entity queries\n- Export formats\n- LLM piping examples\n- Dev mode setup\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-16T00:10:10Z","url":"https://github.com/ejfox/scrapbook-cli/commit/dd93dcf2d710b3b2f7f9d3d1726c5c8eb7a1ddcb","type":"docs"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"docs: Clean up piping recipes, keep only tested ones + add LLM-ready section\n\n- Remove broken/untested recipes (TSV parsing, complex jq with != operators, etc)\n- Keep only recipes that are verified working\n- Add \"LLM-Ready Output\" section showing how to pipe to external LLM CLI tools\n- Simplify to core Unix philosophy: scrap outputs data, external tools analyze\n- Examples for: summarization, analysis, tagging, theme extraction, comparison\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-16T00:09:50Z","url":"https://github.com/ejfox/scrapbook-cli/commit/4b0b257b07d3135a0b904d78d714c793ff645193","type":"docs"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"feat: Add human-readable CLI output and comprehensive piping documentation\n\n- Add beautiful human-readable default formatting for search/list commands\n  - Date, type icon, title, summary, and URL on separate lines\n  - Result count at end\n- Add --fzf format option for seamless fzf integration\n- Maintain all existing formats: --json, --jsonl, --tsv, --csv\n- Update README with:\n  - Clear examples of default human-readable output\n  - All output format options documented\n  - 60+ piping recipes covering:\n    - jq JSON queries and filtering\n    - fzf interactive selection\n    - TSV/CSV parsing with awk, cut, sed\n    - Search and chain operations\n    - Bulk export operations\n    - Integration with llm, curl, graphviz\n    - Data migration to Roam, Logseq, JSON Feed\n  - Dev setup instructions (npm link, alias)\n\nThis makes scrapbook-cli a true Unix citizen for data pipelines and automation.\n\n🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-16T00:01:17Z","url":"https://github.com/ejfox/scrapbook-cli/commit/0841c7e4751a2a3bbbebaf868fc7ce90e43aa91b","type":"feat"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"docs: update CHANGELOG for v3.0.0 release\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-12T16:16:46Z","url":"https://github.com/ejfox/scrapbook-cli/commit/d26ff45f4df8722748e93d8c043372a8f785f67f","type":"docs"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"chore: bump version to 3.0.0\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-12T16:13:43Z","url":"https://github.com/ejfox/scrapbook-cli/commit/554635801bc5dcc4e5edf76c265437f2cbe706e4","type":"chore"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"fix: Sync with scrapbook-core schema changes\n\n- Update selectFields to include all current DB columns\n- Simplify location handling (now plain string, not JSON)\n- Simplify map-view coords (use top-level lat/lng fields)\n- Add shared formatForFzf utility to eliminate duplicate code\n- Add type field display alongside content_type\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>","occurredAt":"2025-12-08T00:18:18Z","url":"https://github.com/ejfox/scrapbook-cli/commit/85b956c79a5fbeed1286f4eaeae4f57d47607fc3","type":"fix"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"fix: upgrade YouTube enrichment to Claude Haiku API with timeout protection\n\nReplaced llm CLI (Gemini) with direct Anthropic SDK for faster, more reliable enrichment:\n- Use Claude 3.5 Haiku via @anthropic-ai/sdk for blazing fast summaries\n- Add 30-second timeout to caption fetching to prevent hanging on bad URLs\n- Increase transcript context from 4k to 8k chars with faster API\n- Successfully enriched 29 videos in first batch test\n\nThis hybrid approach (yt-dlp for captions + Claude API for summaries) is 100x faster\nthan the previous llm CLI approach and doesn't hang on channel pages or invalid URLs.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-12-03T21:17:34Z","url":"https://github.com/ejfox/scrapbook-cli/commit/642aad6067ec28d79b95b2a12dce124df0f4d560","type":"fix"},{"repository":{"name":"scrapbook-cli","url":"https://github.com/ejfox/scrapbook-cli"},"message":"fix: switch YouTube enrichment to use Gemini 2.5 Flash for speed/cost\n\n- Changed from GPT-4o-mini to Gemini 2.5 Flash\n- Reduced transcript size to 4000 chars for faster processing\n- Installed llm-gemini plugin\n\nEnrichment now running with cheaper/faster model. Processing 368 imported videos in background.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>","occurredAt":"2025-12-03T19:57:55Z","url":"https://github.com/ejfox/scrapbook-cli/commit/d19dfbfb849b89662f8d9b453320a8ecbc232aa5","type":"fix"},{"repository":{"name":"academic.css","url":"https://github.com/ejfox/academic.css"},"message":"academic.css v1.0.0: plain-HTML design system (from room302studio, generalized)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","occurredAt":"2026-10-21T18:23:19Z","url":"https://github.com/ejfox/academic.css/commit/01404e8ecd3a7795b62dcffebfa6ae317846d6a6","type":"other"}],"commitTypes":[{"type":"other","count":100,"percentage":73.52941176470588},{"type":"fix","count":10,"percentage":7.352941176470589},{"type":"docs","count":10,"percentage":7.352941176470589},{"type":"feat","count":9,"percentage":6.61764705882353},{"type":"ci","count":2,"percentage":1.4705882352941175},{"type":"chore","count":2,"percentage":1.4705882352941175},{"type":"style","count":1,"percentage":0.7352941176470588},{"type":"test","count":1,"percentage":0.7352941176470588},{"type":"perf","count":1,"percentage":0.7352941176470588}]}},"_links":{"self":"https://ejfox.com/github/ai-art-coach.json","html":"https://ejfox.com/github/ai-art-coach","gists":"/gists.json"}}