Agent skills
These skills are operating manuals for coding agents. Each one covers one part of the cryptopeer stack and gives the agent what it needs to write correct code against it: the dependency line, a minimal working program, the API map, the mistakes that break things, how to test, and what it must never do.
An agent sees only each skill’s one-line description until a task needs the skill. Then it loads the full text. Install the whole set and the agent picks what it needs.
Install
Section titled “Install”Into the current project, for Claude Code (.claude/skills/):
curl -fsSL https://cryptopeer.net/skills/install.sh | shFor other agents, pass --agent:
curl -fsSL https://cryptopeer.net/skills/install.sh | sh -s -- --agent codex # .agents/skills/curl -fsSL https://cryptopeer.net/skills/install.sh | sh -s -- --agent cursor # .cursor/skills/curl -fsSL https://cryptopeer.net/skills/install.sh | sh -s -- --agent boubou # skills/*.mdName skills to install only those:
curl -fsSL https://cryptopeer.net/skills/install.sh | sh -s -- cryptopeer-stack dart-libp2p-host udx-dartTo install for every project on the machine, pass --dir ~/.claude/skills
(Claude Code) or --agent boubou --dir ~/.ollama_agent/skills (Boubou).
Every skill is published in two layouts:
| Layout | URL | For |
|---|---|---|
| Agent Skills | https://cryptopeer.net/skills/<name>/SKILL.md |
Claude Code, Codex, Cursor and other hosts that read <name>/SKILL.md |
| Flat file | https://cryptopeer.net/skills/<name>.md |
Boubou and Mingbird, which read skills/*.md |
The content is the same. The frontmatter keeps every value on one line, so
Boubou can parse it. Its triggers: line makes Boubou load a skill into the
prompt when one of the words appears in the task. Other hosts ignore it.
The catalogue is also published as JSON at
/skills/index.json, with each
skill’s description, triggers and URLs.
Project instructions
Section titled “Project instructions”Skills say how to use a package. A project also needs a few standing rules
that hold for every task: which packages it uses, how identities are kept,
how to run the tests. Put them in the file your agent reads on every turn:
AGENTS.md (Codex, Cursor and others), CLAUDE.md (Claude Code) or
SYSTEM.md (Boubou).
A starting point is at
/skills/AGENTS.md:
curl -fsSL https://cryptopeer.net/skills/AGENTS.md -o AGENTS.mdFill in the blanks and delete the parts the project does not use. See What makes a skill useful for the reasoning behind the set and how to add to it.
Catalogue
Section titled “Catalogue”Start here
Section titled “Start here”| Skill | Use it when |
|---|---|
cryptopeer-stack |
Use first in any project that builds on the cryptopeer stack (UDX, dart_libp2p and its packages, Ricochet, go-p2p-forge) to pick the right packages for a P2P task, see how Dart, Go and TypeScript peers connect, and find the detailed skill for each package. |
UDX transport
Section titled “UDX transport”| Skill | Use it when |
|---|---|
udx-dart |
Use when writing or debugging Dart code on dart_udx (import package:dart_udx/dart_udx.dart): UDXMultiplexer, UDPSocket and UDXStream over a RawDatagramSocket, stream back-pressure, half-close, hole punching, testing with FakeClock, or interop with go-udx and js-udx over UDX wire v3. |
udx-go |
Use when writing or debugging Go code on go-udx (import github.com/stephanfeb/go-udx, package udx): Listen, Dial, Multiplexer, Connection and Stream over UDP, stream flow control, half-close, deadlines, idle timeouts, MockClock tests, or interop with dart_udx and js-udx over UDX wire v3. |
udx-js |
Use when writing TypeScript/Node.js code on js-udx: @go-ricochet/udx (listen, dial, UdxMultiplexer, UdxConnection, UdxStream) or the js-libp2p transport @go-ricochet/libp2p-udx (udx(), /udp/ |
go-libp2p-udx |
Use when adding UDX to a go-libp2p host with github.com/stephanfeb/go-libp2p-udx-transport (package udxtransport): libp2p.Transport(udxtransport.NewTransport), /ip4/ |
dart-libp2p
Section titled “dart-libp2p”| Skill | Use it when |
|---|---|
dart-libp2p-host |
Use when creating or configuring a dart_libp2p host in Dart (package:dart_libp2p, Libp2p.new_, Config): identity keys, UDX/TCP transports, Noise, Yamux, listen addresses, connect, peerstore, identify, ping, event bus, resource limits, shutdown, tests and go-libp2p interop. |
dart-libp2p-custom-protocol |
Use when writing your own libp2p protocol in Dart on a dart_libp2p host: protocol IDs, setStreamHandler, newStream, varint length-prefixed framing, P2PStream read/write, deadlines and timeouts, closeWrite vs close vs reset, versioning, request/response and long-lived streams, go-libp2p interop. |
dart-libp2p-nat-relay |
Use when making dart_libp2p peers reachable across NATs in Dart: running a Circuit Relay v2 relay, AutoRelay reservations, dialing via /p2p-circuit, AutoNAT v2 reachability, DCUtR hole punching over UDX, mDNS local discovery (MdnsDiscovery), Happy Eyeballs dialing, go-libp2p relay interop. |
Transports for browsers and nearby devices
Section titled “Transports for browsers and nearby devices”| Skill | Use it when |
|---|---|
dart-libp2p-webrtc |
Use when a Dart or Flutter dart_libp2p host must connect directly to js-libp2p browser apps or other Dart hosts over WebRTC (/p2p-circuit/webrtc) with package:dart_libp2p_webrtc: WebRtcTransport, relay signalling, upgrade(), STUN/TURN via RtcConfig, raw data channels, the native libdatachannel build. |
dart-libp2p-ble |
Use when a Flutter app must connect dart_libp2p hosts over Bluetooth LE without a network with package:dart_libp2p_ble: BleTransport, /ble/ |
Protocols and data
Section titled “Protocols and data”| Skill | Use it when |
|---|---|
dart-libp2p-gossipsub |
Use when writing Dart code that publishes or subscribes over libp2p pubsub with package dart_libp2p_pubsub (PubSub, GossipSubRouter, FloodSubRouter, RandomSubRouter): topics, message validation, peer scoring, GossipSubParams tuning, topic discovery, tracing, testing, go-libp2p-pubsub interop. |
dart-libp2p-kad-dht |
Use when a dart_libp2p app needs the Kademlia DHT (package:dart_libp2p_kad_dht, IpfsDHTv2): bootstrapping, findPeer, provide / findProvidersAsync content routing, putValue / getValue signed records with namespace validators, advertise / findPeers rendezvous, client / server / auto modes, go-libp2p interop. |
dart-libp2p-bitswap |
Use when fetching or serving content-addressed blocks between dart_libp2p peers with package dart_libp2p_bitswap (Bitswap 1.2.0): implementing a BlockStore, getBlock / wantBlocks / cancelWants, notifyNewBlock, BitswapOptions tuning, CIDs via dcid, and testing Bitswap code. |
merkle-crdt |
Use when writing Dart code against the merkledag package (import ‘package:merkledag/merkledag.dart’): building a MerkleCRDT or MerkleClock, writing a CRDTPayload or using GSet, implementing DAGSyncer or Broadcaster, encoding or verifying MerkleNode bytes, or testing replicas locally. For libp2p replication use merkle-crdt-sync. |
merkle-crdt-sync |
Use when replicating merkledag Merkle-CRDTs between dart_libp2p peers with the dart_libp2p_merkle_crdt package (import package:dart_libp2p_merkle_crdt/dart_libp2p_merkle_crdt.dart): MerkleCrdtGossipManager, GossipSubAnnouncer, P2PStreamDagFetcher, WriterAuthorizer, BlockStore, DocumentCRDT, optional DHT block lookup. |
Ricochet
Section titled “Ricochet”| Skill | Use it when |
|---|---|
ricochet-server |
Use when building, configuring, deploying or operating the go-ricochet store-and-forward server (module github.com/stephanfeb/go-ricochet, cmd/ricochet): config.yaml keys, presets, PostgreSQL schema, transports, relay/NAT, the .deb and supervisor package, the ops HTTP surface, moderation, and its protocol IDs. |
ricochet-dart-client |
Use when writing Dart or Flutter code against package:ricochet (ricochet-dart-client) to talk to a Ricochet server: SFClient setup on an existing dart_libp2p host, sendMessage/retrieveMessages, flags and deletes, push notifications, NaCl box encryption with PayloadEncryptor, mailboxes and ACLs, documents, feeds, collections, claim mailboxes. |
ricochet-mailbox |
Use when building a store-and-forward mailbox app on Ricochet (offline delivery, E2E encrypted messages, push notifications) or writing Go code against github.com/stephanfeb/go-ricochet/pkg/client and pkg/wire; based on go-ricochet/examples/mailbox. Covers server preferences and failover, acknowledging and draining, notifications, mailbox types and ACLs. |
go-p2p-forge |
Use when building a Go libp2p service with go-p2p-forge (module github.com/stephanfeb/go-p2p-forge): forge.NewServer, middleware Pipeline and StreamContext, framed JSON codecs and buffer pools, OperationRouter, rate limiters, lifecycle services and health checks, the host and node packages, and testing handlers with forgetest. |
Across the stack
Section titled “Across the stack”| Skill | Use it when |
|---|---|
cryptopeer-interop-testing |
Use when writing or running tests that span languages or processes in the cryptopeer stack: Dart, Go and JS interop for UDX and libp2p, loopback and in-memory test hosts, Docker NAT and netem setups, browser and TURN tests, timeouts and flaky network tests, and the dart test, go test and vitest commands and CI presets of each repo. |
cryptopeer-connectivity-debugging |
Use when cryptopeer peers do not connect or streams stall: dart_libp2p, go-libp2p with the UDX transport, js-libp2p, UDX, relays and hole punching. A decision procedure from multiaddrs through UDX version, Noise, Yamux, multistream, relay limits, NAT and the resource manager, with the loggers, env vars and tools to enable in Dart, Go and JS. |