pocket-sized atproto pitch waow.tech
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

add digest command and update monthly digest

- add .claude/commands/digest.md for portable digest generation
- update index.html with complete dec-jan digest in collapsible details
- added: follower-weight, zql, hello-tinker, atproto, marvin
- uses <details> for unobtrusive display

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

zzstoatzz c18eb0b9 cef7bfa7

+119 -44
+66
.claude/commands/digest.md
··· 1 + --- 2 + description: generate a digest of work shipped over the last month 3 + allowed-tools: Bash(git:*), Bash(ls:*), Bash(gh:*), Bash(find:*), Bash(stat:*), Read, Glob, Grep, Task 4 + --- 5 + 6 + generate a comprehensive digest of what i've shipped over the last month. 7 + 8 + ## step 1: detect identity 9 + 10 + determine who the user is by running these commands: 11 + - `git config user.email` - primary identifier for commit authorship 12 + - `git config user.name` - display name 13 + - `gh api user --jq .login 2>/dev/null` - github username (skip if gh unavailable) 14 + 15 + ## step 2: detect source directories 16 + 17 + check for these directory structures and skip any that don't exist: 18 + 19 + **github repos**: `~/github.com/{username}` where username matches the gh login or can be inferred from directory contents 20 + 21 + **tangled repos**: `~/tangled.sh/@{handle}` - look for directories matching `@*` pattern 22 + 23 + **gitlab repos**: `~/gitlab.com/{username}` (if exists) 24 + 25 + for each provider, only proceed if the base directory exists (e.g., `~/github.com`). 26 + 27 + ## step 3: find recently modified repos 28 + 29 + for each detected source directory: 30 + 1. list subdirectories and check modification times 31 + 2. for repos modified in the last 30 days, run: `git log --oneline --author="<email>" --since="1 month ago" | head -20` 32 + 3. skip repos with no commits from this user in the time period 33 + 34 + also check for work contributions in common locations: 35 + - employer repos (other directories under ~/github.com that aren't the user's username) 36 + - look for repos where the user has commits but doesn't own the repo 37 + 38 + ## step 4: gather project metadata 39 + 40 + for each active repo, try to determine: 41 + - **what it is**: read README.md first paragraph or pyproject.toml description 42 + - **live url**: check for fly.toml (app name -> {app}.fly.dev), wrangler.toml, vercel.json, or CNAME files 43 + - **package name**: check pyproject.toml `[project] name` for installable packages 44 + 45 + ## step 5: generate digest 46 + 47 + organize the output as markdown: 48 + 49 + ``` 50 + ## shipped this month 51 + 52 + ### projects 53 + | project | description | link | 54 + |---------|-------------|------| 55 + | ... | ... | ... | 56 + 57 + ### contributions 58 + notable commits to other projects (employer, open source, etc.) 59 + 60 + ### themes 61 + - common patterns or focus areas this month 62 + ``` 63 + 64 + include valid links wherever possible - deployed URLs, github repos, pypi packages. 65 + 66 + format should be suitable for embedding in a personal site or sharing as a status update.
+53 -44
index.html
··· 17 17 h1 a:hover { text-decoration: underline; } 18 18 nav { margin: 1rem 0; } 19 19 nav a { margin-right: 1rem; } 20 - h2 { margin-top: 2rem; border-bottom: 1px solid #ddd; padding-bottom: 0.5rem; } 21 - h3 { margin-top: 1.5rem; color: #444; } 22 - table { width: 100%; border-collapse: collapse; margin: 1rem 0; font-size: 0.9rem; } 23 - th, td { text-align: left; padding: 0.5rem; border-bottom: 1px solid #eee; } 20 + details { margin-top: 2rem; } 21 + summary { cursor: pointer; font-weight: 600; color: #444; } 22 + summary:hover { color: #000; } 23 + h3 { margin-top: 1.5rem; color: #444; font-size: 0.95rem; } 24 + table { width: 100%; border-collapse: collapse; margin: 1rem 0; font-size: 0.85rem; } 25 + th, td { text-align: left; padding: 0.4rem; border-bottom: 1px solid #eee; } 24 26 th { font-weight: 600; } 25 27 a { color: #0066cc; } 26 - .date { color: #666; font-size: 0.9rem; } 27 - ul { padding-left: 1.5rem; } 28 + code { background: #f5f5f5; padding: 0.1rem 0.3rem; border-radius: 3px; font-size: 0.85rem; } 29 + .date { color: #666; font-size: 0.85rem; margin-left: 0.5rem; font-weight: normal; } 30 + ul { padding-left: 1.5rem; font-size: 0.9rem; } 28 31 li { margin: 0.25rem 0; } 29 32 </style> 30 33 </head> ··· 38 41 <a href="https://plyr.fm" target="_blank">listen</a> 39 42 </nav> 40 43 41 - <h2>shipped this month</h2> 42 - <p class="date">dec 2025 - jan 2026</p> 44 + <details> 45 + <summary>shipped this month<span class="date">dec 2025 - jan 2026</span></summary> 43 46 44 - <h3>at protocol apps</h3> 45 - <table> 46 - <tr><th>project</th><th>what it is</th><th>link</th></tr> 47 - <tr><td>plyr.fm</td><td>music streaming platform</td><td><a href="https://plyr.fm">plyr.fm</a></td></tr> 48 - <tr><td>ooo.audio</td><td>audio social platform</td><td><a href="https://ooo.audio">ooo.audio</a></td></tr> 49 - <tr><td>pollz</td><td>polls on atproto</td><td><a href="https://pollz.waow.tech">pollz.waow.tech</a></td></tr> 50 - <tr><td>at-me</td><td>identity &amp; apps visualizer</td><td><a href="https://at-me.zzstoatzz.io">at-me.zzstoatzz.io</a></td></tr> 51 - <tr><td>status</td><td>slack-like status updates</td><td><a href="https://status.zzstoatzz.io">status.zzstoatzz.io</a></td></tr> 52 - <tr><td>find-bufo</td><td>semantic image search</td><td><a href="https://find-bufo.com">find-bufo.com</a></td></tr> 53 - <tr><td>find-bufo/bot</td><td>zig bot for jetstream quote-posts</td><td><a href="https://bsky.app/profile/find-bufo.com">@find-bufo.com</a></td></tr> 54 - <tr><td>leaflet-search</td><td>newsletter search engine</td><td><a href="https://leaflet-search.pages.dev">leaflet-search.pages.dev</a></td></tr> 55 - <tr><td>bsky-alt-text</td><td>claude-powered alt text</td><td><a href="https://alt-text-generator.fly.dev">alt-text-generator.fly.dev</a></td></tr> 56 - <tr><td>music-atmosphere-feed</td><td>music link feeds (zig)</td><td><a href="https://zig-bsky-feed.fly.dev">zig-bsky-feed.fly.dev</a></td></tr> 57 - </table> 47 + <h3>at protocol apps</h3> 48 + <table> 49 + <tr><th>project</th><th>what it is</th><th>link</th></tr> 50 + <tr><td>plyr.fm</td><td>music streaming platform</td><td><a href="https://plyr.fm">plyr.fm</a></td></tr> 51 + <tr><td>ooo.audio</td><td>audio social platform</td><td><a href="https://ooo.audio">ooo.audio</a></td></tr> 52 + <tr><td>music-atmosphere-feed</td><td>bluesky feeds for music links</td><td><a href="https://zig-bsky-feed.fly.dev">zig-bsky-feed.fly.dev</a></td></tr> 53 + <tr><td>leaflet-search</td><td>semantic + keyword search</td><td><a href="https://leaflet-search.pages.dev">leaflet-search.pages.dev</a></td></tr> 54 + <tr><td>find-bufo</td><td>hybrid search for bufo zone</td><td><a href="https://find-bufo.com">find-bufo.com</a></td></tr> 55 + <tr><td>find-bufo/bot</td><td>zig jetstream quote-poster</td><td><a href="https://bsky.app/profile/find-bufo.com">@find-bufo.com</a></td></tr> 56 + <tr><td>at-me</td><td>identity &amp; apps visualizer</td><td><a href="https://at-me.zzstoatzz.io">at-me.zzstoatzz.io</a></td></tr> 57 + <tr><td>status</td><td>slack-like status updates</td><td><a href="https://status.zzstoatzz.io">status.zzstoatzz.io</a></td></tr> 58 + <tr><td>pollz</td><td>polls on atproto</td><td><a href="https://pollz.waow.tech">pollz.waow.tech</a></td></tr> 59 + <tr><td>bsky-alt-text</td><td>claude-powered alt text</td><td><a href="https://alt-text-generator.fly.dev">alt-text-generator.fly.dev</a></td></tr> 60 + <tr><td>follower-weight</td><td>bluesky follower analysis</td><td><a href="https://follower-weight.fly.dev">follower-weight.fly.dev</a></td></tr> 61 + </table> 58 62 59 - <h3>developer tools</h3> 60 - <table> 61 - <tr><th>project</th><th>what it is</th><th>link</th></tr> 62 - <tr><td>pdsx</td><td>mcp server for atproto</td><td><a href="https://github.com/zzstoatzz/pdsx">github</a> &#183; <code>uvx pdsx</code></td></tr> 63 - <tr><td>plyr-python-client</td><td>sdk + cli + mcp for plyr.fm</td><td><a href="https://github.com/zzstoatzz/plyr-python-client">github</a> &#183; <code>uvx plyrfm</code></td></tr> 64 - <tr><td>pmgfal</td><td>pydantic model gen for lexicons</td><td><a href="https://github.com/zzstoatzz/pmgfal">github</a> &#183; <a href="https://pypi.org/project/pmgfal/">pypi</a></td></tr> 65 - <tr><td>mdxify</td><td>api docs generator</td><td><a href="https://github.com/zzstoatzz/mdxify">github</a></td></tr> 66 - </table> 63 + <h3>developer tools</h3> 64 + <table> 65 + <tr><th>project</th><th>what it is</th><th>link</th></tr> 66 + <tr><td>pdsx</td><td>mcp server for atproto</td><td><a href="https://github.com/zzstoatzz/pdsx">github</a> &#183; <code>uvx pdsx</code></td></tr> 67 + <tr><td>plyr-python-client</td><td>sdk + cli + mcp for plyr.fm</td><td><a href="https://github.com/zzstoatzz/plyr-python-client">github</a> &#183; <code>uvx plyrfm</code></td></tr> 68 + <tr><td>pmgfal</td><td>pydantic model gen for lexicons</td><td><a href="https://github.com/zzstoatzz/pmgfal">github</a> &#183; <a href="https://pypi.org/project/pmgfal/">pypi</a></td></tr> 69 + <tr><td>mdxify</td><td>api docs generator</td><td><a href="https://github.com/zzstoatzz/mdxify">github</a></td></tr> 70 + <tr><td>zql</td><td>comptime sql bindings for zig</td><td><a href="https://tangled.sh/@zzstoatzz.io/zql">tangled</a></td></tr> 71 + <tr><td>hello-tinker</td><td>chat cli for tinker llms</td><td><a href="https://github.com/zzstoatzz/hello-tinker">github</a></td></tr> 72 + <tr><td>atproto</td><td>oauth fixes for python sdk</td><td><a href="https://github.com/zzstoatzz/atproto">github</a></td></tr> 73 + </table> 67 74 68 - <h3>prefect (day job)</h3> 69 - <table> 70 - <tr><th>project</th><th>what it is</th><th>link</th></tr> 71 - <tr><td>prefect-mcp-server</td><td>mcp server for prefect</td><td><a href="https://github.com/PrefectHQ/prefect-mcp-server">github</a></td></tr> 72 - <tr><td>prefect core</td><td>docket migration, json schema, fixes</td><td><a href="https://github.com/PrefectHQ/prefect">github</a></td></tr> 73 - </table> 75 + <h3>prefect (day job)</h3> 76 + <table> 77 + <tr><th>project</th><th>what it is</th><th>link</th></tr> 78 + <tr><td>prefect-mcp-server</td><td>mcp server + claude code plugin</td><td><a href="https://github.com/PrefectHQ/prefect-mcp-server">github</a></td></tr> 79 + <tr><td>prefect core</td><td>docket migration, dagster guide</td><td><a href="https://github.com/PrefectHQ/prefect">github</a></td></tr> 80 + <tr><td>marvin</td><td>slackbot memory with letta</td><td><a href="https://github.com/PrefectHQ/marvin">github</a></td></tr> 81 + </table> 74 82 75 - <h3>themes</h3> 76 - <ul> 77 - <li>mcp servers everywhere - pdsx, plyrfm-mcp, prefect-mcp-server all ship as claude code plugins</li> 78 - <li>zig backends - music-atmosphere-feed, leaflet-search, pollz, find-bufo/bot</li> 79 - <li>rust services - find-bufo search, pmgfal (pyo3), plyr.fm transcoder</li> 80 - <li>shared audio lexicon - coordination between plyr.fm and ooo.audio</li> 81 - <li>docket adoption - converted 7 prefect services to perpetual functions</li> 82 - </ul> 83 + <h3>themes</h3> 84 + <ul> 85 + <li>mcp servers everywhere - pdsx, plyrfm-mcp, prefect-mcp-server</li> 86 + <li>zig backends - music-atmosphere-feed, leaflet-search, pollz, find-bufo/bot, zql</li> 87 + <li>rust services - find-bufo search, pmgfal (pyo3), plyr.fm transcoder</li> 88 + <li>shared audio lexicon - plyr.fm + ooo.audio coordination</li> 89 + <li>docket adoption - converted 7 prefect services to perpetual functions</li> 90 + </ul> 91 + </details> 83 92 </body> 84 93 </html>