mirror of
https://github.com/fiatjaf/nak.git
synced 2024-10-30 09:09:08 -04:00
update readme with some helpful examples instead of a giant wall of text.
This commit is contained in:
parent
c5573410df
commit
9e5e736395
263
README.md
263
README.md
|
@ -1,225 +1,72 @@
|
||||||
# nostr army knife
|
# nak, the nostr army knife
|
||||||
|
|
||||||
this repository contains two things:
|
install with `go install github.com/fiatjaf/nak` or
|
||||||
|
[download a binary](https://github.com/fiatjaf/nak/releases).
|
||||||
|
|
||||||
## a command-line tool for decoding and encoding nostr entities and talking to relays
|
## what can you do with it?
|
||||||
|
|
||||||
Install with `go install github.com/fiatjaf/nak`.
|
take a look at the help text that comes in it to learn all possibilities, but here are some:
|
||||||
|
|
||||||
It pairs nicely with https://github.com/blakejakopovic/nostcat using unix pipes.
|
### make a nostr event signed with the default key (`01`)
|
||||||
|
|
||||||
### examples
|
|
||||||
|
|
||||||
|
```shell
|
||||||
|
~> nak event
|
||||||
|
{"id":"53443506e7d09e55b922a2369b80f926007a8a8a8ea5f09df1db59fe1993335e","pubkey":"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","created_at":1698632644,"kind":1,"tags":[],"content":"hello from the nostr army knife","sig":"4bdb609c975b2b61338c2ff4c7ce91d4afe74bea4ed1601a62e1fd125bd4c0ae6e0166cca96e5cfb7e0f50583eb6a0dd0b66072566299b6007742db56278010c"}
|
||||||
```
|
```
|
||||||
~> nak decode nsec1aqc5q5l8da0l7u6gra4p5xhleclngezlpsgd7z5dx07cpu8sxf2shqgn6y
|
|
||||||
{
|
|
||||||
"pubkey": "5b36b874b2b983197ba4be80553b2e4b6db2895a04567cea0aa47585b2e0c620",
|
|
||||||
"private_key": "e8314053e76f5fff73481f6a1a1affce3f34645f0c10df0a8d33fd80f0f03255"
|
|
||||||
}
|
|
||||||
|
|
||||||
~> nak event -c hello --sec e8314053e76f5fff73481f6a1a1affce3f34645f0c10df0a8d33fd80f0f03255
|
### make a nostr event with custom content and tags, sign it with a different key and publish it to two relays
|
||||||
{"id":"ed840ef37a40cce4f4b8c361e5df13457ad664209cf4a297fd7df7e84fdd32e0","pubkey":"5b36b874b2b983197ba4be80553b2e4b6db2895a04567cea0aa47585b2e0c620","created_at":1683201092,"kind":1,"tags":[],"content":"hello","sig":"304a87dbbdf986a187eb9417316cfe3d6f8f31793ba20c9c6d7e4ebeeefe950d6ecba6098c201b7170c04e27c2f920d607a90f5c8763c35ac806dce37df1d05d"}
|
```shell
|
||||||
~> nak event -c hello --sec e8314053e76f5fff73481f6a1a1affce3f34645f0c10df0a8d33fd80f0f03255 wss://relay.stoner.com wss://nos.lol wss://nostr.wine wss://atlas.nostr.land wss://relay.damus.io
|
~> nak event --sec 02 -c 'good morning' --tag t=gm wss://nostr-pub.wellorder.net wss://relay.damus.io
|
||||||
{"id":"54a534647bdcd2751d743fea4fc9eee5dba613887d69425f0891d9c2f82772a5","pubkey":"5b36b874b2b983197ba4be80553b2e4b6db2895a04567cea0aa47585b2e0c620","created_at":1684895417,"kind":1,"tags":[],"content":"hello","sig":"81a14cfe628fab6cd6135bb66f6e8b3bb4bfce4f666462a1303fdfbc9038fd141e73db3fe7e774a8f023fc70622c50a67d4fa41d3d09806c78f051985c11e0bd"}
|
{"id":"e20978737ab7cd36eca300a65f11738176123f2e0c23054544b18fe493e2aa1a","pubkey":"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5","created_at":1698632753,"kind":1,"tags":[["t","gm"]],"content":"good morning","sig":"5687c1a97066c349cb3bde0c0719fd1652a13403ba6aca7557b646307ee6718528cd86989db08bf6a7fd04bea0b0b87c1dd1b78c2d21b80b80eebab7f40b8916"}
|
||||||
publishing to wss://relay.stoner.com... failed: msg: blocked: pubkey is not allowed to publish to this relay
|
publishing to wss://nostr-pub.wellorder.net... success.
|
||||||
publishing to wss://nos.lol... success.
|
|
||||||
publishing to wss://nostr.wine... failed: msg: blocked: not an active paid member
|
|
||||||
publishing to wss://atlas.nostr.land... failed: msg: blocked: pubkey not admitted
|
|
||||||
publishing to wss://relay.damus.io... success.
|
publishing to wss://relay.damus.io... success.
|
||||||
|
```
|
||||||
|
|
||||||
~> nak decode nevent1qqs29yet5tp0qq5xu5qgkeehkzqh5qu46739axzezcxpj4tjlkx9j7gpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet5sh59ud
|
### query a bunch of relays for a tag with a limit of 2 for each, print their content
|
||||||
|
```shell
|
||||||
|
~> nak req -k 1 -t t=gm -l 2 wss://nostr.mom wss://nostr.wine wss://nostr-pub.wellorder.net | jq .content
|
||||||
|
"#GM, you sovereign savage #freeple of the #nostrverse. Let's cause some #nostroversy. "
|
||||||
|
"ITM slaves!\n#gm https://image.nostr.build/cbbcdf80bfc302a6678ecf9387c87d87deca3e0e288a12e262926c34feb3f6aa.jpg "
|
||||||
|
"good morning"
|
||||||
|
"The problem is to start, but along the way it's fixed #GM ☀️"
|
||||||
|
"Activando modo zen…\n\n#GM #Nostr #Hispano"
|
||||||
|
```
|
||||||
|
|
||||||
|
### decode a nip19 note1 code, add a relay hint, encode it back to nevent1
|
||||||
|
```shell
|
||||||
|
~> nak decode note1ttnnrw78wy0hs5fa59yj03yvcu2r4y0xetg9vh7uf4em39n604vsyp37f2 | jq -r .id | nak encode nevent -r wss://nostr.zbd.gg
|
||||||
|
nevent1qqs94ee3h0rhz8mc2y76zjf8cjxvw9p6j8nv45zktlwy6uacjea86kgpzfmhxue69uhkummnw3ezu7nzvshxwec8zw8h7
|
||||||
|
~> nak decode nevent1qqs94ee3h0rhz8mc2y76zjf8cjxvw9p6j8nv45zktlwy6uacjea86kgpzfmhxue69uhkummnw3ezu7nzvshxwec8zw8h7
|
||||||
{
|
{
|
||||||
"id": "a2932ba2c2f00286e5008b6737b0817a0395d7a25e9859160c195572fd8c5979",
|
"id": "5ae731bbc7711f78513da14927c48cc7143a91e6cad0565fdc4d73b8967a7d59",
|
||||||
"relays": [
|
"relays": [
|
||||||
"wss://nostr-pub.wellorder.net"
|
"wss://nostr.zbd.gg"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
~> nak req -a a2932ba2c2f00286e5008b6737b0817a0395d7a25e9859160c195572fd8c5979 -k 1 -a e8b487c079b0f67c695ae6c4c2552a47f38adfa2533cc5926bd2c102942fdcb7
|
|
||||||
["REQ","nak",{"kinds":[1],"authors":["a2932ba2c2f00286e5008b6737b0817a0395d7a25e9859160c195572fd8c5979","e8b487c079b0f67c695ae6c4c2552a47f38adfa2533cc5926bd2c102942fdcb7"]}]
|
|
||||||
|
|
||||||
~> nak req -k 1 -l 1 --stream wss://relay.stoner.com
|
|
||||||
{"id":"1d73832917bf5a72276c53e9246c28b97225b51cd5735843434f7756fc0ddead","pubkey":"3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d","created_at":1684894689,"kind":1,"tags":[["p","bcbeb5a2e6b547f6d0c3d8c16145f7bb94f3639ec7ecbcfe50045dbb2eede70b","wss://nos.lol","artk42"],["e","b5af6815c8d89a7d5b6201b9e624fbd5389fca3337ba2dc05c6187234a7c1bd5","wss://nos.lol","root"],["e","5795e27aff0a459a30c64a61a32c43d968cd19c8f1926cf01fc02e9da7c56f2b","wss://nos.lol","reply"],["client","coracle"]],"content":"Because that makes no sense.","sig":"3ee5b2b26ec6b116ef1a6b1c10bc7e56674a3c36841814f68b57f63259f3d78e23629d4599afe67e72c220e27b4b0966cc51adc1da808c8c6111dedb531ac0c3"}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### documentation
|
### fetch an event using relay and author hints automatically from a nevent1 code, pretty-print it
|
||||||
|
```shell
|
||||||
```
|
nak fetch nevent1qqs2e3k48vtrkzjm8vvyzcmsmkf58unrxtq2k4h5yspay6vhcqm4wqcpz9mhxue69uhkummnw3ezuamfdejj7q3ql2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqxpqqqqqqz7ttjyq | jq
|
||||||
~> nak --help
|
{
|
||||||
NAME:
|
"id": "acc6d53b163b0a5b3b18416370dd9343f26332c0ab56f42403d26997c0375703",
|
||||||
nak - the nostr army knife command-line tool
|
"pubkey": "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52",
|
||||||
|
"created_at": 1697370933,
|
||||||
USAGE:
|
"kind": 1,
|
||||||
nak [global options] command [command options] [arguments...]
|
"tags": [],
|
||||||
|
"content": "`q` tags = a kind 1 that wanted to be a kind:6 but fell short\n\n🥁",
|
||||||
COMMANDS:
|
"sig": "b5b63d7c8491a4a0517df2c58151665c583abc6cd31fd50b957bf8fefc8e55c87c922cbdcb50888cb9f1c03c26ab5c02c1dccc14b46b78e1e16c60094f2358da"
|
||||||
req generates encoded REQ messages and optionally use them to talk to relays
|
}
|
||||||
count generates encoded COUNT messages and optionally use them to talk to relays
|
|
||||||
event generates an encoded event and either prints it or sends it to a set of relays
|
|
||||||
decode decodes nip19, nip21, nip05 or hex entities
|
|
||||||
encode encodes notes and other stuff to nip19 entities
|
|
||||||
help, h Shows a list of commands or help for one command
|
|
||||||
|
|
||||||
GLOBAL OPTIONS:
|
|
||||||
--help, -h show help
|
|
||||||
|
|
||||||
~> nak event --help
|
|
||||||
NAME:
|
|
||||||
nak event - generates an encoded event and either prints it or sends it to a set of relays
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
nak event [command options] [arguments...]
|
|
||||||
|
|
||||||
DESCRIPTION:
|
|
||||||
example usage (for sending directly to a relay with 'nostcat'):
|
|
||||||
nak event -k 1 -c hello --envelope | nostcat wss://nos.lol
|
|
||||||
standalone:
|
|
||||||
nak event -k 1 -c hello wss://nos.lol`,
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
--envelope print the event enveloped in a ["EVENT", ...] message ready to be sent to a relay (default: false)
|
|
||||||
--sec value secret key to sign the event (default: the key '1')
|
|
||||||
|
|
||||||
EVENT FIELDS
|
|
||||||
|
|
||||||
--content value, -c value event content (default: hello from the nostr army knife)
|
|
||||||
--created-at value, --time value, --ts value unix timestamp value for the created_at field (default: now)
|
|
||||||
--kind value, -k value event kind (default: 1)
|
|
||||||
--tag value, -t value [ --tag value, -t value ] sets a tag field on the event, takes a value like -t e=<id>
|
|
||||||
-e value [ -e value ] shortcut for --tag e=<value>
|
|
||||||
-p value [ -p value ] shortcut for --tag p=<value>
|
|
||||||
|
|
||||||
~> nak req --help
|
|
||||||
NAME:
|
|
||||||
nak req - generates encoded REQ messages and optionally use them to talk to relays
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
nak req [command options] [relay...]
|
|
||||||
|
|
||||||
DESCRIPTION:
|
|
||||||
outputs a NIP-01 Nostr filter. when a relay is not given, will print the filter, otherwise will connect to the given relay and send the filter.
|
|
||||||
|
|
||||||
example usage (with 'nostcat'):
|
|
||||||
nak req -k 1 -a 3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d | nostcat wss://nos.lol
|
|
||||||
standalone:
|
|
||||||
nak req -k 1 wss://nos.lol
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
--bare when printing the filter, print just the filter, not enveloped in a ["REQ", ...] array (default: false)
|
|
||||||
--stream keep the subscription open, printing all events as they are returned (default: false, will close on EOSE)
|
|
||||||
|
|
||||||
FILTER ATTRIBUTES
|
|
||||||
|
|
||||||
--author value, -a value [ --author value, -a value ] only accept events from these authors (pubkey as hex)
|
|
||||||
--id value, -i value [ --id value, -i value ] only accept events with these ids (hex)
|
|
||||||
--kind value, -k value [ --kind value, -k value ] only accept events with these kind numbers
|
|
||||||
--limit value, -l value only accept up to this number of events (default: 0)
|
|
||||||
--since value, -s value only accept events newer than this (unix timestamp) (default: 0)
|
|
||||||
--tag value, -t value [ --tag value, -t value ] takes a tag like -t e=<id>, only accept events with these tags
|
|
||||||
--until value, -u value only accept events older than this (unix timestamp) (default: 0)
|
|
||||||
-e value [ -e value ] shortcut for --tag e=<value>
|
|
||||||
-p value [ -p value ] shortcut for --tag p=<value>
|
|
||||||
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
--bare when printing the filter, print just the filter, not enveloped in a ["REQ", ...] array (default: false)
|
|
||||||
--stream keep the subscription open, printing all events as they are returned (default: false, will close on EOSE)
|
|
||||||
|
|
||||||
FILTER ATTRIBUTES
|
|
||||||
|
|
||||||
--author value, -a value [ --author value, -a value ] only accept events from these authors (pubkey as hex)
|
|
||||||
--id value, -i value [ --id value, -i value ] only accept events with these ids (hex)
|
|
||||||
--kind value, -k value [ --kind value, -k value ] only accept events with these kind numbers
|
|
||||||
--limit value, -l value only accept up to this number of events (default: 0)
|
|
||||||
--since value, -s value only accept events newer than this (unix timestamp) (default: 0)
|
|
||||||
--tag value, -t value [ --tag value, -t value ] takes a tag like -t e=<id>, only accept events with these tags
|
|
||||||
--until value, -u value only accept events older than this (unix timestamp) (default: 0)
|
|
||||||
-e value [ -e value ] shortcut for --tag e=<value>
|
|
||||||
-p value [ -p value ] shortcut for --tag p=<value>
|
|
||||||
|
|
||||||
~> nak count --help
|
|
||||||
NAME:
|
|
||||||
nak count - generates encoded COUNT messages and optionally use them to talk to relays
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
nak count [command options] [relay...]
|
|
||||||
|
|
||||||
DESCRIPTION:
|
|
||||||
outputs a NIP-45 request. Mostly same as req.
|
|
||||||
|
|
||||||
example usage (with 'nostcat'):
|
|
||||||
nak count -k 1 -a 3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d | nostcat wss://nos.lol
|
|
||||||
standalone:
|
|
||||||
nak count -k 1 wss://nos.lol
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
--bare when printing the filter, print just the filter, not enveloped in a ["COUNT", ...] array (default: false)
|
|
||||||
--stream keep the subscription open, printing all events as they are returned (default: false, will close on EOSE)
|
|
||||||
|
|
||||||
FILTER ATTRIBUTES
|
|
||||||
|
|
||||||
--author value, -a value [ --author value, -a value ] only accept events from these authors (pubkey as hex)
|
|
||||||
--id value, -i value [ --id value, -i value ] only accept events with these ids (hex)
|
|
||||||
--kind value, -k value [ --kind value, -k value ] only accept events with these kind numbers
|
|
||||||
--limit value, -l value only accept up to this number of events (default: 0)
|
|
||||||
--since value, -s value only accept events newer than this (unix timestamp) (default: 0)
|
|
||||||
--tag value, -t value [ --tag value, -t value ] takes a tag like -t e=<id>, only accept events with these tags
|
|
||||||
--until value, -u value only accept events older than this (unix timestamp) (default: 0)
|
|
||||||
-e value [ -e value ] shortcut for --tag e=<value>
|
|
||||||
-p value [ -p value ] shortcut for --tag p=<value>
|
|
||||||
|
|
||||||
~> nak decode --help
|
|
||||||
NAME:
|
|
||||||
nak decode - decodes nip19, nip21, nip05 or hex entities
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
nak decode [command options] <npub | nprofile | nip05 | nevent | naddr | nsec>
|
|
||||||
|
|
||||||
DESCRIPTION:
|
|
||||||
example usage:
|
|
||||||
nak decode npub1uescmd5krhrmj9rcura833xpke5eqzvcz5nxjw74ufeewf2sscxq4g7chm
|
|
||||||
nak decode nevent1qqs29yet5tp0qq5xu5qgkeehkzqh5qu46739axzezcxpj4tjlkx9j7gpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet5sh59ud
|
|
||||||
nak decode nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpz4mhxue69uhk2er9dchxummnw3ezumrpdejqz8thwden5te0dehhxarj94c82c3wwajkcmr0wfjx2u3wdejhgqgcwaehxw309aex2mrp0yhxummnw3exzarf9e3k7mgnp0sh5
|
|
||||||
nak decode nsec1jrmyhtjhgd9yqalps8hf9mayvd58852gtz66m7tqpacjedkp6kxq4dyxsr
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
--id, -e return just the event id, if applicable (default: false)
|
|
||||||
--pubkey, -p return just the pubkey, if applicable (default: false)
|
|
||||||
--help, -h show help
|
|
||||||
|
|
||||||
|
|
||||||
~> nak encode --help
|
|
||||||
NAME:
|
|
||||||
nak encode - encodes notes and other stuff to nip19 entities
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
nak encode command [command options] [arguments...]
|
|
||||||
|
|
||||||
DESCRIPTION:
|
|
||||||
example usage:
|
|
||||||
nak encode npub <pubkey-hex>
|
|
||||||
nak encode nprofile <pubkey-hex>
|
|
||||||
nak encode nprofile --relay <relay-url> <pubkey-hex>
|
|
||||||
nak encode nevent <event-id>
|
|
||||||
nak encode nevent --author <pubkey-hex> --relay <relay-url> --relay <other-relay> <event-id>
|
|
||||||
nak encode nsec <privkey-hex>
|
|
||||||
|
|
||||||
COMMANDS:
|
|
||||||
npub encode a hex private key into bech32 'npub' format
|
|
||||||
nsec encode a hex private key into bech32 'nsec' format
|
|
||||||
nprofile generate profile codes with attached relay information
|
|
||||||
nevent generate event codes with optionally attached relay information
|
|
||||||
naddr generate codes for NIP-33 parameterized replaceable events
|
|
||||||
help, h Shows a list of commands or help for one command
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
--help, -h show help
|
|
||||||
```
|
```
|
||||||
|
|
||||||
written in go using [go-nostr](https://github.com/nbd-wtf/go-nostr), heavily inspired by [nostril](http://git.jb55.com/nostril/).
|
### republish an event from one relay to multiple others
|
||||||
|
```shell
|
||||||
## a toolkit for debugging all things nostr as a webpage:
|
~> nak req -i e20978737ab7cd36eca300a65f11738176123f2e0c23054544b18fe493e2aa1a wss://nostr.wine/ wss://nostr-pub.wellorder.net | nak event wss://nostr.wine wss://offchain.pub wss://public.relaying.io wss://eden.nostr.land wss://atlas.nostr.land wss://relayable.org
|
||||||
|
{"id":"e20978737ab7cd36eca300a65f11738176123f2e0c23054544b18fe493e2aa1a","pubkey":"c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5","created_at":1698632753,"kind":1,"tags":[["t","gm"]],"content":"good morning","sig":"5687c1a97066c349cb3bde0c0719fd1652a13403ba6aca7557b646307ee6718528cd86989db08bf6a7fd04bea0b0b87c1dd1b78c2d21b80b80eebab7f40b8916"}
|
||||||
![](https://user-images.githubusercontent.com/1653275/227681805-0cd20b39-de0d-4fcb-abb4-de3283404e8f.png)
|
publishing to wss://nostr.wine... failed: msg: blocked: not an active paid member
|
||||||
|
publishing to wss://offchain.pub... success.
|
||||||
written in [scala](https://scala-lang.org/) with [calico](https://www.armanbilge.com/calico/) and [snow](https://github.com/fiatjaf/snow)
|
publishing to wss://public.relaying.io... success.
|
||||||
|
publishing to wss://eden.nostr.land... failed: msg: blocked: not on white-list
|
||||||
|
publishing to wss://atlas.nostr.land... failed: msg: blocked: not on white-list
|
||||||
|
publishing to wss://relayable.org... success.
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in New Issue
Block a user