{"id":"ea3660d1-0e6d-4f7e-ae8a-f5443c8ec88e","shortId":"SKeKpq","kind":"skill","title":"using-nostr","tagline":"Post notes, send encrypted messages, and interact with relays using the Nostr protocol.","description":"# NOSTR Posting Skill\n# Using nostr-sdk library\n# Source: https://github.com/besoeasy/nostr-sdk\n\n## Overview\nPost messages, send encrypted DMs, and interact with the Nostr decentralized social protocol using minimal direct exports from the `nostr-sdk` module.\n\n**Installation:**\n```bash\nnpm install nostr-sdk\n```\n\n**Key Concepts:**\n- **nsec**: Private key in bech32 format (starts with `nsec1`)\n- **npub**: Public key in bech32 format (starts with `npub1`)\n- **Relays**: WebSocket servers that propagate Nostr events\n- **Events**: Signed JSON objects representing posts, DMs, etc.\n- **POW**: Proof of Work (mining) to reduce spam\n\n**Default Relays:**\n- wss://relay.damus.io\n- wss://nos.lol\n- wss://relay.snort.social\n- wss://nostr-pub.wellorder.net\n- wss://nostr.oxtr.dev\n- And 9+ more for maximum reach\n\n---\n\n## Skills\n\n### post_public_note\n\nPost a public text note to Nostr.\n\n**Usage:**\n```javascript\nconst { posttoNostr } = require(\"nostr-sdk\");\n\nconst result = await posttoNostr(\"Hello Nostr! #introduction\", {\n  nsec: \"nsec1...your-private-key\",\n  tags: [],\n  relays: null,\n  powDifficulty: 4\n});\nconsole.log(result);\n```\n\n**Parameters:**\n- `message`: Text content to post\n- `tags`: Optional array of tags (e.g., `[['t', 'topic']]`)\n- `relays`: Optional custom relay list (uses defaults if null)\n- `powDifficulty`: Proof of work difficulty (default: 4, 0 to disable)\n\n**Auto-extracted Tags:**\n- Hashtags: `#nostr` → `[\"t\", \"nostr\"]`\n- Mentions: `@npub1...` → `[\"p\", <pubkey>]`\n- Links: URLs automatically preserved\n- Notes: `note1...` references → `[\"e\", <event-id>]`\n\n**Response:**\n```javascript\n{\n  success: true,\n  eventId: \"abc123...\",\n  published: 12,      // Successfully published to 12 relays\n  failed: 2,          // Failed on 2 relays\n  totalRelays: 14,\n  powDifficulty: 4,\n  errors: []\n}\n```\n\n**When to use:**\n- User wants to post a public message\n- Sharing content with hashtags\n- Broadcasting announcements\n\n---\n\n### reply_to_post\n\nReply to an existing Nostr post.\n\n**Usage:**\n```javascript\nconst { replyToPost } = require(\"nostr-sdk\");\n\nconst result = await replyToPost(\n  \"note1...event-id\",           // Event ID (note or hex format)\n  \"Great post! @npub1...author\", // Reply message\n  \"npub1...author-pubkey\",      // Author's public key\n  [],                           // Additional tags\n  null,                         // Use default relays\n  4                             // POW difficulty\n);\n```\n\n**When to use:**\n- Responding to a specific post\n- Thread conversations\n- Engaging with content\n\n---\n\n### send_encrypted_dm (NIP-4)\n\nSend encrypted direct message using legacy NIP-4 standard.\n\n**Usage:**\n```javascript\nconst { sendmessage } = require(\"nostr-sdk\");\n\nconst result = await sendmessage(\n  \"npub1...recipient\",    // Recipient's public key\n  \"Secret message here\",  // Message content\n  { nsec: \"nsec1...your-private-key\" }\n);\n```\n\n**When to use:**\n- Compatibility with older Nostr clients\n- Basic encrypted messaging\n- Wide client support\n\n**Limitations:**\n- Sender/recipient metadata visible\n- Older encryption (NIP-04)\n\n---\n\n### send_encrypted_dm_modern (NIP-17)\n\nSend gift-wrapped encrypted message using NIP-17 (recommended).\n\n**Usage:**\n```javascript\nconst { sendMessageNIP17 } = require(\"nostr-sdk\");\n\nconst result = await sendMessageNIP17(\n  \"npub1...recipient\",    // Recipient's public key\n  \"Private message!\",     // Message content\n  { nsec: \"nsec1...your-private-key\" }\n);\n```\n\n**Benefits:**\n- Sealed sender (hides who sent the message)\n- Better metadata protection\n- Modern NIP-44 encryption\n- Ephemeral keys for each message\n\n**When to use:**\n- Maximum privacy needed\n- Modern applications\n- Hiding sender identity\n\n---\n\n### receive_messages (NIP-4)\n\nListen for incoming direct messages.\n\n**Usage:**\n```javascript\nconst { getmessage } = require(\"nostr-sdk\");\n\nconst unsubscribe = getmessage((message) => {\n  console.log(\"From:\", message.senderNpub);\n  console.log(\"Message:\", message.content);\n  console.log(\"Time:\", new Date(message.timestamp * 1000));\n}, {\n  nsec: \"nsec1...your-private-key\",\n  since: Math.floor(Date.now() / 1000) - 3600  // Last hour\n});\n\n// Stop listening:\n// unsubscribe();\n```\n\n**Message Object:**\n```javascript\n{\n  id: \"event-id\",\n  sender: \"hex-pubkey\",\n  senderNpub: \"npub1...\",\n  content: \"decrypted message\",\n  timestamp: 1234567890,\n  event: { /* full event */ }\n}\n```\n\n**When to use:**\n- Building a chat bot\n- Receiving DMs\n- Monitoring for messages\n\n---\n\n### receive_messages_modern (NIP-17)\n\nListen for incoming NIP-17 gift-wrapped messages.\n\n**Usage:**\n```javascript\nconst { getMessageNIP17 } = require(\"nostr-sdk\");\n\nconst unsubscribe = getMessageNIP17((message) => {\n  console.log(\"From:\", message.senderNpub);\n  console.log(\"Content:\", message.content);\n  console.log(\"Wrapped ID:\", message.wrappedEventId);\n}, {\n  nsec: \"nsec1...your-private-key\",\n  since: Math.floor(Date.now() / 1000) - 300  // Last 5 minutes\n});\n\n// Stop listening:\n// unsubscribe();\n```\n\n**When to use:**\n- Receiving modern private messages\n- Maximum privacy for incoming DMs\n- Supporting NIP-17 protocol\n\n---\n\n### get_global_feed\n\nFetch recent posts from the global Nostr feed.\n\n**Usage:**\n```javascript\nconst { getGlobalFeed } = require(\"nostr-sdk\");\n\nconst events = await getGlobalFeed({\n  limit: 50,                                    // Max 50 posts\n  since: Math.floor(Date.now() / 1000) - 3600, // Last hour\n  until: null,                                  // Up to now\n  kinds: [1],                                   // Text notes only\n  authors: null,                                // All authors\n  relays: null                                  // Use defaults\n});\n\nevents.forEach(event => {\n  console.log(\"Author:\", event.authorNpub);\n  console.log(\"Content:\", event.content);\n  console.log(\"Note ID:\", event.noteId);\n  console.log(\"Posted:\", event.createdAtDate);\n});\n```\n\n**When to use:**\n- Building a feed reader\n- Monitoring public posts\n- Trending content analysis\n\n---\n\n### generate_keys\n\nGenerate new Nostr key pair.\n\n**Usage:**\n```javascript\nconst { generateNewKey } = require(\"nostr-sdk\");\n\nconst keys = generateNewKey();\nconsole.log(keys);\n// {\n//   privateKey: \"hex-private-key\",\n//   publicKey: \"hex-public-key\",\n//   nsec: \"nsec1...\",\n//   npub: \"npub1...\"\n// }\n```\n\n**Quick Generate:**\n```javascript\nconst { generateRandomNsec } = require(\"nostr-sdk\");\nconst nsec = generateRandomNsec();\nconsole.log(nsec); // nsec1...\n```\n\n---\n\n### convert_keys\n\nConvert between key formats.\n\n**Usage:**\n```javascript\nconst { nsecToPublic } = require(\"nostr-sdk\");\n\nconst publicInfo = nsecToPublic(\"nsec1...your-key\");\nconsole.log(publicInfo);\n// {\n//   publicKey: \"hex-public-key\",\n//   npub: \"npub1...\"\n// }\n```\n\n---\n\n## Quick Start Examples\n\n### Example 1: Post a Message\n```javascript\nconst { posttoNostr } = require(\"nostr-sdk\");\n\nasync function postHello() {\n  const result = await posttoNostr(\"Hello from my bot! #nostr #automation\", {\n    nsec: \"nsec1...your-private-key\"\n  });\n  \n  console.log(\"Posted:\", result.eventId);\n}\n\npostHello();\n```\n\n### Example 2: Send Private DM\n```javascript\nconst { sendMessageNIP17 } = require(\"nostr-sdk\");\n\nasync function sendPrivateMessage() {\n  const result = await sendMessageNIP17(\n    \"npub1...recipient\",\n    \"This is a secret message!\",\n    { nsec: \"nsec1...your-private-key\" }\n  );\n  \n  console.log(\"Sent:\", result.success ? \"Yes\" : \"No\");\n}\n\nsendPrivateMessage();\n```\n\n### Example 3: Listen for DMs\n```javascript\nconst { getMessageNIP17 } = require(\"nostr-sdk\");\n\nconsole.log(\"Listening for messages...\");\n\nconst unsubscribe = getMessageNIP17((msg) => {\n  console.log(`Message from ${msg.senderNpub}: ${msg.content}`);\n}, {\n  nsec: \"nsec1...your-private-key\"\n});\n\n// Keep running or call unsubscribe() to stop\n```\n\n### Example 4: Quick Post (No Setup)\n```javascript\nconst { posttoNostr } = require(\"nostr-sdk\");\n\n// Auto-generates keys if not provided\nconst result = await posttoNostr(\"Quick post!\", {\n  nsec: \"nsec1...your-key\"  // Optional - generates new if omitted\n});\n```\n\n---\n\n## Decision Tree\n\n```\nUser wants to post to Nostr?\n├─ Is it a public post?\n│  ├─ Is it a reply to another post?\n│  │  ├─ YES → Use replyToPost()\n│  │  └─ NO → Use posttoNostr()\n│  └─ Need spam protection?\n│     ├─ YES → Set powDifficulty to 4+\n│     └─ NO → Set powDifficulty to 0\n│\n├─ Is it a private message?\n│  ├─ Maximum privacy needed?\n│  │  ├─ YES → Use sendMessageNIP17()\n│  │  └─ NO → Use sendmessage()\n│  │\n│  └─ Need to receive messages?\n│     ├─ Use NIP-17 → getMessageNIP17()\n│     └─ Use NIP-4 (legacy) → getmessage()\n│\n└─ Need to read posts?\n   └─ Use getGlobalFeed()\n```\n\n---\n\n## Key Management\n\n**Security Best Practices:**\n- Never commit nsec keys to git\n- Store keys in environment variables or secure vaults\n- Generate new keys for testing\n- Use different keys for different purposes\n\n**Environment Variables:**\n```bash\nexport NOSTR_NSEC=\"nsec1...your-private-key\"\n```\n\n```javascript\nconst { posttoNostr } = require(\"nostr-sdk\");\n\nawait posttoNostr(\"Health check log\", {\n  nsec: process.env.NOSTR_NSEC\n});\n```\n\n---\n\n## Error Handling\n\n**Common Errors:**\n- `Private key not set` → Provide nsec or generate keys\n- `Invalid nsec format` → Check bech32 encoding\n- `Failed to post to Nostr` → Check relay connections\n- `Failed to decrypt message` → Wrong private key for recipient\n\n**Best Practice:**\n```javascript\nconst { posttoNostr } = require(\"nostr-sdk\");\n\ntry {\n  const result = await posttoNostr(\"Hello\", {\n    nsec: process.env.NOSTR_NSEC\n  });\n  if (!result.success) {\n    console.error(\"Failed to publish:\", result.errors);\n  }\n} catch (error) {\n  console.error(\"Error:\", error.message);\n}\n```\n\n---\n\n## Cleanup\n\nDirect-export functions do not require a class instance, so there is no client cleanup step.\n\n---\n\n## Resources\n\n- **Library**: https://github.com/besoeasy/nostr-sdk\n- **Nostr Protocol**: https://nostr.com\n- **NIPs (Nostr Implementation Possibilities)**: https://github.com/nostr-protocol/nips\n- **Key Tools**:\n  - https://nostrcheck.me (key converter)\n  - https://snort.social (web client)\n  - https://damus.io (iOS client)","tags":["using","nostr","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server"],"capabilities":["skill","source-besoeasy","skill-using-nostr","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/using-nostr","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (10,061 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:05.080Z","embedding":null,"createdAt":"2026-04-18T22:10:57.212Z","updatedAt":"2026-05-02T12:55:05.080Z","lastSeenAt":"2026-05-02T12:55:05.080Z","tsv":"'-04':378 '-17':384,393,540,545,603,974 '-4':318,326,457,978 '-44':436 '/besoeasy/nostr-sdk':28,1131 '/nostr-protocol/nips':1141 '0':185,953 '1':646,769 '1000':486,496,581,636 '12':214,218 '1234567890':520 '14':227 '2':221,224,804 '3':842 '300':582 '3600':497,637 '4':152,184,229,298,880,948 '5':584 '50':629,631 '9':111 'abc123':212 'addit':292 'analysi':685 'announc':246 'anoth':933 'applic':450 'array':163 'async':780,815 'author':281,286,288,650,653,661 'author-pubkey':285 'auto':189,893 'auto-extract':188 'auto-gener':892 'autom':792 'automat':201 'await':137,266,338,405,626,785,820,901,1035,1091 'bash':54,1019 'basic':365 'bech32':66,75,1060 'benefit':423 'best':990,1079 'better':431 'bot':530,790 'broadcast':245 'build':527,676 'call':875 'catch':1104 'chat':529 'check':1038,1059,1067 'class':1118 'cleanup':1109,1125 'client':364,369,1124,1149,1152 'commit':993 'common':1045 'compat':360 'concept':61 'connect':1069 'console.error':1099,1106 'console.log':153,475,478,481,562,565,568,660,663,666,670,704,732,756,799,835,853,861 'const':129,135,258,264,330,336,397,403,465,471,552,558,618,624,695,701,723,729,743,749,774,783,809,818,847,857,886,899,1029,1082,1089 'content':158,242,313,350,416,516,566,664,684 'convers':310 'convert':735,737,1146 'custom':171 'damus.io':1150 'date':484 'date.now':495,580,635 'decentr':40 'decis':915 'decrypt':517,1072 'default':103,175,183,296,657 'differ':1012,1015 'difficulti':182,300 'direct':45,321,461,1111 'direct-export':1110 'disabl':187 'dm':316,381,807 'dms':34,93,532,600,845 'e':206 'e.g':166 'encod':1061 'encrypt':7,33,315,320,366,376,380,389,437 'engag':311 'environ':1001,1017 'ephemer':438 'error':230,1043,1046,1105,1107 'error.message':1108 'etc':94 'event':86,87,270,272,508,521,523,625,659 'event-id':269,507 'event.authornpub':662 'event.content':665 'event.createdatdate':672 'event.noteid':669 'eventid':211 'events.foreach':658 'exampl':767,768,803,841,879 'exist':253 'export':46,1020,1112 'extract':190 'fail':220,222,1062,1070,1100 'feed':607,615,678 'fetch':608 'format':67,76,277,740,1058 'full':522 'function':781,816,1113 'generat':686,688,721,894,911,1006,1054 'generatenewkey':696,703 'generaterandomnsec':724,731 'get':605 'getglobalfe':619,627,986 'getmessag':466,473,980 'getmessagenip17':553,560,848,859,975 'gift':387,547 'gift-wrap':386,546 'git':997 'github.com':27,1130,1140 'github.com/besoeasy/nostr-sdk':26,1129 'github.com/nostr-protocol/nips':1139 'global':606,613 'great':278 'handl':1044 'hashtag':192,244 'health':1037 'hello':139,787,1093 'hex':276,512,708,713,760 'hex-private-key':707 'hex-pubkey':511 'hex-public-key':712,759 'hide':426,451 'hour':499,639 'id':271,273,506,509,570,668 'ident':453 'implement':1137 'incom':460,543,599 'instal':53,56 'instanc':1119 'interact':10,36 'introduct':141 'invalid':1056 'io':1151 'javascript':128,208,257,329,396,464,505,551,617,694,722,742,773,808,846,885,1028,1081 'json':89 'keep':872 'key':60,64,73,147,291,345,356,412,422,439,492,577,687,691,702,705,710,715,736,739,755,762,798,834,871,895,909,987,995,999,1008,1013,1027,1048,1055,1076,1142,1145 'kind':645 'last':498,583,638 'legaci':324,979 'librari':24,1128 'limit':371,628 'link':199 'list':173 'listen':458,501,541,587,843,854 'log':1039 'manag':988 'math.floor':494,579,634 'max':630 'maximum':114,446,596,959 'mention':196 'messag':8,31,156,240,283,322,347,349,367,390,414,415,430,442,455,462,474,479,503,518,535,537,549,561,595,772,828,856,862,958,971,1073 'message.content':480,567 'message.sendernpub':477,564 'message.timestamp':485 'message.wrappedeventid':571 'metadata':373,432 'mine':99 'minim':44 'minut':585 'modern':382,434,449,538,593 'modul':52 'monitor':533,680 'msg':860 'msg.content':865 'msg.sendernpub':864 'need':448,941,961,968,981 'never':992 'new':483,689,912,1007 'nip':317,325,377,383,392,435,456,539,544,602,973,977,1135 'nos.lol':106 'nostr':3,15,17,22,39,50,58,85,126,133,140,193,195,254,262,334,363,401,469,556,614,622,690,699,727,747,778,791,813,851,890,922,1021,1033,1066,1086,1132,1136 'nostr-pub.wellorder.net':108 'nostr-sdk':21,49,57,132,261,333,400,468,555,621,698,726,746,777,812,850,889,1032,1085 'nostr.com':1134 'nostr.oxtr.dev':109 'nostrcheck.me':1144 'note':5,119,124,203,274,648,667 'note1':204,268 'npm':55 'npub':71,718,763 'npub1':79,197,280,284,340,407,515,719,764,822 'nsec':62,142,351,417,487,572,716,730,733,793,829,866,905,994,1022,1040,1042,1052,1057,1094,1096 'nsec1':70,143,352,418,488,573,717,734,752,794,830,867,906,1023 'nsectopubl':744,751 'null':150,177,294,641,651,655 'object':90,504 'older':362,375 'omit':914 'option':162,170,910 'overview':29 'p':198 'pair':692 'paramet':155 'possibl':1138 'post':4,18,30,92,117,120,160,237,249,255,279,308,610,632,671,682,770,800,882,904,920,927,934,984,1064 'posthello':782,802 'posttonostr':130,138,775,786,887,902,940,1030,1036,1083,1092 'pow':95,299 'powdifficulti':151,178,228,946,951 'practic':991,1080 'preserv':202 'privaci':447,597,960 'privat':63,146,355,413,421,491,576,594,709,797,806,833,870,957,1026,1047,1075 'privatekey':706 'process.env.nostr':1041,1095 'proof':96,179 'propag':84 'protect':433,943 'protocol':16,42,604,1133 'provid':898,1051 'pubkey':287,513 'public':72,118,122,239,290,344,411,681,714,761,926 'publicinfo':750,757 'publickey':711,758 'publish':213,216,1102 'purpos':1016 'quick':720,765,881,903 'reach':115 'read':983 'reader':679 'receiv':454,531,536,592,970 'recent':609 'recipi':341,342,408,409,823,1078 'recommend':394 'reduc':101 'refer':205 'relay':12,80,104,149,169,172,219,225,297,654,1068 'relay.damus.io':105 'relay.snort.social':107 'repli':247,250,282,931 'replytopost':259,267,937 'repres':91 'requir':131,260,332,399,467,554,620,697,725,745,776,811,849,888,1031,1084,1116 'resourc':1127 'respond':304 'respons':207 'result':136,154,265,337,404,784,819,900,1090 'result.errors':1103 'result.eventid':801 'result.success':837,1098 'run':873 'sdk':23,51,59,134,263,335,402,470,557,623,700,728,748,779,814,852,891,1034,1087 'seal':424 'secret':346,827 'secur':989,1004 'send':6,32,314,319,379,385,805 'sender':425,452,510 'sender/recipient':372 'sendernpub':514 'sendmessag':331,339,967 'sendmessagenip17':398,406,810,821,964 'sendprivatemessag':817,840 'sent':428,836 'server':82 'set':945,950,1050 'setup':884 'share':241 'sign':88 'sinc':493,578,633 'skill':19,116 'skill-using-nostr' 'snort.social':1147 'social':41 'sourc':25 'source-besoeasy' 'spam':102,942 'specif':307 'standard':327 'start':68,77,766 'step':1126 'stop':500,586,878 'store':998 'success':209,215 'support':370,601 'tag':148,161,165,191,293 'test':1010 'text':123,157,647 'thread':309 'time':482 'timestamp':519 'tool':1143 'topic':168 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'totalrelay':226 'tree':916 'trend':683 'tri':1088 'true':210 'unsubscrib':472,502,559,588,858,876 'url':200 'usag':127,256,328,395,463,550,616,693,741 'use':2,13,20,43,174,233,295,303,323,359,391,445,526,591,656,675,936,939,963,966,972,976,985,1011 'user':234,917 'using-nostr':1 'variabl':1002,1018 'vault':1005 'visibl':374 'want':235,918 'web':1148 'websocket':81 'wide':368 'work':98,181 'wrap':388,548,569 'wrong':1074 'yes':838,935,944,962 'your-key':753,907 'your-private-key':144,353,419,489,574,795,831,868,1024","prices":[{"id":"875468d6-5af5-4296-b7ca-323e9853ff33","listingId":"ea3660d1-0e6d-4f7e-ae8a-f5443c8ec88e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:57.212Z"}],"sources":[{"listingId":"ea3660d1-0e6d-4f7e-ae8a-f5443c8ec88e","source":"github","sourceId":"besoeasy/open-skills/using-nostr","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/using-nostr","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:57.212Z","lastSeenAt":"2026-05-02T12:55:05.080Z"}],"details":{"listingId":"ea3660d1-0e6d-4f7e-ae8a-f5443c8ec88e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"using-nostr","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"63ade21f71a265f1c18bf2f26ee404eecde8016e","skill_md_path":"skills/using-nostr/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/using-nostr"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"using-nostr","description":"Post notes, send encrypted messages, and interact with relays using the Nostr protocol."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/using-nostr"},"updatedAt":"2026-05-02T12:55:05.080Z"}}