feat(gtm): graph-based go-to-market toolkit (the Figma playbook) - #401
feat(gtm): graph-based go-to-market toolkit (the Figma playbook)#401NotASithLord wants to merge 2 commits into
Conversation
Port the Figma launch playbook (map the community's network graph, find
the influential nodes, reach out to each one personally) to peerd, with
2026 data sources: Twitter's graph is closed now, so the crawl maps
GitHub stars/follows, the Bluesky follow graph (public AppView), and HN
topic engagement instead.
- gtm/lib/graph.ts: pure core (no IO): weighted directed PageRank,
sampled Brandes betweenness, deterministic label-propagation
communities, GEXF (Gephi) + CSV export
- gtm/lib/rank.ts: percentile-blended outreach score plus a Markdown
worksheet with per-community coverage
- gtm/collect/{github,bluesky,hn}.ts: rate-limit-aware collectors;
follow edges are kept in-community only, so 300 followers inside the
graph beat 100k generic ones
- gtm/seeds.ts: seed repos/actors/queries spanning peerd's four adjacent
communities (browser agents, local inference, local-first, dweb/p2p)
- gtm/run.ts: collect (cached per source, resumable) and analyze CLI;
`bun run gtm`
- gtm/README.md: the strategy, run instructions, and outreach etiquette
- tests/gtm/graph.test.ts: fixture-graph coverage for the pure core,
which also pulls it into the strict typecheck
Crawl caches and outputs (gtm/data, gtm/out) are gitignored: they hold
other people's social edges and stay local. Nothing here ships in the
extension.
Visual regression✅ No visual drift. Every state renders identically to the committed baselines. 📸 Browse the visual gallery — 62 baseline screens (light + dark) as of this commit. |
The edge-key template held a raw NUL byte, which makes git treat
gtm/lib/graph.ts as binary (check:hygiene); write it as a unicode escape
sequence instead. In run.ts, replace existsSync probes with
attempt-then-handle: the cache write is exclusive ('wx') unless --fresh,
so a cache file appearing between the probe and the write is kept rather
than clobbered (CodeQL js/file-system-race), and a missing data dir
reads as an empty collection.
|
CI status as of
Generated by Claude Code |
|
One more CI note: Generated by Claude Code |
What & why
Ports Dylan Field's pre-launch Figma playbook (scrape the community, build the network graph, find the influential nodes in Gephi, reach out to every one personally) to peerd as a runnable
gtm/toolkit: collectors for GitHub stars/follows, the Bluesky follow graph (public AppView API), and HN topic engagement; a pure scoring core (weighted PageRank, sampled Brandes betweenness, deterministic community detection); and exports to Gephi GEXF, CSV, and a ranked outreach worksheet.gtm/README.mdcarries the adapted strategy and outreach etiquette. Twitter/X is deliberately not a source (paywalled API, ToS-hostile scraping); the crawl uses public, ToS-clean APIs only.Closes #
Checklist
bun test,bun run typecheck, lint,check:copy,check:docpaths,check:hygiene,check:invariantspass locally (full preflight not runnable in this sandbox; nothing here touches the extension, manifests, or packaging)tests/gtm/graph.test.ts— fixture-graph coverage of the pure core, which also pulls it into the strict typecheck)manifest.json,shared/channel-config.js)gtm/is a Bun-run analyst toolkit (same posture aspackaging//scripts/); nothing ships in the extensionNotes for reviewers
check:copycommit-metadata rule will flag this commit because this remote environment pins the git author identity, which the rule rejects, and rewriting the author to your identity was out of bounds for the agent. To clear it:git rebase -i/git commit --amend --reset-authorlocally with your identity (or squash-merge if the gate permits it).gtm/data/,gtm/out/) are gitignored on purpose: they contain other people's handles and social edges — collected for a one-time private analysis, never published.gtm/seeds.tsis meant to be edited — seed choice IS the strategy. The defaults span browser agents, local inference, local-first, and dweb/p2p; prune/extend before a real run.export GITHUB_TOKEN=… && bun run gtm all.🤖 Generated with Claude Code
https://claude.ai/code/session_01D1cGPZgGqT3sdDTEyL1PJZ
Generated by Claude Code