executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
hodlxxi-bitcoin-identityIntegrate HODLXXI as a Bitcoin-native identity provider that bridges OAuth2/OIDC and Lightning LNURL-Auth for client registration, authorization flows, JWT verification, and health monitoring.
Independent GitHub snapshot · Automated classification · Original documentation governs
Use this skill to integrate HODLXXI (Universal Bitcoin Identity Layer) for agent authentication, LNURL-Auth linking, and JWT-based identity claims.
curl -L -o SKILL.md \
https://raw.githubusercontent.com/hodlxxi/Universal-Bitcoin-Identity-Layer/main/skills/public/hodlxxi-bitcoin-identity/SKILL.md
python -m pip install ecdsa pyjwt requests
client_id and client_secret.Set the base URL to the HODLXXI deployment (update as needed):
BASE_URL="https://hodlxxi.com"
Register a client to get credentials:
curl -X POST "$BASE_URL/oauth/register" \
-H "Content-Type: application/json" \
-d '{"client_name": "YourAgentName", "redirect_uris": ["https://your-callback-url"], "scopes": ["openid", "profile"]}'
Store client_id and client_secret securely.
Discover endpoints:
curl "$BASE_URL/.well-known/openid-configuration"
Create an authorization request (PKCE recommended):
curl "$BASE_URL/oauth/authorize?client_id=your_client_id&redirect_uri=your_callback&response_type=code&scope=openid%20profile&code_challenge=your_challenge&code_challenge_method=S256"
Exchange the authorization code for tokens:
curl -X POST "$BASE_URL/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code&code=received_code&redirect_uri=your_callback&client_id=your_client_id&code_verifier=your_verifier"
Expect an access token, ID token (JWT), and optional refresh token.
Create a session and show the LNURL to the user:
curl -X POST "$BASE_URL/api/lnurl-auth/create" \
-H "Accept: application/json"
Poll for completion after the user scans the LNURL with a Lightning wallet:
curl "$BASE_URL/api/lnurl-auth/check/your_session_id"
Fetch JWKS:
curl "$BASE_URL/oauth/jwks.json"
Verify with Python (example uses PyJWT):
import jwt
import requests
jwks = requests.get("https://your-hodlxxi-deployment.com/oauth/jwks.json", timeout=10).json()
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(jwks["keys"][0])
claims = jwt.decode(your_jwt, public_key, algorithms=["RS256"], audience="your_audience")
print(claims)
Check liveness and OAuth system status endpoints:
curl "$BASE_URL/health"
curl "$BASE_URL/oauthx/status"
curl -X POST "$BASE_URL/oauth/register" \
-H "Content-Type: application/json" \
-d @templates/oauth-client.json
session_json=$(curl -s -X POST "$BASE_URL/api/lnurl-auth/create")
session_id=$(python3 -c 'import json,sys; print(json.loads(sys.argv[1])["session_id"])' "$session_json")
curl "$BASE_URL/api/lnurl-auth/check/$session_id"
aud, iss, and exp claims for JWTs./oauthx/docs for live OAuth/OIDC API documentation./oauthx/status to monitor database and LNURL session health.Paid API calls are billed per OAuth client_id (agent/app), not per session pubkey. When balance or free quota is exhausted, paid endpoints return HTTP 402 with a Lightning top-up path.
POST /api/billing/agent/create-invoicePOST /api/billing/agent/check-invoiceExample create invoice:
curl -X POST "$BASE_URL/api/billing/agent/create-invoice" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"amount_sats": 1000}'
Example check invoice:
curl -X POST "$BASE_URL/api/billing/agent/check-invoice" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"invoice_id": "your_invoice_id"}'
When a paid endpoint is called with insufficient balance, expect:
{
"ok": false,
"error": "payment_required",
"code": "PAYMENT_REQUIRED",
"client_id": "your_client_id",
"cost_sats": 1,
"balance_sats": 0,
"create_invoice_endpoint": "/api/billing/agent/create-invoice",
"hint": "Top up via Lightning PAYG"
}
scripts/verify_signature.py validates LNURL-Auth signatures locally.HEARTBEAT.md describes periodic health checks for the deployment.templates/oauth-client.json provides a ready client registration payload.Use scripts/verify_signature.py to validate LNURL signatures locally. Install the dependency first:
python -m pip install ecdsa
python scripts/verify_signature.py --k1 <hex> --signature <hex> --pubkey <hex>