Learn-skills.dev souldinals
Souldinals collection management — inscribe soul.md as a child inscription under a genesis parent, list and load soul inscriptions from the wallet, and display parsed soul traits and metadata.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/aibtcdev/skills/souldinals" ~/.claude/skills/neversight-learn-skills-dev-souldinals && rm -rf "$T"
data/skills-md/aibtcdev/skills/souldinals/SKILL.mdSouldinals Skill
Manages Souldinals — soul.md files inscribed as child ordinals under a genesis parent inscription. A soul inscription records an agent's identity, values, and traits as Markdown on Bitcoin L1.
All write operations (
inscribe-soul, reveal-soul) require an unlocked wallet with BTC balance on the SegWit address.
Usage
bun run souldinals/souldinals.ts <subcommand> [options]
Subcommands
inscribe-soul
Inscribe a soul.md file as a child inscription under a parent inscription — STEP 1: Broadcast commit transaction.
Reads the soul.md file, base64-encodes it, and broadcasts the commit transaction. After the commit confirms, call
reveal-soul with the saved parameters to finalize the inscription.
bun run souldinals/souldinals.ts inscribe-soul \ --parent-inscription-id <id> \ [--soul-file ./SOUL.md] \ [--fee-rate fast|medium|slow|<number>]
Options:
(required) — The genesis parent inscription ID (format:--parent-inscription-id
){txid}i{index}
(optional) — Path to the soul.md file (default:--soul-file
)./SOUL.md
(optional) —--fee-rate
,fast
,medium
, or number in sat/vB (default:slow
)medium
Requires: unlocked wallet with BTC balance.
Output:
{ "status": "commit_broadcast", "message": "Soul commit transaction broadcast. Wait for confirmation, then call reveal-soul.", "commitTxid": "abc123...", "commitExplorerUrl": "https://mempool.space/tx/abc123...", "revealAddress": "bc1p...", "revealAmount": 3200, "commitFee": 1640, "feeRate": 8, "parentInscriptionId": "def456...i0", "soulFile": "./SOUL.md", "contentType": "text/markdown", "contentSize": 1024, "contentBase64": "...", "nextStep": "After commit confirms, call: bun run souldinals/souldinals.ts reveal-soul ..." }
reveal-soul
Complete a soul inscription — STEP 2: Broadcast reveal transaction.
Call this AFTER the commit transaction from
inscribe-soul has confirmed.
bun run souldinals/souldinals.ts reveal-soul \ --commit-txid <txid> \ --reveal-amount <satoshis> \ --content-base64 <base64> \ [--fee-rate fast|medium|slow|<number>]
Options:
(required) — Transaction ID of the confirmed commit (64 hex chars)--commit-txid
(required) — Amount in the commit output in satoshis (from--reveal-amount
response)inscribe-soul
(required) — Base64-encoded soul.md content (from--content-base64
response)inscribe-soul
(optional) — Fee rate for reveal tx (default:--fee-rate
)medium
Requires: unlocked wallet.
Output:
{ "status": "success", "message": "Soul inscription created successfully!", "inscriptionId": "def456...i0", "contentType": "text/markdown", "contentSize": 1024, "commit": { "txid": "abc123...", "explorerUrl": "https://mempool.space/tx/abc123..." }, "reveal": { "txid": "def456...", "fee": 960, "explorerUrl": "https://mempool.space/tx/def456..." }, "recipientAddress": "bc1p...", "note": "Soul inscription will appear at the recipient address once the reveal transaction confirms." }
list-souls
List all soul inscriptions (text/markdown) owned by the wallet's Taproot address.
Queries the Unisat Ordinals API and filters for
text/markdown content type.
bun run souldinals/souldinals.ts list-souls
Requires: unlocked wallet (for Taproot address).
Output:
{ "address": "bc1p...", "count": 2, "souls": [ { "id": "abc123...i0", "number": 78345, "contentType": "text/markdown", "contentLength": 1024, "timestamp": "2024-01-15T12:00:00.000Z", "genesisBlockHeight": 835000 } ] }
load-soul
Load and display the full content of the oldest soul inscription from the wallet.
Finds the oldest text/markdown inscription and fetches its content via the Unisat Ordinals API.
bun run souldinals/souldinals.ts load-soul
Requires: unlocked wallet (for Taproot address).
Output:
{ "inscriptionId": "abc123...i0", "contentType": "text/markdown", "contentSize": 1024, "timestamp": "2024-01-15T12:00:00.000Z", "content": "# My Soul\n\n..." }
display-soul
Parse and display soul traits from a specific inscription by ID.
Fetches inscription content and parses Markdown sections to extract identity traits: name, description, values, focus areas, and custom sections.
bun run souldinals/souldinals.ts display-soul --inscription-id <id>
Options:
(required) — Inscription ID (format:--inscription-id
){txid}i{index}
Output:
{ "inscriptionId": "abc123...i0", "contentType": "text/markdown", "traits": { "name": "...", "description": "...", "values": ["..."], "focusAreas": ["..."], "sections": { "Identity": "...", "Values": "..." } }, "rawContent": "# Soul\n\n..." }
Two-Step Soul Inscription Workflow
# Step 1: Broadcast commit (soul.md defaults to ./SOUL.md) bun run souldinals/souldinals.ts inscribe-soul \ --parent-inscription-id <genesisInscriptionId> # Save: commitTxid, revealAmount, contentBase64 # Wait for commit to confirm (check mempool.space) # Step 2: Reveal (finalizes inscription) bun run souldinals/souldinals.ts reveal-soul \ --commit-txid <commitTxid> \ --reveal-amount <revealAmount> \ --content-base64 <contentBase64>
Notes
andinscribe-soul
require a wallet unlocked viareveal-soulbun run wallet/wallet.ts unlock- The wallet must have BTC balance on the SegWit (bc1q/tb1q) address for funding
- Soul inscriptions are received at the Taproot (bc1p/tb1p) address
- The
binds the soul as a child in the Souldinals collection--parent-inscription-id
,list-souls
, andload-soul
use the Unisat Ordinals API (setdisplay-soul
env var for higher rate limits; free tier: 5 req/s)UNISAT_API_KEY