# punch who's pushing on [tangled.org](https://tangled.org) — push-count leaderboard across every knot. one row per `committerDid`, ranked by `sh.tangled.git.refUpdate` events. **[sites.wisp.place/zzstoatzz.io/punch](https://sites.wisp.place/zzstoatzz.io/punch/)** ## stack ``` relay.waow.tech (listReposByCollection) ↓ knot /events (WS, per-host) ↓ CF Worker (*/10 min cron) → D1 (cursors, pushes) + KV (handles) ↓ place.wisp.fs record on pds.zzstoatzz.io → sites.wisp.place ``` - **indexer**: [Cloudflare Workers](https://workers.cloudflare.com) + D1 + KV - **site**: [wisp.place](https://wisp.place) (atproto static hosting) - **handles**: [typeahead.waow.tech](https://typeahead.waow.tech) + bsky AppView + plc.directory ## dev ```sh bun install && bun run dev # static site at :4747 cd worker && bun install wrangler dev # worker; GET /__run fires one cycle wrangler deploy wrangler tail ``` secrets: `PUNCH_HANDLE`, `PUNCH_APP_PASSWORD` (atproto app password for the wisp-publishing account). ## publish the worker only rewrites `leaderboard.json` in the wisp manifest each tick. html/css/js changes ship with a manual wispctl: ```sh wispctl deploy zzstoatzz.io --path public --site punch --password "$PUNCH_APP_PASSWORD" --yes ```
why pushes, not commits tangled's own PUNCHCARD filters `meta.commitCount.byEmail[]` by the committer's private verified-emails table (`core/appview/state/knotstream.go:219` in tangled). without that table we'd massively overcount merges/rebases. one refUpdate = one push is the cleanest metric we can compute from public firehose data — and it surfaces accounts tangled's counter hides (e.g. prolific pushers who haven't run email verification).