Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guides discovery and development with Holepunch ecosystem libraries. Use when working with P2P stack (Hypercore, Hyperswarm, Autobase, Hyperdb, Corestore), Bare runtime (bare-* modules like bare-fs), or Pear app framework (pear-* modules). Teaches on-the-fly API discovery via docs.pears.com and gh CLI.
.claude/skills/tetherto-qv-holepunch-dev/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 134% | 0% |
Ecosystem navigator for Holepunch/Bare/Pear development. Teaches the agent to discover APIs on-the-fly rather than carrying static knowledge dumps.
https://docs.pears.com is the curated, always-current index for the entire ecosystem. Prefer it over any static list in this skill. Relevant anchors:
#p2p-modules — Building-block libraries (hypercore, hyperbee, hyperdrive, autobase, hyperdht, hyperswarm) and helpers (corestore, localdrive, mirror-drive, secret-stream, compact-encoding, protomux).#bare-modules — All bare-* runtime modules with stability indicators and platform support. Most are Node.js standard-library equivalents (bare-fs ≈ fs, bare-crypto ≈ crypto, bare-tcp ≈ net, bare-subprocess ≈ child_process). Node.js-compat shims live in bare-node.#pear-modules — pear-* modules grouped by role (Application, UI, Common, Developer, Integration). Largest surface: pear-electron (100+ methods for desktop UI — fetch its README). Lifecycle commands: pear init/run/stage/seed/release.docs.pears.com groups P2P libraries as "building-block vs helper". This table groups by purpose and includes libraries used widely across Holepunch-based applications (Keet, PearPass/autopass, QVAC registry-server, WDK, etc.) that are not on the docs.pears.com index page:
| Layer | Libraries | |-------|-----------| | Networking | hyperswarm, hyperdht | | Core Data | hypercore, corestore | | KV Database | hyperbee | | Schema DB | hyperdb, hyperschema, hyperdispatch | | Files | hyperdrive, localdrive, mirror-drive | | Multi-writer | autobase | | Pairing | blind-pairing, blind-peering | | Connection | protomux, protomux-rpc, @hyperswarm/secret-stream | | Encoding | compact-encoding, b4a | | Utilities | ready-resource, safety-catch, protomux-wakeup |
Repo-name anomaly: @hyperswarm/secret-stream ships from the holepunchto/hyperswarm-secret-stream repo.
When you need to learn about a Holepunch library, follow these steps in order. Do not stop at the first source if the API surface is still unclear.
Navigation hub and canonical module index. How-to guides contain working executable examples.
Primary API documentation lives in README files:
bashgh api repos/holepunchto/{repo}/readme --jq .content | base64 -d
Holepunch repos have excellent tests that show real usage patterns:
bashgh api repos/holepunchto/{repo}/contents/test # Then fetch specific test files for usage examples
For higher-level integration patterns:
bashgh api repos/holepunchto/examples/contents
Guided tutorials for specific topics (HyperDB, Autobase multi-writer, Pear apps):
bashgh api "search/repositories?q=org:holepunchto+workshop+in:name" --jq '.items[] | "\(.full_name) - \(.description)"'
Known workshops: pear-workshop, hyperdb-workshop, hyperdb-autobase-workshop.
Holepunch dependency trees are deep. When a library references another holepunch library, follow the chain:
bashgh api repos/holepunchto/{repo}/contents/package.json --jq .content | base64 -d \ | jq '.dependencies // {} | keys[] | select(test("hyper|autobase|corestore|protomux|blind-|compact-encoding|b4a|ready-resource|safety-catch"))'
Recursively fetch READMEs/tests for any holepunch dependency relevant to the current task. Do not stop at the first library; trace the dependency graph until the needed API surface is understood.
For bleeding-edge patterns not yet in dedicated libraries. These repos may be private; skip gracefully on 404:
bashgh api "search/repositories?q=org:holepunchto+keet+in:name" --jq '.items[].full_name'
When README is insufficient, read index.js or lib/ directly:
bashgh api repos/holepunchto/{repo}/contents/index.js --jq .content | base64 -d gh api repos/holepunchto/{repo}/contents/lib --jq '.[].name'
Corestore + Hyperswarm + Hyperbee:
javascriptconst store = new Corestore(storage) const core = store.get({ name: 'my-db' }) const db = new Hyperbee(core, { keyEncoding: 'utf-8', valueEncoding: 'utf-8' }) await store.ready() const swarm = new Hyperswarm() swarm.on('connection', conn => store.replicate(conn)) swarm.join(core.discoveryKey)
Corestore + Hyperswarm + Autobase + HyperDB + Hyperschema + Hyperdispatch. Full schema pipeline: define schema in Hyperschema, build collections with HyperDB builder, define routes in Hyperdispatch. Autobase open() returns HyperDB.bee instance; apply() dispatches operations via router; call view.flush() after batch.
Corestore + Hyperswarm + Hyperdrive:
javascriptconst store = new Corestore(storage) const drive = new Hyperdrive(store) await drive.ready() const swarm = new Hyperswarm() swarm.on('connection', conn => drive.replicate(conn)) swarm.join(drive.discoveryKey)
Policy: Only document verified facts. Each gotcha below is observed in real Holepunch-based production systems and re-verifiable via the Discovery Playbook (upstream README, tests, and source). Do not invent or speculate. Add new gotchas only when encountered and verified in practice.
store.replicate(conn). store.replicate() creates a Protomux and immediately processes buffered stream data. If the remote's "open session" message arrives before the protocol handler is registered, Protomux rejects the session → CHANNEL_CLOSED error.apply(), not from regular code. Append an operation and handle it in apply.indexer.core.key, not indexer.key. An indexer is a writer that also materializes the view.ready-resource for classes managing resources or state. Implement _open() for initialization and _close() for cleanup../spec/ directory. Regenerate after schema changes.b4a (buffer-to-anything) instead of Node.js Buffer for cross-runtime compatibility.gh api README fetch does not belong here..cursor/skills/qv-registry-autobase-patterns/) or .cursor/rules/<project>/, not in this skill.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 19,786 | 12,214 | -38% | 1 | 1 | 0% | 3,602 | 4,543 | +26% | 0 | 0 | — |
case-02 | fail→pass | 20,695 | 10,968 | -47% | 1 | 1 | 0% | 3,689 | 4,250 | +15% | 0 | 0 | — |
case-03 | fail→pass | 16,282 | 4,676 | -71% | 1 | 1 | 0% | 2,753 | 2,934 | +7% | 0 | 0 | — |
case-04 | fail→pass | 16,267 | 9,902 | -39% | 1 | 1 | 0% | 2,504 | 3,772 | +51% | 0 | 0 | — |
case-05 | pass→pass | 12,204 | 2,802 | -77% | 1 | 1 | 0% | 2,051 | 2,619 | +28% | 0 | 0 | — |
case-06 | pass→pass | 9,522 | 6,134 | -36% | 1 | 1 | 0% | 1,613 | 3,299 | +105% | 0 | 0 | — |
case-07 | pass→pass | 27,588 | 2,473 | -91% | 1 | 1 | 0% | 3,508 | 2,553 | -27% | 0 | 0 | — |
case-08 | fail→pass | 7,200 | 2,914 | -60% | 1 | 1 | 0% | 1,140 | 2,668 | +134% | 0 | 0 | — |
case-09 | fail→pass | 13,496 | 5,242 | -61% | 1 | 1 | 0% | 2,151 | 3,105 | +44% | 0 | 0 | — |
case-10 | pass→pass | 10,634 | 3,676 | -65% | 1 | 1 | 0% | 1,920 | 2,896 | +51% | 0 | 0 | — |
case-11 | pass→pass | 12,061 | 5,626 | -53% | 1 | 1 | 0% | 2,016 | 3,221 | +60% | 0 | 0 | — |
case-12 | fail→pass | 15,506 | 8,311 | -46% | 1 | 1 | 0% | 2,762 | 3,699 | +34% | 0 | 0 | — |
case-13 | pass→pass | 9,669 | 3,074 | -68% | 1 | 1 | 0% | 1,545 | 2,693 | +74% | 0 | 0 | — |
case-14 | fail→pass | 7,004 | 2,881 | -59% | 1 | 1 | 0% | 1,087 | 2,604 | +140% | 0 | 0 | — |
case-15 | fail→pass | 10,483 | 3,034 | -71% | 1 | 1 | 0% | 1,852 | 2,720 | +47% | 0 | 0 | — |
case-16 | pass→pass | 10,722 | 6,012 | -44% | 1 | 1 | 0% | 1,689 | 3,191 | +89% | 0 | 0 | — |
case-17 | pass→pass | 6,770 | 4,081 | -40% | 1 | 1 | 0% | 1,033 | 2,818 | +173% | 0 | 0 | — |
case-18 | pass→pass | 6,629 | 3,793 | -43% | 1 | 1 | 0% | 1,058 | 2,776 | +162% | 0 | 0 | — |
case-19 | fail→pass | 19,882 | 12,369 | -38% | 1 | 1 | 0% | 3,485 | 4,434 | +27% | 0 | 0 | — |
case-20 | pass→pass | 6,362 | 6,553 | +3% | 1 | 1 | 0% | 1,024 | 3,397 | +232% | 0 | 0 | — |
case-21 | pass→pass | 3,019 | 3,424 | +13% | 1 | 1 | 0% | 424 | 2,713 | +540% | 0 | 0 | — |
case-22 | pass→pass | 4,148 | 3,666 | -12% | 1 | 1 | 0% | 767 | 2,813 | +267% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.