Skip to content

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.

Into the current project, for Claude Code (.claude/skills/):

Terminal window
curl -fsSL https://cryptopeer.net/skills/install.sh | sh

For other agents, pass --agent:

Terminal window
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/*.md

Name skills to install only those:

Terminal window
curl -fsSL https://cryptopeer.net/skills/install.sh | sh -s -- cryptopeer-stack dart-libp2p-host udx-dart

To 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.

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:

Terminal window
curl -fsSL https://cryptopeer.net/skills/AGENTS.md -o AGENTS.md

Fill 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.

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.
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//udx addresses, the ./multiaddr browser entry), including back-pressure, closing, MemoryNetwork tests and interop with go-udx and dart_udx.
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//udp//udx listen and dial addresses, Noise and Yamux over UDX, hole punching, and interop with dart-libp2p and js-libp2p nodes.
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/ addresses, BleDiscovery mesh and link budget, gossipsub over GATT, Android/iOS/macOS permissions, and FakeBleNetwork tests without Bluetooth.
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.
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.
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.

Built by Stephan Februarygithub.com/stephanfebLinkedIn