Last Notes
You can just refactor your life including your mind ππ₯
#nevent1qβ¦5rg7
#naddr1qqβ¦rwf9
#nevent1qβ¦k3mm
Happy birthday @nprofileβ¦7edf π€
https://blossom.primal.net/9dda1168339bc4d406f71bfafc95fa3dcb547e38ab7b4aead4610a8522bbc10b.mp4
Well done Fish npub.blossom.band... πΈ π₯
https://npub15522kwl0kaf04t44xcvj6py5rhp9hzz936y5qlu48xacnuua4auqpc9emz.blossom.band/aedb5b9103f590499aef7ae8a4fa6391de0d21f08f920b34254485ab5221a250.png
@npub1xtsβ¦kk5s says to write a banger note in replies but since treads are still alpha γ
Current status #catstr is still da shit , yeah amethyst and damus https://image.nostr.build/5429b8ca90466a3e6ea6f8180baef13506c570c2b368080562936dbf69f93a62.jpg
Well shit, there goes ma sweet tooth π€£
https://haven.puhcho.me/87097e7ee5e5ce3ee850755b50c942c91639a47f3cd0fe76bb25fad05579202a.mp4
Tamagochi, nostr style? Brb to wake up the kids :cheers_cat:
#runstr + #wavlale π₯
https://nostr-run-club.vercel.app/
#nevent1qβ¦a24p
https://image.nostr.build/0751e5647a1c2fa458326bba2ed33e1b0a2e949f9fd010042386ff5f9e52aeda.png
π₯σ
σ
σ
£σ
σ
₯σ ²σ
σ ’σ Άσ
€σ
σ ’σ
σ σ
σ Έσ ²σ
ͺσ Ώσ
σ ¨σ
¦σ
σ ’σ Άσ
ͺσ
σ Έσ
σ
₯σ
σ Έσ
σ
σ
σ ’σ
σ
¦σ Όσ
σ ‘σ
σ
σ
σ
σ
σ
σ ’σ Άσ σ
σ
σ
σ ²σ
σ
σ Άσ
σ
σ ±σ ΄σ
σ ‘σ Ήσ
₯σ
σ
σ
£σ σ ±σ
σ
σ ³σ ΅σ
σ ’σ Άσ
σ ±σ
σ Άσ
ͺσ
σ ΅σ ±σ ₯σ
σ ΄σ ΅σ
¨σ Ύσ
σ ΅σ ₯σ ½σ
σ ½σ σ
σ
σ
σ
©σ Ύσ ·σ Άσ
σ
σ
σ
σ ‘σ
σ
σ ½σ
¨σ
σ
σ ±σ £σ ½σ
σ Ύσ
σ ½σ
σ ½σ σ
σ
ͺσ
σ
σ
σ
σ
σ
σ Ύσ
σ Ήσ
§σ Ύσ
σ Άσ
σ Ύσ
σ Ήσ σ
σ
σ
σ σ ½σ ΄σ
σ
σ Ώσ ΄σ Άσ
σ ½σ
σ
σ
σ
σ
σ Ήσ ‘σ ½σ
σ ½σ ₯σ
σ
σ Ύσ
σ Ήσ
σ Ίσ
’σ
σ
£σ ’σ
ͺσ
σ
σ ½σ
‘σ σ
σ ½σ
₯σ Ίσ
σ ¨σ
₯σ σ
€σ ‘σ
£σ
¨σ
σ
σ
¨σ
σ
σ Ήσ
σ Όσ
σ
σ ·σ
σ
σ Άσ Ήσ Ίσ
¦σ
σ
£σ ΅σ
σ Ύσ
σ
σ
σ Ίσ
σ
σ £σ
σ ±σ Ύσ
σ
σ ’σ
σ
σ Ίσ
σ Ύσ
σ
σ
σ ½σ
σ
σ ’σ Ύσ
σ Ύσ
σ ½σ ·σ
σ σ ½σ
ͺσ
σ ’σ ½σ
σ
σ σ ½σ
σ
σ
σ Ύσ
ͺσ
σ
σ Ύσ ’σ Ίσ
σ
σ
σ Άσ
σ Ύσ
σ ½σ £σ Ύσ
σ
σ
©σ ½σ ΄σ Άσ
σ Ώσ
σ
σ
σ
σ ΄σ
σ
σ Ύσ
ͺσ
σ ₯σ
σ
σ Ίσ
σ
σ
σ Ύσ
σ Ύσ ’σ
σ
ͺσ
σ
σ Άσ
σ
σ ³σ ΅σ ΄σ σ ‘σ
σ
σ
σ
¨σ Ώσ €σ
σ
σ
σ Ύσ
σ
σ ¨σ
σ
σ
σ
σ »σ ΄σ
σ
σ ‘σ
σ ΄σ §σ ±σ Ήσ
σ ·σ
σ σ Ήσ
σ
¨σ
σ ’σ ₯σ
σ ©σ ΅σ
σ
σ
σ
σ ΅σ
σ Ήσ ·σ Άσ
ͺσ
σ ΅σ ±σ ‘σ Ύσ ΄σ ²σ
σ ½σ ’σ
σ ₯σ ½σ
σ
σ
©σ
σ
ͺσ Άσ
σ ½σ
σ
σ
σ ½σ ·σ ½σ ’σ ½σ
ͺσ
σ ₯σ Ύσ
σ Ήσ
§σ Ύσ
ͺσ
σ
σ Ώσ ΄σ
σ
¨σ ½σ ·σ
σ
σ Ώσ ΄σ ±σ
©σ
σ ’σ
σ
σ ½σ ΄σ Ήσ
§σ ½σ ·σ Ήσ
©σ
σ
σ
σ σ Ώσ
σ
σ
σ ½σ
σ
σ
©σ ½σ ’σ
σ
σ ½σ
σ Άσ
σ
σ
σ ±σ σ
σ
σ Ύσ
σ Ήσ
σ Ύσ €σ £σ ΄σ σ Έσ
£σ
σ
σ ³σ ’σ ²σ
σ
σ »σ
σ £σ Έσ
σ
σ
σ ΅σ ±σ
σ
σ Ώσ
σ
’σ
σ σ
σ σ ·σ ΅σ ¨σ
σ
σ ₯σ Έσ Όσ
¦σ
©σ
σ »σ Ύσ
σ
σ
σ
σ ±σ
σ
σ Ύσ €σ
σ ΄σ
σ σ ½σ ·σ ½σ
ͺσ
σ
σ ½σ ‘σ Ύσ
σ Ήσ £σ Ύσ ’σ
σ
σ
σ ’σ
σ
ͺσ
σ ·σ
σ σ Ώσ ·σ ½σ
©σ
σ
σ
σ
σ ½σ
σ
σ
σ ½σ ’σ
σ
©σ Ύσ ·σ Άσ
σ
σ ΄σ
σ
σ
σ
σ
σ
σ ½σ ·σ
σ
σ Ύσ
σ ½σ £σ Ώσ ΄σ
σ
σ Ώσ
σ
σ
σ Ώσ
σ
σ
σ ½σ
σ
σ ’σ Ύσ
σ
σ
σ
σ ’σ Ίσ
σ
σ ‘σ
σ
σ ±σ
§σ Όσ
σ
§σ
σ ·σ
¦σ
σ
₯σ σ ³σ
σ
σ ±σ Όσ
σ
σ Έσ §σ Ύσ
σ
σ
§σ
σ
¨σ
σ ΄σ σ ¦σ
σ €σ
σ
σ
§σ
£σ
§σ ©σ
£σ
σ
‘σ
ͺσ ₯σ
https://emoji.paulbutler.org/?mode=decode
But dont put a seed phrase in there π
Yeah seems got picked up but minibits should be ok with these.
https://image.nostr.build/8749b0e7e1c794f024c8f8d64c24dab139115a76871dbab2580281c0705b5c89.png
β‘οΈ https://memeamigo.lol/decode
Kiwi got deprecated in Jan. Still can find old vers.
Nowser works https://github.com/haorendashu/nowser
Something like https://github.com/BandarLabs/gitpodcast , have not laughed on one for awhile. What does it use for speech on the back?
Zap da zap da zap zap da nuts π₯
πσ
σ
σ
£σ
σ
₯σ ²σ
σ ·σ Άσ
€σ
σ ’σ
σ σ
σ Έσ ²σ
ͺσ Ώσ
σ ¨σ
¦σ
σ ’σ Άσ
ͺσ
σ Έσ
σ
₯σ
σ Έσ
σ
σ
σ ’σ
σ
¦σ Όσ
σ ‘σ
σ
σ
σ
σ
σ
σ ’σ Άσ σ
σ
σ
σ ²σ
σ
σ Άσ
σ
σ ±σ ΄σ
σ ‘σ Ήσ
₯σ
σ
σ
£σ σ ±σ
σ
σ ³σ ³σ
σ ·σ Άσ
σ ±σ
σ Άσ
ͺσ
σ ΅σ ±σ
ͺσ Ύσ
σ
σ £σ
σ
σ ΅σ
©σ ½σ
σ
σ ₯σ
σ ΄σ
σ
ͺσ
σ ·σ Ήσ σ
σ
σ ²σ
σ
σ
σ Ήσ σ Ώσ ΄σ
σ
§σ
σ
ͺσ
σ
σ
σ
σ
σ
¨σ
σ
σ ½σ €σ Ώσ ·σ
σ
σ Ώσ ΄σ ½σ
¨σ ½σ ·σ
σ €σ Ύσ
σ Ίσ
σ Ώσ
σ
σ ’σ
σ
σ
σ
§σ
σ
σ
σ
σ Ύσ ·σ Ύσ
σ Ύσ ’σ
σ ‘σ Ώσ
σ
σ
σ
σ
σ Ύσ
σ Ήσ
σ Ίσ ‘σ ©σ
σ ΅σ »σ
σ Έσ
§σ
σ ΄σ
σ Ώσ
σ
σ
σ ·σ ΄σ
σ
σ
σ
σ
σ
σ
σ Άσ
σ »σ
¦σ ΄σ
¨σ ³σ ‘σ Ίσ
σ
§σ ·σ
σ ¨σ ¦σ ²σ
€σ
σ
σ Άσ
σ
σ ’σ Άσ
σ
σ ³σ ±σ
σ ₯σ
σ
σ €σ
σ ·σ
€σ
σ
©σ
₯σ
ͺσ ©σ
σ ΅σ
σ
σ
’σ £σ Ίσ ·σ
σ
σ Ώσ
σ Ώσ ₯σ
σ
σ Ήσ ©σ ΅σ
σ
σ
σ
σ
‘σ Άσ σ ¨σ £σ Όσ ·σ Άσ
ͺσ
σ ³σ ΄σ
’σ ·σ ·σ
©σ Ήσ
£σ ’σ
‘σ
¨σ
σ ©σ Ώσ
‘σ
ͺσ ±σ ²σ ‘σ
σ
σ ©σ
σ Ίσ ΅σ
£σ
σ
£σ
σ
σ
σ Ήσ
¨σ
ͺσ
σ
σ
σ
σ
σ ‘σ Όσ
σ
ͺσ
σ ·σ Άσ
©σ
σ ³σ ³σ
σ
σ
σ ΅σ
‘σ
₯σ
ͺσ ²σ £σ
σ
σ ¦σ
σ
σ
σ ²σ ₯σ
©σ
σ
σ
σ ΅σ
‘σ ¦σ ΄σ
σ Ύσ
σ »σ
σ »σ
’σ
σ
£σ
σ ‘σ σ
σ
¨σ
‘σ
σ
σ »σ
σ
σ
σ
σ
σ
σ
σ £σ
σ ±σ
σ ΄σ Ίσ
σ ½σ
σ
σ
σ
σ
σ
σ
σ Ύσ ΄σ Άσ
σ
σ
σ
σ
σ
σ
σ
σ
§σ ½σ
σ Άσ
σ Ύσ ΄σ
σ
§σ ½σ
ͺσ
σ ’σ ½σ
σ Ήσ
§σ
σ ΄σ Ύσ
σ
σ
ͺσ
σ ‘σ Ύσ
σ
σ
σ Ύσ ·σ
σ
ͺσ ½σ
ͺσ Ύσ
σ Ύσ
ͺσ ½σ
©σ Ύσ ΄σ
σ ‘σ
σ
σ ±σ
ͺσ
σ
σ ΅σ €σ ½σ
σ
σ ’σ Ύσ
σ Ήσ ’σ Ύσ ’σ Άσ
σ
σ ³σ ΅σ ΄σ ±σ »σ ¦σ £σ
σ Έσ
σ €σ Έσ
σ
σ
σ
€σ
σ
σ
σ
©σ
¨σ Ήσ Ώσ
‘σ
¨σ
§σ
¦σ
σ
σ
σ
σ
σ
¦σ ¨σ Ύσ
σ Όσ Όσ
£σ Ώσ
σ σ
£σ ©σ
σ
σ
σ
σ »σ Ύσ
σ
σ
σ
σ
σ
σ Ήσ
¦σ
σ ³σ
¦σ ΅σ
’σ
σ Άσ
ͺσ
σ Ήσ
σ Ύσ
σ Ίσ σ
σ
σ
σ
£σ »σ
σ
σ
σ ’σ
σ Άσ
σ ¨σ »σ
σ ’σ
¦σ ·σ
©σ Έσ
σ
σ
σ
₯σ
σ
σ
σ ‘σ
σ
σ σ ΅σ ΅σ Έσ Ίσ
σ
σ ΅σ
σ Όσ ’σ
σ
σ ‘σ
¦σ
σ
§σ
σ £σ
σ
σ
σ
£σ ³σ ±σ
σ σ
σ
¦σ
σ
σ »σ ¦σ
σ Ήσ σ
σ
€σ
σ
σ
σ ‘σ
σ
σ
σ
σ
σ
σ
σ ¨σ
σ »σ €σ
σ ¨σ ₯σ
σ
σ
σ
σ
σ
σ Ώσ
σ
£σ
σ
σ §σ Ώσ ³σ Έσ
σ
₯σ Άσ
σ
σ €σ Ίσ
σ
σ Όσ Ήσ
σ Έσ
ͺσ ·σ ₯σ ¨σ
’σ
σ
σ
σ
σ Έσ Ίσ
σ
σ
σ ₯σ σ Ήσ ·σ
σ
©σ
σ ’σ σ
σ
σ
σ
σ
₯σ
σ
σ Ίσ
σ
σ Έσ ½
Docstr meets catstr should be taught all up the med school π€£
Uhm, you need to publish on the onion exposed relays and/or spin 1-2 to be reliable. Clients who connect users to nostr through tor could manage. There are relays that relay between both anyway.
Shopstr.store and https://plebeian.market/ have book categories although not audiobooks strictly but may do. If you publish on shopstr that shows in the marketplace tab of a nostr client that supports it like amethyst without the need to publish separately.
@nprofileβ¦ujaz any plans you guys expand Alexandria to audiobooks?
Yes. But also if they are already hosted somewhere, most clients play directly most of the media links, posted in notes like this for example (first chapt of Treasure island on librivox). Eventually someone may make a specific audiobook client over nostr with dedicated nostr kind for this. But for now depending size and format you can upload them if you like to a blossom server, nostr.build , nostrcheck.me , cdn.satellite.earth etc.
https://www.archive.org/download/treasure_island_ap_librivox/treasure_island_01-02_stevenson_64kb.mp3
#nevent1qβ¦9xy7
https://freeross.org/
Ah chorus also supports blossom, nice.
Minibits + nwc + own mint
Not bad at all.
Well now when rss readers start to support nostr: lets get the opml ready and see which one of y'all writes long forms π€£ also good luck to njump loading ol that π€£
https://cdn.nostrcheck.me/3970657ccb35e30e56e9bcdee0be283b0e853fa31a0be9b5a98c77262583f42f.jpeg
Feeder is alright.
https://cdn.satellite.earth/3f8f6a26287c2cd51ea061dea2069dc1838070e144372f94021b1eeb44532639.mp4
:bitcoin_spin:
https://blossom.puhcho.me/21b9dcdc58ad344105388f3348c1c3761a4148afab77c4b8604c7e3fd4da852d.jpeg
AntennaPod is fine
https://cdn.nostrcheck.me/743c5d5175ce1388aec4370f1a8f563a218cd11a69fa5d6af4e7f2c224e4990a.jpeg
https://blossom.puhcho.me/32148464d24bf8bd0cb618f97a74931a44e59136ee3f619e3fe248cb05b2f894.mp4
Bahahahah
https://cdn.nostrcheck.me/327badcadac0e0af4579e2f8159789a2a001351cd7ee8f2dbfabf86cc9cbf4e0.jpeg
https://cdn.nostrcheck.me/4c2f846e0bd1248e17ab7bc71a91b2dfa73a23bb01cf336e24183c4b9dd627a8.jpeg
#nevent1qβ¦lfgj
The best article about #nostr user experience for the last year, hands down π€
#nevent1qβ¦96ep
https://youtu.be/BL5vUVQvmX4
http://blossom.puhcho.me/1c01c7e3117aa537265787d3d489d6967f4cbfad1d443eee52e8a8dcee575d43.gif
If you make it longer, we may go nuts π€
#nevent1qβ¦60g3
Btw teemux on the phone compiles amethyst pretty nicely. Hot but nice, going for the ocean π€£
Like I said preference. Same opinion is about pronouns.
No prob. Termux is your fren +
https://github.com/hzrd149/blossom-server.git
There is blossom-drive as well if you want it. But with many nostr clients who support blossom like amethyst, nostomo and nostrudel, its up to a preference. Haven and chronicle relays also can run there which save the other bits, and support it.
Well I run one blossom on the phone as a true degen π€£ thankful for the upstreams.
@nprofileβ¦xttw you good?
One go as blossom.puhcho.me is configured to upstream to the others. I should put cdn.satellite.earth in there but I use it with an alt pub. Anyways πΈπ
Lfg πΈπ₯
Uploaded to blossom, went to haven π, and nostrcheck without the extention, fuck knows what hash is on primal π.
http://blossom.puhcho.me/3b3cd28aa8fd5f2f9dfad973c7cfe6a5e3f61f5d6e3600a2257f4300f4aa636d.jpeg
@nprofileβ¦al0v and this may help a bit:
https://github.com/nbd-wtf/go-nostr/tree/master/nip86
I'm still running an older vers of hostr but blossoms will be great. 5394, 93, 92 and so on...
https://github.com/studiokaiji/nostr-webhost/tree/main
Baths,amigo, baths.
https://image.nostr.build/441e33e2b465921c343088c8dbde7e8460d21966452d49b6cd0109e209759e7e.jpg
https://video.nostr.build/9f2a5e004bce4379af4d779fac9d15a3176d7b7d740f2f0c5dd55c973945e4ec.mp4
Amethyst πΈ support incoming in 3,2,1 ... π₯
Fyi cdn.nostrcheck.me and cdn.satellite.earth will do great in your options, plus if you run haven. As because I am too lazy to hop to the strudel and nostromo just for the blossom support. Btw if primal stops fucking up the hash, blossom.primal.net will do too. The whole point is to find the file everywhere and to get delivered no matter which one of the πΈ works at the time.
#nevent1qβ¦dk57
:rock_it:
https://cdn.satellite.earth/2f4f99c4277f5afcb9cc1f7ec2bd614f361e0b25878c3340931fd49e0d60e302.jpg
Anything that uses nostr-login really ( nostr.band , amethyst.social , hivetalk etc). The bunker url is buried in advanced though.
My study shows that cats have 32 muscles in each ear to help them do exactly the above.
https://image.nostr.build/fd7daa50c22c5442f65f0bf6fea5fedf2a3d43428f1f062d436d14052d8a1614.png
PV #catstr π€
#nevent1qβ¦mx80
"Access-Control-Allow-Methods": "GET,HEAD,PUT,POST,OPTIONS", "Access-Control-Allow-Headers": "Authorization, Content-Type"
π€
https://haven.puhcho.me/302013b538527f37c86c836c87bcdbd9542a1865d5fdc9bac2d3375eee40aa02.jpg
Catstrr looks great there @nprofileβ¦xttw
#nevent1qβ¦4mcc
Absolutely. Especially on government waters.
https://cdn.nostrcheck.me/1dee665e409f902037cd354ba751a6d23273cc7c65f58043f962f7e01cdc0777
Try to, microapps for different things, also the idea is for frens to get onboarded to nostr. Which reminds me onosendai and fanfares.io should be in there too.
Yeah that's my deck π the idea is from webcore.live but wanted straight easier management. I find the N fallback funnier and don't want an api.
https://image.nostr.build/9c281ac482006a564c2649bc66ad023f15f2da1a2d0247aaba656b28b33da8ae.jpg
Yes π€£
https://image.nostr.build/a9b6d9d5f78b19ed5d292bbfa570a359a13af85a246a721bed6baa615ae5893f.jpg
https://cdn.satellite.earth/7d70aeb344a04b8185f34ec62aede724dd2571e28aa90ea6d9261cdf6c569857.gif
Second. They are already in gallery if shared. The ui would be good to have quote in note from that but amethyst is not there yet. So you just put the note id like this
#nevent1qβ¦csdf
Catstr is very popular in the hosehold, also the mandalorian π€£ then quoting the note id the gif is in from the gallery in a note, reply etc. If you already have a gif folder, that goes up easy. Or scraping tenor etc for old movies gifs and so on.
#nevent1qβ¦s7yn
Autoupload them to blossoms for the kids so they can send whatever they like to amethyst's gallery. Then note id etc.
https://video.nostr.build/94e07f0010d96c85d033e11b6cfa92ff82aa33769d9a089f3ce007be4454267f.mp4
@nprofileβ¦c7hj we need nostrava π€
#nevent1qβ¦tc8y
Mmm iris.to is becoming a goto client. Need cashu zaps.
https://image.nostr.build/445961ae98a7d9094240ca49cd85d571e4469b4b90fd078998a4f289a428303b.jpg
#nevent1qβ¦9u0y
Me, playing with enhanced rss to listen to frens pubs from the podcasts apps and zap them from there(pulls the lud16).
Some podcast apps are... that is not just for e mail, bitch. Catch the f up.
#nevent1qβ¦r48k
#nevent1qβ¦4gtr
Starting with basics #onosendai
https://v.nostr.build/q4pb1nHAyEFugCR3.mp4
Hello from https://lumilumi.vercel.app/
https://nostrcheck.me/media/955433096fca223f29adfd52a0c2de07a3c52eb680f9b4d9eb6c46d9196c540e/d57d9a372276cb57c5ba7503fe6dc30d6e06c12e11d464f8a90df7f360a8f4cd.mp4
The relay, THE RELAY π€£π₯
#nevent1qβ¦9h0m
Flare.pub for music videos.
Fanfares.io for podccasting (mp3 supports etc)
You can host yoyr files on cdn.satellite.earth (small sat fee per GB/month) and post the links in nostr notes or elsewhere.
Yeah I don't care about some dickhead that every now and then discovers spamster or makes one, I like the reply girls that are a fan of @nprofileβ¦kdtx and blossom up the ai response (the primal one). Now that's an effort hahah.
https://image.nostr.build/a7e76025376f2266935313b80145eb582ef2c69c27cc14c89786e6514b00fa38.jpg
Ahaha gotta love nostr. @nprofileβ¦xw8z check this out. Wanted to play with @nprofileβ¦06yf nostr-rss (which nostter.app uses, but could be used with any web nostr client) to turn some(any) pubs rss(with media in notes) to be used by podbean and podcast republic which handle video (antennapod trots the m3u8 support as well so meh) and now you are on my podbean playlist so keep the good stuff coming π€£π€ Sharing from the pod apps to oxchat and geting the dms on amethyst is π₯
https://cdn.satellite.earth/7863513e4d61f7eeb52ba1c9c83070ac57264616bcbc2ec9432b9680da506180.mp4
```
import { NSecSigner, NRelay1, NSchema as n } from '@nostrify/nostrify';
import { BlossomUploader } from '@nostrify/nostrify/uploaders';
import * as nip19 from 'nostr-tools/nip19';
// Helper function to convert a hex string to Uint8Array
function hexToUint8Array(hex: string): Uint8Array {
if (hex.length % 2 !== 0) {
throw new Error("Hex string must have an even length");
}
const array = new Uint8Array(hex.length / 2);
for (let i = 0; i < hex.length; i += 2) {
array[i / 2] = parseInt(hex.substr(i, 2), 16);
}
return array;
}
// Function to read uploaded files from JSON
async function readUploadedFiles(uploadedFilesPath: string): Promise<Set<string>> {
try {
const data = await Deno.readTextFile(uploadedFilesPath);
return new Set(JSON.parse(data));
} catch {
return new Set();
}
}
// Function to write uploaded files to JSON
async function writeUploadedFiles(uploadedFiles: Set<string>, uploadedFilesPath: string) {
await Deno.writeTextFile(uploadedFilesPath, JSON.stringify(Array.from(uploadedFiles)));
}
// Function to append a URL to a text file
async function appendUrlToFile(fileUrl: string, urlFilePath: string) {
try {
await Deno.writeTextFile(urlFilePath, fileUrl + '\n', { append: true });
console.log(`Appended URL to file: ${fileUrl}`);
} catch (error) {
console.error('Error appending URL to file:', error);
}
}
// Function to sign, parse, and upload a media file
async function signAndUploadMedia(
filePath: string,
uploadedFiles: Set<string>,
urlFilePath: string,
signer: NSecSigner,
relays: { relay: NRelay1; url: string }[]
) {
try {
// Check if the file has already been uploaded
if (uploadedFiles.has(filePath)) {
console.log(`File ${filePath} has already been uploaded. Skipping.`);
return;
}
// Get the public key from the signer
const pubkey = await signer.getPublicKey();
// Initialize the uploader
const uploader = new BlossomUploader({
servers: [
'https://cdn.satellite.earth',
'https://nstore.nostrver.se',
'https://blossom.puhcho.me',
'https://blossom.primal.net',
'https://cdn.nostrcheck.me'
],
signer: signer,
});
// Read the file
const fileBuffer = await Deno.readFile(filePath);
const file = new File([fileBuffer], filePath.split('/').pop()!);
// Upload the file and get the tags
const tags = await uploader.upload(file);
// Find the URL in the tags
let fileUrl = 'Unknown URL';
for (const tag of tags) {
if (tag[0] === "url" && tag[1]) {
fileUrl = tag[1];
break;
}
}
// Append the URL to the text file
await appendUrlToFile(fileUrl, urlFilePath);
// Create event data
const eventData = {
kind: 1,
content: `${fileUrl}`,
tags: tags,
created_at: Math.floor(Date.now() / 1000),
};
// Sign the event to get id and sig
const signedEvent = await signer.signEvent(eventData);
const completeEventData = {
...eventData,
id: signedEvent.id,
pubkey: pubkey,
sig: signedEvent.sig,
};
// Parse and validate the complete event data using NSchema
const event = n.event().parse(completeEventData);
console.log('Parsed and validated event:', event);
// Send the event to each relay
for (const { relay, url } of relays) {
try {
console.log(`Sending event to relay ${url}`);
await relay.event(event);
console.log(`Event sent successfully to ${url}`);
} catch (error) {
console.error(`Error sending event to relay ${url}:`, error);
} finally {
try {
await relay.close();
console.log(`Relay ${url} closed`);
} catch (closeError) {
console.error(`Error closing relay ${url}:`, closeError);
}
}
}
// Add the file to the uploaded files set and update the JSON file
uploadedFiles.add(filePath);
await writeUploadedFiles(uploadedFiles, './uploaded_files.json');
console.log("Done!");
} catch (error) {
console.error('Error signing and uploading media:', error);
}
}
// Function to select a random valid file from a folder
async function getRandomValidFileFromFolder(folderPath: string, uploadedFiles: Set<string>): Promise<string | null> {
const validExtensions = ['jpg', 'mp4', 'webp', 'gif'];
const files: string[] = [];
for await (const dirEntry of Deno.readDir(folderPath)) {
if (dirEntry.isFile) {
const extension = dirEntry.name.split('.').pop()?.toLowerCase();
if (extension && validExtensions.includes(extension)) {
files.push(dirEntry.name);
}
}
}
// Filter out files that have already been uploaded
const unuploadedFiles = files.filter(file => !uploadedFiles.has(`${folderPath}/${file}`));
if (unuploadedFiles.length === 0) {
console.log('All files have been uploaded. Selecting a random URL to publish.');
return null;
}
const randomIndex = Math.floor(Math.random() * unuploadedFiles.length);
return `${folderPath}/${unuploadedFiles[randomIndex]}`;
}
// Function to publish a Nostr event with a random URL
async function publishRandomUrlEvent(urlFilePath: string, signer: NSecSigner, relays: { relay: NRelay1; url: string }[]) {
try {
const urls = (await Deno.readTextFile(urlFilePath)).trim().split('\n');
if (urls.length === 0) {
console.error('No URLs found in the URL file.');
return;
}
const randomUrl = urls[Math.floor(Math.random() * urls.length)];
// Create event data
const eventData = {
kind: 1,
content: `${randomUrl}`,
tags: [],
created_at: Math.floor(Date.now() / 1000),
};
// Sign the event to get id and sig
const signedEvent = await signer.signEvent(eventData);
const completeEventData = {
...eventData,
id: signedEvent.id,
pubkey: await signer.getPublicKey(),
sig: signedEvent.sig,
};
// Parse and validate the complete event data using NSchema
const event = n.event().parse(completeEventData);
console.log('Parsed and validated event:', event);
for (const { relay, url } of relays) {
try {
console.log(`Sending event to relay ${url}`);
await relay.event(event);
console.log(`Event sent successfully to ${url}`);
} catch (error) {
console.error(`Error sending event to relay ${url}:`, error);
} finally {
try {
await relay.close();
console.log(`Relay ${url} closed`);
} catch (closeError) {
console.error(`Error closing relay ${url}:`, closeError);
}
}
}
console.log("Published random URL event successfully!");
} catch (error) {
console.error('Error publishing random URL event:', error);
}
}
// Main function to execute the script
async function main() {
const hexSecretKey = Deno.env.get('SECRET_KEY_HEX');
if (!hexSecretKey) {
console.error('Environment variable "SECRET_KEY_HEX" is not set.');
Deno.exit(1);
return;
}
const secretKey: Uint8Array = hexToUint8Array(hexSecretKey);
// Initialize the signer with your secret key
const signer = new NSecSigner(secretKey);
// Define the relay URLs
const relayUrls = [
'wss://nostr.mom',
'wss://nos.lol',
'wss://relay.primal.net',
'wss://e.nos.lol',
'wss://relay.damus.io',
'wss://nostr.lu.ke',
'wss://nostr.oxtr.dev',
'wss://relay.nostrcheck.me',
'wss://nostr.data.haus',
'wss://ditto.puhcho.me/relay',
'wss://offchain.pub',
'wss://strfry.iris.to'
];
// Create an array of NRelay1 instances with their URLs
const relays = relayUrls.map(url => ({ relay: new NRelay1(url), url }));
// Path to the JSON file that stores uploaded files
const uploadedFilesPath = './home/user/test_bloom/uploaded_files.json';
// Path to the text file that stores uploaded URLs
const urlFilePath = './home/user/test_bloom/uploaded_urls.txt';
// Example usage
const folderPath = Deno.env.get('MEDIA_FOLDER_PATH');
if (folderPath) {
try {
const uploadedFiles = await readUploadedFiles(uploadedFilesPath);
const randomFilePath = await getRandomValidFileFromFolder(folderPath, uploadedFiles);
if (randomFilePath) {
await signAndUploadMedia(randomFilePath, uploadedFiles, urlFilePath, signer, relays);
} else {
await publishRandomUrlEvent(urlFilePath, signer, relays);
}
} catch (error) {
console.error('Error during execution:', error);
} finally {
Deno.exit();
}
} else {
console.error('Environment variable "MEDIA_FOLDER_PATH" is not set.');
Deno.exit(1);
}
}
// Execute main function
main();
```
Better as it was uploading to just one blossom.
Yo, my favorite new blossom+deno to nostr shit is to scrape tenor #catstr gifs and πΈ them up now that nostrcheck is in as well, thanks to @nprofileβ¦69jx @nprofileβ¦al0v and the heads up of @nprofileβ¦s3js instagram script.
#nevent1qβ¦hnsz
```
import { NSecSigner, NRelay1, NSchema as n } from '@nostrify/nostrify';
import { BlossomUploader } from '@nostrify/nostrify/uploaders'; import * as nip19 from 'nostr-tools/nip19'; // Helper function to convert a hex string to Uint8Array function hexToUint8Array(hex: string): Uint8Array { if (hex.length % 2 !== 0) { throw new Error("Hex string must have an even length"); } const array = new Uint8Array(hex.length / 2); for (let i = 0; i < hex.length; i += 2) { array[i / 2] = parseInt(hex.substr(i, 2), 16); } return array; } // Retrieve the secret key from an environment variable const hexSecretKey = Deno.env.get('SECRET_KEY_HEX');
if (!hexSecretKey) { throw new Error('Environment variable "SECRET_KEY_HEX" is not set.'); } const secretKey: Uint8Array = hexToUint8Array(hexSecretKey); // Initialize the signer with your secret key const signer = new NSecSigner(secretKey);
// Define the relay URLs
const relayUrls = [
'wss://nostr.mom', 'wss://nos.lol', 'wss://relay.primal.net', 'wss://e.nos.lol', 'wss://relay.nostr.band' ];
// Create an array of NRelay1 instances const relays = relayUrls.map(url => new NRelay1(url)); // Path to the JSON file that stores uploaded files
const uploadedFilesPath = './uploaded_files.json'; // Function to read uploaded files from JSON async function readUploadedFiles(): Promise<Set<string>> {
try { const data = await Deno.readTextFile(uploadedFilesPath); return new Set(JSON.parse(data)); } catch { return new Set();
} }
// Function to write uploaded files to JSON
async function writeUploadedFiles(uploadedFiles: Set<string>) { await Deno.writeTextFile(uploadedFilesPath, JSON.stringify(Array.from(uploadedFiles))); }
// Function to sign, parse, and upload a media file async function signAndUploadMedia(filePath: string, uploadedFiles: Set<string>) { try {
// Check if the file has already been uploaded if (uploadedFiles.has(filePath)) {
console.log(`File ${filePath} has already been uploaded. Skipping.`); return; }
// Get the public key from the signer const pubkey = await signer.getPublicKey();
// Initialize the uploader const uploader = new BlossomUploader({
servers: [ 'https://cdn.satellite.earth',
'https://nstore.nostrver.se',
'https://blossom.puhcho.me',
'https://blossom.primal.net', 'https://files.v0l.io/', 'https://cdn.nostrcheck.me' ],
signer: signer, // Use the signer for authentication
}); // Read the file const fileBuffer = await Deno.readFile(filePath);
const file = new File([fileBuffer], filePath.split('/').pop()!);
// Upload the file and get the tags const tags = await uploader.upload(file);
// Find the URL in the tags let fileUrl = 'Unknown URL';
for (const tag of tags) {
if (tag[0] === "url" && tag[1]) {
fileUrl = tag[1];
break; } } // Create event data
const eventData = { kind: 1,
content: `${fileUrl}`,
tags: tags, created_at: Math.floor(Date.now() / 1000), };
// Sign the event to get id and sig
const signedEvent = await signer.signEvent(eventData);
const completeEventData = {
...eventData, id: signedEvent.id, pubkey: pubkey, sig: signedEvent.sig,
};
// Parse and validate the complete event data using NSchema
const event = n.event().parse(completeEventData); console.log('Parsed and validated event:', event);
// Send the event to each relay for (const relay of relays) { console.log('Sending event to relay:', relay); console.log(await relay.event(event));
await relay.close(); } // Add the file to the uploaded files set and update the JSON file uploadedFiles.add(filePath); await writeUploadedFiles(uploadedFiles);
console.log("Done!");
} catch (error) {
console.error('Error signing and uploading media:', error);
} } // Function to select a random valid file from a folder
async function getRandomValidFileFromFolder(folderPath: string, uploadedFiles: Set<string>): Promise<string | null> { const validExtensions = ['jpg', 'mp4', 'webp', 'gif']; const files: string[] = []; for await (const dirEntry of Deno.readDir(folderPath)) { if (dirEntry.isFile) {
const extension = dirEntry.name.split('.').pop()?.toLowerCase(); if (extension && validExtensions.includes(extension)) { files.push(dirEntry.name); } }
} // Filter out files that have already been uploaded const unuploadedFiles = files.filter(file => !uploadedFiles.has(`${folderPath}/${file}`));
if (unuploadedFiles.length === 0) { console.error('No unuploaded valid files found. Please add new JPG, MP4, or WEBP files.');
return null; } const randomIndex = Math.floor(Math.random() * unuploadedFiles.length);
return `${folderPath}/${unuploadedFiles[randomIndex]}`;
}
// Example usage
const folderPath = Deno.env.get('MEDIA_FOLDER_PATH');
if (folderPath) { readUploadedFiles().then((uploadedFiles) => {
getRandomValidFileFromFolder(folderPath, uploadedFiles).then((randomFilePath) => { if (randomFilePath) {
signAndUploadMedia(randomFilePath, uploadedFiles);
}
});
});
} else {
console.error('Environment variable "MEDIA_FOLDER_PATH" is not set.');
}
```
Also puts amethyst gallery to good use:
https://v.nostr.build/ICPPrle8VODjFOPV.mp4
Shinoa is playing.
#nevent1qβ¦zdz3
Nah, just for that 1.23.0 is fine.
Running utxo's relay on the phone to see how it will "go". The go vers was too up, and had to change the db to sqlite, but overall ok. Khartu runs well there, could be onioned, changed some prefered relays π€
https://image.nostr.build/b1ce886834915ce4c4f806e207758b136f05935da1479b7b70a56997ca0ec365.jpg
Amethyst. Just open the pic post itself. The geotag is there.
London is London.
https://image.nostr.build/6dd28566e92bc814d496e126bc565a76ec0dd454ea4799e6e27bfb8b3dadb2ec.jpg
#nevent1qβ¦ke0p
#nevent1qβ¦s42k
Run you own or join the ditto pub. It's fun π€
https://gitlab.com/soapbox-pub/ditto
wss://cobrafuma.com/relay
#nevent1qβ¦8s2g
Ditto:
https://cdn.satellite.earth/65721a07c13d86daa88d4b100398830394372aa91cb364e50f64cb9a5fe15c83.mp3
You build your own global with this to include the feeds of the pubs you like to see on your ditto. Nice.
#nevent1qβ¦59cs
Yeah. The problem with the general rss is that for the podcasts it needs the enclosure url part to be able to play. So till fanfares.io is ready π₯(npub.pro does the rss just for whoever makes a site there), I just used nostter rss generation tool from Snowcait's nostr-rss with a little add :
https://image.nostr.build/bbb0c5541aa21a391ad2907e87276e44a1dc61e23679eac2d7297ff27ecd8962.jpg
That way it plays the links in the kind 1 in antennapod, podcast republic, podcast addict etc. Like supertestnet's hit (hosted on satellite) π₯π€£ from @nprofileβ¦jwhn or turns any pub to podcaster as long as they have the links in the notes. Could be nostter, nostrudel, nostr band etc. Works with forked notes as well.
Like this on antennapod:
https://video.nostr.build/b71b245ccdd99b3ad3f0c0101632212b4470bfc5f7314b457913afd3362c1547.mp4
This ran on localhost for the test, the general rss pull will be whatever domain/npub with the modified tool. Fountain picks up the feed but does not play it, not sure as the app crashes for me.
@nprofileβ¦yw74 could that type of list eventually open in the app as well from the naddr to filter the map for the specific npub? Would be pretty cool π₯
@nprofileβ¦rv29 's pollerama ? https://pollerama.fun/
πΈ nostrcheck π₯
#nevent1qβ¦5k57
Stuff in progress:
https://github.com/orgs/HORNET-Storage/repositories
Shit, one good cat. His relay is still up, so who knows...
Well I know that supertestnet said it is not practical for zaps but I wanted to spin a nutshell mint on the phone to test between amethyst and oxchat and then bankify it to zap some catstr content. Not bad at all. Apart from the extentions concern, at least the mint can rugpull only if the backend goes bye.
https://image.nostr.build/ada61bde061c770cb3d99f62f3146ef40a2b74b3adfe7ae57dceae5d3f9d5a28.jpg
https://image.nostr.build/a8dd0a47681e4a634aa9ecf8e64408d88044c9f0ecb2ed87c7aa951ccc78aca7.jpg
Nice. Other clients may adopt π€
https://image.nostr.build/0c130aff5edb9cd529faab9a86209a89eed30d7879f25000745107fe32da68a1.jpg
Stay ungovernable π₯π€
https://image.nostr.build/b3c2d1372c44c4801fbabb278eb470c5e3983e770e5973f353e5e9ffee979293.jpg
Forget the spoot. That's groovy.
https://blob.satellite.earth/d40a636c09786312e9c43326ad5002e938a378fc5695bb88e387b64f12b868fc
You can get the online ones at the moment from https://api.nostr.watch/v1/online clean up the list a bit and use something like :
```
#!/bin/bash
input_file="cleaned_relays.txt"
output_file="relay_nips_output.txt"
specific_nip=45
> "$output_file"
while IFS= read -r relay; do echo "Querying $relay"
relay_name=$(echo "$relay" | awk -F[/:] '{print $4}')
response=$(curl -s --max-time 10 -H "Accept: application/nostr+json" "$relay")
nips=$(echo "$response" | jq '.supported_nips | @csv' | tr -d '"')
if echo "$nips" | grep -q "\b$specific_nip\b"; then echo "Supported NIPs for $relay_name ($relay): $nips"
echo "Relay Name: $relay_name" >> "$output_file" echo "Relay URL: $relay" >> "$output_file" echo "Supported NIPs: $nips" >> "$output_file" echo "" >> "$output_file"
fi done < "$input_file"
```
Takes awhile but will give you something like this:
https://image.nostr.build/03fb659b72c322044036c9838879451dc3c526fc07c55c9f1d0bf3e04706745b.jpg
#nevent1qβ¦t6ml
#nevent1qβ¦nxpl
Oh yeah #nostr tip π₯
https://image.nostr.build/07b2b491adb3b70965e551199db513ba9fed255fba96c6cbbd1a536f105ea611.jpg
https://image.nostr.build/5f8724cacf95c000256aa57faeec8af4663e8e9b411ab80fe598ee39197143a1.jpg
#nevent1qβ¦fqrx
π₯π₯π₯ @nprofileβ¦nr5s help this man to get to the 58k ladies π€£
#nevent1qβ¦dq7g
No no need for local, I can see the get req to damus. Was just wondering about the nostr settings are for as it does not seem to ask anything on the user side.
Yeah looks good. Anon π€ the nostr gen anon keys does not stick in there though, work in progress?
https://image.nostr.build/92d257a1b2f29cc8bbf16cdd3c33c7a555eab153fbc39d8c3fbad1164e499c18.jpg
https://image.nostr.build/d1074bb6823fc5c7cdb508520c8f5b4d3513670fb3a397d3beb1d2ba258ceaf2.jpg
Anyone there still want to try that? π€
#nevent1qβ¦32zk
Nice. Zapped on mobile as it works with kiwi and lemur in desktop mode. But a native mobile friendly view would be great π€
https://image.nostr.build/0252d34ff6aaa340ba5bea463d688e3ae66e0bbc5b95523699cb977341953903.jpg
Apparently it could mean loosing money. The good news? It's fiat, not bitcoin π€£
This shit is nutz π€
https://blob.satellite.earth/0f60dcd70034191641a1935d15bf31cae26400929e54824829f734c811828023
Use these:
https://nstore.nostrver.se/73e5883d39d71ba6c53443683e3a500895cbb66cc94f9ec6888515c26f808181.jpeg
PastaGringo had some issues and closed the fractalized one but the rest work, apart from the last one(it is limitted by npub for my personal use). Thanks hzrd, the server works great π€
Zapped directly on wavlake. Great music π€
Open about the trade offs for sure.
https://proton.me/blog/proton-wallet-security-model#:~:text=Proton%20Wallet%20is%20a%20digital,easy%20to%20use%20as%20email.
#nevent1qβ¦wqht
#nevent1qβ¦grcs
Base 64 is... it is what it is π₯
#nevent1qβ¦khac
Dunno about your gallery but wait till you find out you can add any npubs media to it. A whole other level of selected meme shitposting and visual bookmarking just dropped in π€£π€
There goes Asimov's pleb "fine tuning" π€£
Something like https://github.com/bordalix/nostr-backup ?
Nostr-jp, satlantis.io waits for a Tokyo entry π€
Wikipedia and "journalism"
https://i.giphy.com/26tP41fh76vmLO3iU.webp
Ah shit. Here is a touching crying one.
app.suno.ai
https://cdn1.suno.ai/5bbb2c6a-d6c4-44d6-a667-9f627e535846_0.mp3
#nevent1qβ¦c4vp
Must have overslept markdown in bio in amethyst along the way. Neat.
https://image.nostr.build/c2344fe57fc8b911b91c4f88b763554b95f44c5a9d416f3aedf158238d6c2841.jpg
Depends. This one was orphaned to nostr.mom #nevent1qβ¦4h7d
Microblog crossposts to nostr.
https://www.manton.org/2023/05/31/introducing-nostr-crossposting.html
@npub1ae4β¦7ul9
Not sure, try to clear your app cache, changed devices here since the time as well, also amethyst vers, still works for me to load new sets. Loading it because there are too many to fit screen is another story though.
Just updated amethyst with zap.store . Bye translations π€£ as it pulls the fdroid vers. Nice and smooth though. The good news? The cloned 777 vers and the compiled from source on the phone from play are still there. On amber it says installed vers is higher, no down.
Ite puer te ipsum π€£π₯
#nevent1qβ¦5mp2
Found this note with @npub10deβ¦smc8
The other one I like is @npub15g2β¦r4xn
https://nostrudel.ninja/#/dvm
#nevent1qβ¦lwdl
Nip52 + a fee tag + zaps to pay a ticket.
Looks good. Transmit accordingly π€
#nevent1qβ¦v7mm
DVMs for audio notes clients on blossoms and stuff π€
https://i.current.fyi/plebai/audio/speech/ac5009d6-f73d-4bc0-9491-6587df8c1a87.mp3
https://image.nostr.build/21793f1b17ea1cc61cc35bb3f8299d83fe9301f13a315ddab55a7286cff6fbcf.jpg
This is an option. It wraps media as 1064 on the kv for free, could be used with a bucket with nip96 as well and thru the app's input choice, as backup is not bad either. The problem is that 1064 is supported only in nostrmo and does not display elsewhere.
#nevent1qβ¦ssaa
Amethyst add. I made these in the emojis-iota.vercel.app