Last Notes
@npub1jt9…la9y
great ep. with Martti
https://m.youtube.com/watch?v=mZ8vA8vj5Cw
https://m.youtube.com/watch?v=eTOKXCEwo_8
中国有很多智慧,都是教人变小,这造成我们这个民族内敛、吃苦耐劳的性格,同时也造成我们这个民族不习惯表达个人观点,逆来顺受。
我看到了太多教人如何与人相处、如何做事的格言,这些格言每一条都在教人变小。而教人变小的前提全都假设了人性的阴暗。
难道我们中国人说个话,也全都是算计、套路?面对别人,任何时候都要藏着掖着、防备着?坦诚是一种缺陷,玩阴谋诡计,耍小聪明,才是正常人生?
所以,每看到一些教人办公室厚黑学的帖子,我就恶心。我们中华民族如果继续被这种智慧支配,我们这个民族永远活在粪坑里,活在泥沼里,爬不出来。
教人变小的哲学,真的很坏,很卑劣。人性不可能像他们想象的那么黑暗,肯定别人,才能饶恕自己。否则,把别人都想象的黑暗不堪,自己也不可能光明。
教人变小的哲学,我呸!
中共政治局公布三中全会会期 习近平再次面临政治考验王剑每日观察20240627
https://link.storjshare.io/raw/jwnk3olt6uimiwvpfl4bd7y3hp4a/production/659368b5fdbd46b27d0f27ea6f0ee48e4b22c1bad06c8bb9ed942a2ebb4e9bb4.MP4
Today Closing Account Status (6/27/2024):
Hey Human:
This trading account was opened with 100,000 USD on 01-10-2024. All the signals issues at 9:25 am ET are placed on this account. Every trade is 15% or less of the buying power at that moment.
Equity: $26260.16 (Total Gain/Lost: -73.74%)
Previous Equity: $26250.02
Day Change: $10.14 (0.04%)
Position Market Value: $14501.97
https://nostroz.com/portfolio_20240627.png
https://nostroz.com/positions_20240627.png
https://weibo.com/6293681691/5049896023621919
一看到评论区的支批我就觉得当年日本人太心善了
https://m.primal.net/JAFk.mp4
Last 7 days zaps: 479841.
https://nostroz.com/zap_stats_7_new_20240627.png
Last 30 days zaps: 985233.
https://nostroz.com/zap_stats_30_new_20240627.png
Last 90 days zaps: 1736194.
https://nostroz.com/zap_stats_90_new_20240627.png
2024-06-27
Unfortunately we live in a time where no one thinks for themselves because it's "too hard" or "too confusing"... Well, have fun staying poor #bitcoin
习近平版科技大跃进 丁薛祥领衔主演中菲冲突新阶段菲律宾打出台湾牌王剑每日观察20240626
https://link.storjshare.io/raw/jvtinq42273tndkfc7iraijg3vtq/production/dc6b9fa8829c3c417e25f7cc8f44483155e12f9f2aa2dd72d0efc326ffcc7083.MP4
中国经济滑落,中产返贫肉眼可见解放军炸掉了福特号标靶王剑每日观察20240626
https://link.storjshare.io/raw/jwits3pnqyckmxwf4yq4uvfjhmhq/production/3d93a8f0976f1eb7751e4120a8c3a9624452a30f14448ac1c5b5ce25adf362b3.MP4
任志强还在微博上表示跟一帮朋友交流后,一致认为新领导人上台,是一个令人兴奋值得期待的新时代。也不知道这帮朋友有没有他这么惨
Today Signal (6/27/2024):
Long FDX -- ENTRY: place stop at 296.87 EXIT: limit 321.89, stop loss 281.41
https://nostroz.com/296.19000244140625_9.72_Long_287.14_FDX_296.87_7.34_1d_a9b26bbc-3488-11ef-80fe-5b76ca88fa10.png
Long SNA -- ENTRY: place stop at 262.55 EXIT: limit 264.65, stop loss 261.25
https://nostroz.com/261.7300109863281_3.4_Long_259.14_SNA_262.55_15000.0_1d_ab88ecea-3488-11ef-80fe-5b76ca88fa10.png
Short TJX -- ENTRY: place stop at 110.12 EXIT: limit 109.09, stop loss 110.75
https://nostroz.com/110.54000091552734_1.66_Short_111.79_TJX_110.12_15000.0_1d_ad3dd82a-3488-11ef-80fe-5b76ca88fa10.png
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
Today Signal (6/27/2024):
Long FDX x(1-2), entry: 297.67, exit: 288.36, trail: 8.50,
Long SNA x(1-3), entry: 262.61, exit: 259.31, trail: 3.23,
Short TJX x(3-7), entry: 110.10, exit: 111.71, trail: 1.58,
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
天朝企业文化就那样,无论盈利高低,无论是否摘下皇冠上的明珠,剥削无产阶级那是少不了的
配图已经超越老蛮了,毕竟你的配图才是必须的精神食粮啊哈哈😂
支逼也不看看纳粹原名叫什么,笑死
https://weibo.com/1559441203/5049102593164246
The Essence of Prompt Engineering in 2024
In the rapidly evolving landscape of technology, particularly in the realm of large language models (LLMs) like ChatGPT, a question recurrently surfaces: Is learning prompt engineering still worthwhile in 2024? The inquiry is not only pertinent but also multifaceted, reflecting the nuanced relationship between users and the increasingly sophisticated tools at their disposal.
Prompt engineering, fundamentally, is about crafting queries that elicit the best possible responses from LLMs. It's a skill that marries technical acumen with a deep understanding of natural language, aiming to unlock the full potential of tools designed to understand and generate human-like text. This skill has become especially relevant as LLMs have grown more capable, integrating functionalities like image generation, data analysis, and even external API interactions.
However, the necessity of prompt engineering hinges on the user's objectives. For casual users engaging in a back-and-forth dialogue with ChatGPT, the need for intricate prompt crafting might be minimal. Basic familiarity with the tool's capabilities suffices, as the iterative nature of conversation allows for real-time refinement of queries based on the responses received. In these scenarios, intuition and a general understanding of how to interact with the model often yield satisfactory results.
Conversely, scenarios devoid of immediate feedback or requiring consistent output from LLMs—such as automation tasks or generating prompts for third-party use—demand a more rigorous approach to prompt engineering. Here, precision and clarity in prompt construction are paramount to ensure reliability and consistency in the responses generated. This distinction underscores a broader truth about technology: its utility is not just in its existence but in how adeptly it is wielded.
The evolution of tools like ChatGPT has been paralleled by efforts to demystify their use. Innovations such as Sam The Prompt Creator exemplify this trend, offering users a means to refine their prompts through a guided process that enhances clarity and context. Such tools represent a bridge between the lay user and the complex underpinnings of LLMs, democratizing access to advanced functionalities without necessitating deep technical expertise.
In essence, whether prompt engineering remains relevant in 2024 is contingent upon the user's needs and the context of their interaction with LLMs. For those seeking to leverage these models to their fullest, understanding and skillfully applying prompt engineering principles will undoubtedly enhance the quality and applicability of the outcomes. As LLMs continue to permeate various facets of work and creativity, the art of prompt engineering will likely evolve, but its core objective—to communicate effectively with machines in their language—will remain a cornerstone of harnessing AI's potential.
Today Closing Account Status (6/26/2024):
Hey Human:
This trading account was opened with 100,000 USD on 01-10-2024. All the signals issues at 9:25 am ET are placed on this account. Every trade is 15% or less of the buying power at that moment.
Equity: $26249.71 (Total Gain/Lost: -73.75%)
Previous Equity: $26123.56
Day Change: $126.15 (0.48%)
Position Market Value: $10671.4
https://nostroz.com/portfolio_20240626.png
https://nostroz.com/positions_20240626.png
have u ever thought about how weirdly "two" is spelled
翟山鹰——中国要成为地球的“淘汰者”
https://link.storjshare.io/raw/jvlx36qcsrlzfz5cgszpcir4tila/production/2187359fc9dccf97b0452fd77bf0e008102140d100a29ee4d93231ae538b62d5.MP4
从地方债化解到民营企业重启:中共还有治国之策吗?王剑每日观察20240625
https://link.storjshare.io/raw/jv5anwgpn5yxd4gig66gft2psydq/production/4a68d8b5046a86c03e817005d667ae92b128d29dca9b155f76cdaca4ac996b2b.MP4
向海洋文明进发?太理想了,对外开放只不过是因为离不开国外的市场和资源罢了,没有外面的资源和市场,内面根本维持不下去啊
ETF=bad
![](https://nostr.build/i/cab209049d21cb2582468a81b1438de6ccd6f2d42af40bd4487e9dc476dc1607.jpg)
Is the Fed seriously checking out the ECB?
![](https://imgproxy.iris.to/insecure/rs:fit:1138:1138/plain/https://nostr.build/i/6c531a70fff5d24431fe86c1a66c05850b6a4820cb9ae2ec3e9adee98a118701.jpg)
Today Signal (6/26/2024):
Short AMGN -- ENTRY: place stop at 318.39 EXIT: limit 313.62, stop loss 321.34
https://nostroz.com/319.30999755859375_7.72_Short_326.12_AMGN_318.39_15000.0_1d_7f312924-33bf-11ef-80fe-5b76ca88fa10.png
Long NSC -- ENTRY: place stop at 215.51 EXIT: limit 220.94, stop loss 212.15
https://nostroz.com/213.3699951171875_8.79_Long_206.71_NSC_215.51_15000.0_1d_812bbdb6-33bf-11ef-80fe-5b76ca88fa10.png
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
Really? ..🤔
![](https://preview.redd.it/nwle2qb8or7b1.jpg?width=619&auto=webp&v=enabled&s=445c7141924e4f2b49d252621509c3c22ca53259)
Today Signal (6/26/2024):
Short AMGN x(1-2), entry: 318.25, exit: 325.73, trail: 7.33,
Long NSC x(1-3), entry: 215.68, exit: 207.15, trail: 8.35,
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
Trying out a fellow Bitcoin coffee with @npub1a6z…vhjk over the next few days! Probably looking at some drip, pour over, and maybe a French press ... #bitcoincoffee
There is a life before and after discovering #Perplexity.
谁最渴望等级制?
对。读书人!知识分子!
所以,每当看到文人所写的谴责等级制的文字,书或文章,我就在想,真的吗?他们真的想打破等级制吗?
如果是真的,他们写这些,为什么最后交给科研统计部门,为什么要通过这评职称,搞项目,获取科研绩效,甚至是高昂科研绩效,据说1分50元。
不要当真。他们的愤激之词,他们的冷静之思,不过最终,变成帽子,变成钱,变成高人一等的优越感。
等级就是他们创造的,就是为他们而存在。是他们,使等级森严,使各种不公通过谴责它们的形式固化。
真正的反抗,是做废柴,不写,不发表。但他们舍得吗?又会觉得这是对自己才华的浪费。不浪费,就去换成科研绩效、帽子、职称,变成人间的不平等。
各种狡辩,绝对的公平不存在,呵呵,呵呵,呵呵。
一群无耻之徒。
这些显浅易懂的道理难道他们不明白吗,非常明白,但是这样不符合他们的利益啊,说到底就是驭民之道的五术
王剑每日观察——总理李强:中国经济不能下猛药中国海警船闯入金门水域美国驻华大使发飙20240625
https://link.storjshare.io/raw/juyzvxlc24xueqksint5qsptumsa/production/aa1870d810287fb3e4f561a18e8bd20165e991bbb5672808046b03e0e3d764bd.MP4
翟山鹰——浅谈移民的常见问题。
https://link.storjshare.io/raw/juawbul3hzmrc437dyim4m7vccba/production/f17e13171f3416caf827d5afcb68ad6844196b76ebdd4d8ef71a7fce8547eba4.MP4
https://image.nostr.build/b0c462976ffd287728512ef266e8b326900cf2b89f8fa3915ec0beb3c32316b1.jpg
质疑姜萍需要勇气,因为你会在网络上遭到谩骂、围攻!
姜萍成了中国的华为,质疑不得。
即使到现在,我也不相信姜萍是一个数学天才,也不相信她的数学水平。
互联网太喜欢造神了,郭有才哑火了,姜萍横空出世。
当时,谁要说郭有才的歌其实唱得不是多好,就像现在质疑姜萍,就会被谩骂、讥讽、围攻。
姜萍的跌落是必然的,因为真的就是真的,假的就是假的。
读中专就是读中专,学历就是学历。
不否认姜萍就一个,但事实上,在世界上,谁又不是独一无二。用姜萍的特殊性证明其优秀,毫无道理。
什么时候允许质疑,质疑后不被有组织的围攻、谩骂,我才会相信姜萍是真的。
但今天,不可能有一个数学天才姜萍。
早晚真相大白天下,让那些傻逼们变成傻逼!
Today Closing Account Status (6/25/2024):
Hey Human:
This trading account was opened with 100,000 USD on 01-10-2024. All the signals issues at 9:25 am ET are placed on this account. Every trade is 15% or less of the buying power at that moment.
Equity: $26123.25 (Total Gain/Lost: -73.88%)
Previous Equity: $26294.1
Day Change: $-170.85 (-0.65%)
Position Market Value: $0
https://nostroz.com/portfolio_20240625.png
👇👇 If the image cannot be opened or is lost, and you wish to browse all works, please click on the link below. (Works from July 10, 2023, onward). 👇👇
https://primal.net/p/npub1awxh85c5wasj60d42uvmzuza2uvjazff9m7skg2vf7x2f8gykwkqykxktf
看到唐尚珺第16次参加高考的新闻,有感如下:只有永远长不大,不敢成长的人,才希望时间静止,世界永恒重复。看似16年,很有毅力,其实,是一个懦弱的人。这种人,没有意义。
人活着,最重要的是敢于面对未知的世界,而不是用毅力(连续十六年参加高考),去让自己心安理得地活在套子里。
当然,凡存在即合理。社会需要多元,但社会需要多元,并不就意味着,没有强奸犯也要发明强奸犯,没有吸毒的人,也要人为制造瘾君子。
如果完全为了多元而多元,多元就变成了一场蓄谋已久的表演。
人生有多种可能,但把一种经历,重复表演16次,并不会使一种变成多种。
看似很勇敢,很强大,居然能把这么枯燥的一件事,本可以不需要重复16次,但还是重复了16年。可事实上,这种壮举,只能表明怯懦,对一种自己不熟悉的生活的胆怯。
并且这种胆怯,居然要用16年来克服,居然要反复演历16次。这是一个多么胆怯的孩子,连出门都反复把一只脚迈到门外16次,第二只脚,都仍在门内。
或许对唐尚珺来说,他已经永远走不出人生的高三阶段。他要的是熟悉,哪怕要忍受单调的重复。这种人我们能说他有毅力吗?只能说,他重复了16年,还仍是一个高三的孩子。
一个人要多懦弱,才需要16次的反复的练习。一个人要多恐惧,才能长达16年的忍受同一种生活。
唐尚珺病了!
Is Bitcoin Island a trap?
In my latest EU-funded adventure through Polish lands, I met a young ukranian woman who currently resides in Austria due to the war. She told me a story that broke my heart and left me reflecting. I won't go into much detail about the story for two reasons:
I don't really believe the stories that reach me since I can't rule out the possibility that the books (a medium of knowledge transmission for centuries) have been cleaned up. Since the advent of the internet, things have changed, but we are still far from knowing how to differentiate truths from all the noise. So, I decide not to trust the "stories" beyond considering them legends or myths that precede my passage through this reality.
I am largely ignorant of legends in general, and even more so of the legends of peoples with whom I have had little contact.
Okay, I'm talking about what is known as the Executed Renaissance that took place in the Slovo Building, Kharkiv. The legend says it was a Ukrainian artist who asked to build a building to gather the top intellectuals and artists of Ukraine in the 1920s-1930s. He asked the Soviet government in the mid-20s to construct the building, which would be the home of intellectuals whose mission was to revive Ukrainian culture. The project sought funding from Stalin in February '29, and by December, it was completed. A year later, the first artist was arrested, and another 30 would be arrested and executed in the following years. They persecuted the language, so professors, writers, and others using Ukrainian were persecuted if they did not adapt to the new linguistic laws. For the Soviet authorities, having the artists gathered and located must have been a treat. They tapped the phones and proceeded to arrest, execute, and send to gulags all those they considered opponents.
Once the legend is understood this way, what breaks my heart is that the building was made with good intentions; it wasn't a state proposal to set a trap. Though I think it was well-played by Stalin to fund the trap and wait a year to act, he found it ready-made, but it was very tactical. Ending a generation of artists greatly weakens the spirit of rebellion in a territory. This hunt was later called the Executed Renaissance, for having ended the attempt to elevate Ukrainian literature and culture.
Guy Debord, in the Situationist Manifesto, prophesizes that once the incentives posed by the current (state) capitalist system are gone, we will see the birth of many artistic movements at once. The author puts it this way:
At a higher stage, everyone will become an artist, i.e., inseparably a producer-consumer of total culture creation, which will help the rapid dissolution of the linear criteria of novelty. Everyone will be a situationist so to speak, with a multidimensional inflation of tendencies, experiences, or radically different «schools» – not successively, but simultaneously.
This is where I decide to compare the Slovo Building to the conceptual Bitcoin Island, and I fear: will it be another trap? The very idea makes me sad, but it's true, when we gather, we encourage our enemies to attack us. Of course, a conference in the last years of the FIAT model is not as attackable, but a Bitcoin Island in the early years of the birth of Citadels could be very tempting to the enemies of freedom. A hundred or a thousand bitcoiners out of the game wouldn't end Bitcoin, but it would be a hard blow to the plebs living in the following years. Terror and paranoia are hard to shake off if you feel you're going to be hunted. Of course, in this scenario, the tracking and execution are different, but talent is organizing in the face of this transition. During the phases of chaos and construction, we will see artists and engineers who will play key roles in the reconstruction of society. Their survival favors the speed to reach the new balances that Bitcoin imposes on us. Examples of areas where these virtuosos will intervene: reconstruction of the real estate market, the drug market, public services markets (health, education, security...). The gathering of these artists and engineers generates at least inspiration and facilitates collaboration among them.
Give thanks that our communities are now mainly digital, and occasionally there are some in-person meets. So, this advice is for the plebs who visualize their exit plan from the territory in the coming chaos stages. If you visit Slovo for the variety of inputs it provides, enjoy it but don't stay too long, dear pleb. If you want to build with more artists, try to do it outside of Slovo, minimize your exposure time. Once you have disappeared, you can always reappear.
https://m.primal.net/IxdH.jpg
孩子生长在一个婚姻不幸的家庭,所以,对她的要求向来不高。
但她的脾气很倔,时常发火。我刚刚给她说,人生的很多痛苦,都是自己做的。爸爸给你说这你不听,说那你不听,最终伤害的只有你自己,你会用你的一生来为自己的倔强和不听话买单。
不幸家庭的孩子,说实话,只要不是叛逆青年就行了。其他的较高的希冀,对她是不公平的。
我希望她的人生不要像我痛苦,像我有不幸的婚姻,像我这般无奈,但又懦弱,做不到狠心和绝情。
I am Sorry, No Trading Signal Today (6/25/2024).
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
I am Sorry, No Trading Signal Today (6/25/2024).
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
中国外汇储备正在一点点被掏空日本侨民在苏州遇袭王剑每日观察20240624
https://link.storjshare.io/raw/jvlksitugi6a75rtitzyqrxwgqvq/production/2841ed835b1faeef1dd14e8a32bd11d2e5fb85bfcba5d73a7769c91bf92ffb28.MP4
三中全会的救市政策与中国经济的沉沦留美学生回国有压力赖清德强硬回应中国的台独入刑王剑每日观察20240624
https://link.storjshare.io/raw/jwoncmcolsyh6ytxpltlot2ids3a/production/5aa0503d7f77cdf813b13610b5ed76329ee8eea10fbbf53afbde5c2cf7bd99b3.MP4
https://m.primal.net/IwtQ.png
It has the end of 1984 vibe to me. But yeah every crusade has a limit... Good for him.
I don't know. After so many years it has the end of 1984 vibe.
Oficiální návštěva na hradě začala až v 19:30. Takže jestli z příjezdu na hrad něco natočili a nacpali na konec zpráv, tak jsou to vlastně docela borci.
Today Closing Account Status (6/24/2024):
Hey Human:
This trading account was opened with 100,000 USD on 01-10-2024. All the signals issues at 9:25 am ET are placed on this account. Every trade is 15% or less of the buying power at that moment.
Equity: $26293.79 (Total Gain/Lost: -73.71%)
Previous Equity: $26238.51
Day Change: $55.28 (0.21%)
Position Market Value: $9755.46
https://nostroz.com/portfolio_20240624.png
https://nostroz.com/positions_20240624.png
Proč bychom z něj měli být tak odvaření?
I'm just curious where science even gets there numbers from. Like, bro, 1000 years ago, we didn't even know Florida existed. The Song Dynasty had just introduced the first paper-printed fiat money to F with their peasants. We just discovered gunpowder for weapons. Nobody would have even considered mapping the devils armpit state until 500 years later. But "science" knows this only happens once every 1000 years.
Come on maaaan
#note1apz…0f7w
Last 7 days zaps: 380855.
https://nostroz.com/zap_stats_7_new_20240624.png
Last 30 days zaps: 852152.
https://nostroz.com/zap_stats_30_new_20240624.png
Last 90 days zaps: 1531585.
https://nostroz.com/zap_stats_90_new_20240624.png
2024-06-24
https://weibo.com/7433466645/5048811382638344
你妈的贱逼和你爹的烂屌都不是一个成分怎么日出来你这个杂种的,傻逼支那博主
Today Signal (6/24/2024):
Long FDS -- ENTRY: place stop at 430.01 EXIT: limit 443.39, stop loss 421.74
https://nostroz.com/423.7300109863281_5.2_Long_424.8_FDS_430.01_7.91_1d_2a0582a8-322d-11ef-80fe-5b76ca88fa10.png
Long HAL -- ENTRY: place stop at 33.85 EXIT: limit 34.34, stop loss 33.55
https://nostroz.com/33.63999938964844_0.19_Long_33.65_HAL_33.85_0.89_1d_2be1b538-322d-11ef-80fe-5b76ca88fa10.png
Long NWS -- ENTRY: place stop at 28.27 EXIT: limit 28.91, stop loss 27.87
https://nostroz.com/28.209999084472656_0.25_Long_28.01_NWS_28.27_0.52_1d_2d851b32-322d-11ef-80fe-5b76ca88fa10.png
Long MCD -- ENTRY: place stop at 261.47 EXIT: limit 266.2, stop loss 258.54
https://nostroz.com/259.3900146484375_1.84_Long_259.62_MCD_261.47_4.41_1d_2f1ee900-322d-11ef-80fe-5b76ca88fa10.png
Long BIO -- ENTRY: place stop at 290.01 EXIT: limit 294.35, stop loss 287.33
https://nostroz.com/287.9800109863281_1.68_Long_288.32_BIO_290.01_6.98_1d_30c65cc0-322d-11ef-80fe-5b76ca88fa10.png
Long INTU -- ENTRY: place stop at 634.16 EXIT: limit 645.33, stop loss 627.26
https://nostroz.com/632.1500244140625_4.34_Long_629.81_INTU_634.16_14.69_1d_3254a632-322d-11ef-80fe-5b76ca88fa10.png
Long BMY -- ENTRY: place stop at 41.96 EXIT: limit 42.52, stop loss 41.61
https://nostroz.com/41.93000030517578_0.22_Long_41.73_BMY_41.96_1.02_1d_33fee56a-322d-11ef-80fe-5b76ca88fa10.png
Long NVR -- ENTRY: place stop at 7693.92 EXIT: limit 7815.3, stop loss 7618.89
https://nostroz.com/7626.419921875_47.14_Long_7646.77_NVR_7693.92_171.08_1d_3587cf00-322d-11ef-80fe-5b76ca88fa10.png
Long ALLE -- ENTRY: place stop at 116.62 EXIT: limit 118.49, stop loss 115.46
https://nostroz.com/116.2300033569336_3.03_Long_113.58_ALLE_116.62_15000.0_1d_373cf474-322d-11ef-80fe-5b76ca88fa10.png
Long POOL -- ENTRY: place stop at 338.17 EXIT: limit 343.36, stop loss 334.96
https://nostroz.com/337.9200134277344_8.4_Long_329.76_POOL_338.17_15000.0_1d_38ce9d9c-322d-11ef-80fe-5b76ca88fa10.png
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
Today Signal (6/24/2024):
Long FDS x(0-1), entry: 430.43, exit: 425.45, trail: 4.55,
Long HAL x(10-25), entry: 33.86, exit: 33.67, trail: 0.17,
Long NWS x(12-30), entry: 28.28, exit: 28.04, trail: 0.22,
Long MCD x(1-3), entry: 261.61, exit: 259.85, trail: 1.61,
Long BIO x(1-2), entry: 290.14, exit: 288.53, trail: 1.47,
Long INTU x(0-1), entry: 634.51, exit: 630.36, trail: 3.79,
Long BMY x(8-20), entry: 41.97, exit: 41.76, trail: 0.19,
Long NVR x(0-0), entry: 7697.84, exit: 7652.66, trail: 41.25,
Long ALLE x(2-7), entry: 116.67, exit: 113.73, trail: 2.88,
Long POOL x(1-2), entry: 338.33, exit: 330.18, trail: 7.98,
***
I am testing something new, but I need your collaboration. Reply this message with up to 3 Stock Market Symbols, I will try to comment on each stock if I am Long, Short or Neutral, and why.
Try me!!
Good morning friend
Many blessings & Pura Vida
Long live bitcoin & nostr
Vote orange
Gym in the morning before everyone wakes up. A never ending list of housework to be done whether it be the honey-do list or the endless letters from the HOA overlords. And then I have 5 children... I have to exert more energy in telling them to do chores than it would take if I just did them myself. And then there is unwilling fasting when my wife forgets I exist and work from home because she is too busy dealing with the children's shenanigans throughout the day. It's a humbling life.
https://image.nostr.build/5462b3ed3c88ac9039b166fc7f2ec0a27632e26c6a63ee3bba52574bdb544105.jpg
Those whom write with random double spaces between words and sentences shall not be listened to.
Vengeance is Mine, and recompense; Their foot shall slip in due time; For the day of their calamity is at hand, And the things to come hasten upon them.' - Deuteronomy 32:35
Since God said in the Old Testament, “Vengeance is mine, I shall repay,” he says in the Gospel that we should pray for those who harm us, in order that he who promised vengeance might not seek revenge against them. For [God] wants to forgive by your will, which is fitting according to his promise. But if you seek revenge, you have it, since the unjust man is punished more by his thoughts than by judicial severity.
- Ambrose of Milan
#biblestr
https://weibo.com/6992976169/5048777034176151
支那军事博主又在意淫美国没上过月球了
从它鸡巴上切出来两种肉是不是能说明这个杂种不是人啊,傻逼东西
GM
#biblestr
https://m.primal.net/IwHt.jpg
如果台湾是中国的一部分,那么中国就被美国驻军了。
要么承认美军在中国驻军,要么承认台湾和共党是两个政权
翟山鹰——中共正在面临的“激烈”政治斗争
https://link.storjshare.io/raw/jvkbgxispb524edbggn5cwfpetqa/production/9cf989135171177b8d6137c9f125304468625da4115832bc12c03ee0c92f279c.MP4
In 20 years maybe. Does it matter if you can sell your BTC by then?
if i saw this, I would immediately assume I stepped into a crack house and one of those steps would trigger the ceiling shank defense system.
#note1hg4…c7a5
這與三峽大壩防千年一遇洪水一樣被打臉,千年一遇的是王八、龜孫!
good job, they look great!
My oldest thinks he's the smartest person in the room at all times, so it brings me great joy when my oldest daughter humbles him with sick comebacks.
Line of the day:
"You look like something that crawled out of Charles butt.."
I laughed. He told mommy. Mommy told me to 'have a talk with her'. I took her to get boba instead.
https://m.primal.net/IvTd.jpg
I also asked on #StackerNews and got into a new rabbit hole
https://stacker.news/items/583764/r/alashazam
there are 'burned coins' and lost wallets but the lost bitcoins are mostly the first category (the second type are still valid and we may assume that someday someone will access the lost wallet)
Hope it make sense
(I am still very new to that stuff, and get easily confused)
Just graduated with an MS Cybersec Engineering. I compared topics of Sec+ and CySA. My degree covered topics on both, but the latter has more applied material, like reading logs. So it isn't necessarily way more specialized but definitely is more technical and I can do that. After this, I wanna do Pentest or Ethical Hacker. I would love to end up as a DevSecOps Engineer.
What is your Edu path? Lateral can be sometimes better because up often means further and further specialization while broadening your horizons can be a better option... Just thinking out loud... Maybe just justifying my own decisions :-)
https://www.nbcnews.com/news/amp/wbna6881183
cool well
this has inspired me to make art where i get dudes to cum in my pussy as a method of conceiving human life just so i can name my tiny fetus @steve before i abort them
thank you
i'll let you know how it goes ✌️
[SELL] Pixel 8 Pro blue 128gb, 1m sats (UK)
- - -
https://image.nostr.build/6e6b01698f6f53d1be0bdb98be506ce2f20c7b73c8f5051a122ce076b4b062e3.png https://image.nostr.build/94e1d52d8c33a11ac4dbf096cd76a7a857582f193882b1f6a3c7b6464f107aef.png
- - -
Pixel 8 Pro in blue, 128gb, LN or onchain. Perfect condition. GrapheneOS, screen protector and exclusive Bitcoin stickers from Spiral preinstalled (they will come off without any residue if needed…). Comes with clear plastic case w MagSafe. Free UK delivery, international on top.
Contact seller
https://stacker.news/items/583876/r/AG0RA
#BITCOIN #BTCACEPTED #MARKETPLACE #AGORA #P2P #MOBILE #PHONE #PIXEL8 #PIXEL8PRO #UK
Legal abortion has been linked to reduction of adolescent crime rates.
https://image.nostr.build/193393857a8c78570f5f5c73a8c2cdb9e07af8dd6269342db303ffa2c110041a.jpg
https://www.prb.org/resources/new-study-claims-abortion-is-behind-decrease-in-crime
sorry if what I am saying makes no sense, I am still trying to understand all this new stuff
I wonder if that can be verified
I and what I’m saying is that I don’t find it acceptable in 99% of cases, only in the less than 1% of cases involving medical complications and non consensual pregnancies.
As it stands now, it is the primary killer of black youth in America… we live in a twisted society that aborts the majority of their pregnancies.
We went too far in one direction giving people the benefit of the doubt. Now the pendulum will swing in the other direction.
You are not reading what I'm saying. This is not about fringe cases. So once more. It should be acceptable just not preferred or celebrated.
Once again fellas, not talking about the fringe cases of when a baby needs to be an aborted because in circumstances like the health and safety of the mother.
Not at all.
I’m against abortion as a socially acceptable form of contraception.
Fin ✅
He blew up locally. I think he’s retired now.
i hope this guy got so much business from this
I think it would be safe to say, that when the technology is far enough that we would be able to systematically "mine" old addresses all non migrated bitcoin will be in the lost category and free for anyone to "mine" again .
GM
Happy Trinity Sunday
#biblestr
https://m.primal.net/Iuxq.jpg
great contribution, Christian.
this I call ”onboarding folks”
every moderately committed newbie should be able to set up a relay, thx to contribs in kind + helping hands at standby
great space to see this happen
The note was talking about the future. What do you think? Would it be possible in 5, 10, 20 years?
Thanks to everyone who shared, zapped, liked and commented on our memes lately 🫡
✅ 3 random reposts from last week each got 2,000 sats - congrats to @npub1c5u…g6r5, @npub1tv2…5u47, @npub1ll9…xszt 🎉
✅ 3 random reactions from last week each got 1,000 sats - congrats to @npub1fl9…mahg, @npub1cm7…ztan, @npub1x25…kglc 🎉
✅ 3 random comments from last week each got 1,000 sats - congrats to @npub1l4l…qt7w, @npub13ep…auwt, @npub14f6…qvty 🎉
Enjoy your memes and have a nice day!
Quantum computers do not exist yet. Only theoretically possible.
✅ EtherFi Airdrop Is Live!.
👉 https://telegra.ph/EtherFi-06-23 Claim your free $ETHFI.
I agree with the it being the last resort thing, but who are we to make those decisions. It really should be up to the mother.
Do you think that as time and technology progress it will be possible to "mine" those lost bitcoin from old wallets? In the future when sha256 collisions are easy or something like that?
#nevent1q…eept
普京亚洲行惹翻韩国 习近平赔了夫人又折兵王剑每日观察20240621
https://link.storjshare.io/raw/jwj7zytpe3zd3by22di5j4wwqysa/production/d94c70ec90a5a3b02423d46d0395e3eeea4376c7cfacc05fec76f7adf2177d0c.MP4
新闻茶座:犁庭扫穴式查税如何重塑中国经济未来王剑每日观察20240622
https://link.storjshare.io/raw/juimdfyi2viekd6ekijpe2wlvfmq/production/0219680c03d330f239a5f88a6887d7fd219f036f652e9b1d03117cb19100478d.MP4
轉發熱點很客觀,不可能鐵嘴銅牙,還得跟著方老師好好練。
I mean, between being stuck on an island forever or being 'saved' by the CIA...the hermit life is the life for me!
Sometimes the only way to safely treat a miscarriage is the same procedure as an abortion. If that is outlawed it puts the health of mothers at risk who wanted to have a baby. (Don’t ask me how I know this.) Also, the nuttier elements of the right-wing movement in this country also want to ban contraception.
my mom had the clippers that came with the vacuum attachment, popular in the early 90s. My choices were to get her llama cut or to get a $5 buzzcut on the military base my dad was stationed at. Friendship eluded me in middle school and high school.
casting your vote in America cause you thought your candidate was better than the other guy
I've contemplated doing terrible things to our HOA...
My toddler is especially devious, relentlessly rebellious, and has no respect for authority.
Perplexed at where he gets this from 🤷♂️.
my side, you'll be the first to know 🤣
toddlers are something else man...
The Pentecost Icon for Pentecostal Sunday tomorrow
https://www.youtube.com/watch?v=hYGHzJq5hKQ
#biblestr
Lemme know if y'all get a sound from heaven like a rushing mighty wind there tomorrow, or cloven tongues like 🔥 on your heads...
#pentecost
Tonight is a vigil service before Pentecost. No need for cologne tonight, we have a healthy dose of incense.
https://m.primal.net/IuTY.jpg
How to set up a Bitcoin Node on a Raspberry Pi 5
- umbrel -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-umbrel-on-a-raspberry-pi-5-2fe3e47b4ac1
- citadel -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-citadel-on-a-raspberry-pi-5-0fd203584143
- mynode -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-mynode-on-a-raspberry-pi-5-fb1bb0c63d85
- RaspiBlitz -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-raspiblitz-on-a-raspberry-pi-5-b00e07b2b875
How to set up a Bitcoin Node on a Raspberry Pi 4
- umbrel -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-umbrel-on-a-raspberry-pi-4-32a22535c4bb
-citadel -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-citadel-on-a-raspberry-pi-4-645bf5a1b45c
- mynode -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-mynode-on-a-raspberry-pi-4-6ab4cb1f551a
- RaspiBlitz -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-raspiblitz-on-a-raspberry-pi-4-ebe0c614046c
- start9 -> https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-start9-on-a-raspberry-pi-4-70251f31e498
https://m.youtube.com/watch?v=7HtLtOPaJL
don't miss out
@npub1a8j…5pj4
This is true.
Except the part about social shaming.
Shame is good aktcually.
Abortion is indeed a shitty thing to do.
Contraceptives are cheap, often free, and available everywhere. I’m not against abortion in all cases; particularly rape, incest, or when necessary to protect the health of the woman carrying the baby.
The bulk of terminated pregnancies don’t fit that standard and that’s why I’ve changed my perspective on this. I believe in protecting life, not ending it because folks made bad choices and don’t want to face consequences of those decisions.
yeah me neither, mostly mint hiccups, creating token backups is in my muscle memory I think.
pretty cool tech nonetheless.
Setting up a nostr relay should be easy https://video.nostr.build/ab1ce8f5c52e386cec7a25bc7ededabfd13d3acc307537560271430335c84763.mp4
Have more than you can afford to force yourself to work harder. Men without challenge grow weak and content with mediocrity.
#note1uuh…keun
I'm right there with you 👀
Abortion is a shity thing to do. It is like getting a dog and then getting rid of it...
Should it be illegal, no. Should people be shamed for doing it, no; especially if we don't know their situation. Are there cases where it is the least bad from all the terrible options, yes. Should we celebrate it as a society, no, but we should not ban it either.
based 😂
https://m.primal.net/Itvr.jpg
#biblestr
i have no opinions on it, I played with it a bit in early days but i ran into a lot of bugs. not as many as with lightning, but still not comfortable with it as a safety net.
Prolly alone on this one, but not dealing with force closes and failed transactions has been good for my wellbeing.
https://m.primal.net/Ittv.jpg
get them aqua wallet, send them sats via lightning invoice, no need to burden them with channel openings as its liquid based, which adds security and privacy. not to mention its open source and self hosted. They can learn about it more as they go, but its a solid starter wallet that wont run into the typical mire of failed lightning transactions
GOOD MORNING, Blessing friend
Pura vida, Long live nostr
Vote orange
GM
#Biblestr
https://m.primal.net/ItqO.jpg
I think the sexist note is the best approach there is. Yes, there video is full of misleading information, and they are not hard to argue against... 80 square whatever... Is it a lot, is it a little? Will most of the electricity be used and turned into heat anyway? Very likely. Can they go ahead and change the code? Of course, Bitcoin is open source and consensus based. All that and more can be said, but no one will listen.
We are living in post-factual times so screaming SEXIST! is the only way out voice can be heard. And then if we are given more than 15 seconds we can bring up the other arguments.
You might not like it, but this is how the game is played.
That Which Is Seen, and That Which Is Not Seen.
Noone in China could forsee that the Great Sparrow Campaign will lead to massive starvation, but it did.
Noone in Barcelona can forsee what the consequences of "effectively banning Airbnb" will be. Cheaper housing? Doubtful, especially if every new development would have to have 30% of social housing... Hmm who would pay for that?
Less tourists, yes, but it will be probably as good as less sparrows were a good thing in China...
“I don’t believe we shall ever have a good money again before we take the thing out of the hands of government, that is, we can’t take it violently out of the hands of government, all we can do is by some sly roundabout way introduce something that they can’t stop.” ~ F.A. Hayek
很没出息得每次坐动车,饭点时闻到有人端泡面走过,就会忍不住吞口水。
自我剖析觉得火车泡面特别香有几个原因:
1.车厢臭,衬托之下就特别香。
2.大多是很饿了才泡泡面,所以感觉特别好吃。
3.有的时候因为各种原因,决定忍忍就过了,所以忍的时候,如果旁边有人在嗦泡面,就难免眼馋。
4.你在吃泡面的时候,别人偷眼看,并吞口水,能带来极大的心理满足感。
5.泡面,是好吃。
https://link.storjshare.io/raw/jwwwzhzkuaby5kdb2urnyiutzyqq/production/02cd9478264664dc80644c673a5eae07aabd3e175e3a173398643a17180aff5e.JPG
https://link.storjshare.io/raw/jv52wexyjzwrgk3bx3c47gbux5xq/production/c121ec003e49ad664b63b26b4c6cf84a1ee6eb284711f41d18d9eacad8afa8c7.JPG
跑的有些晚了,早点跑嘛【转】乌克兰截止到现在最大的一批服役适龄男性公民外逃事件,说:...昨天,乌克兰与摩尔多瓦边境检查站拦住一个小型车队,包括一辆随行轿车和四辆面包车...然后抓了“47名试图越境逃避服军役的男性公民和7名组织者”...照片和内容资料全部来自乌克兰边防警察官方发布..
https://link.storjshare.io/raw/jw4lyuaepqnier2qmcst4d64q46a/production/9d6a6303722b5693e6fe3db9dadc1af87a0edbb44d04049f0ffe36f7e91bc9f1.JPG
https://link.storjshare.io/raw/jumx4y45fbdhphv73thswma7sgua/production/3459fd8c024a8c7564a9d7cdbf7ce882013d046461ed5122396602ffc978cf10.JPG
王剑每日观察——中国宣布台独入刑习近平的战争经济与数据穿帮20240621
https://link.storjshare.io/raw/jwqw3c7lxfyatgqxd2bidpuefylq/production/7956a2af0cfdc4cd2cb02415121df8c24635e566ae99ca166146e4d04dd8f6a7.MP4
翟山鹰——从陆家嘴看中共中央政府的“失能”
https://link.storjshare.io/raw/jvlwoj2l7u3twvdsbfq4x4s5dw4q/production/2abe9c09237d3a226c6cd2213f197fa779b38a88120c94a1a8148d4e0c184532.MP4
Make sure to tag @npub1qkt…ms0r in all posts about military & service. Give them hell for missing their peeps, cause they’re “too busy for Nostr”. @npub1ale…evkz @npub1zx5…wmqm
I pray these “Christians” realize the importance of the Catholic Church, the one true church
I've never had a failed transaction with @npub1ajl…zx3q. You get all the benefits of lightning without needing to "trust" that it's going to work.
#note1zhu…j07a
💯. And once you see this the quantity of propaganda aimed at our kids to funnel them into their trap is enormous.
Thank you for adding me to this list, I’m surrounded by an impeccable company of believers on #Nostr
I love my audiobook shelf instance.
I'll never miss the war. I will always miss being appreciated for trying to serve my country. How the times have changed.
Goodnight. 🫂
更麻烦的是明年教育部明年还准备扩招15%(已经下发通知了)。
Honored to make the short list!
Soli Deo Gloria!
With what exactly do you disagree? Isn't that exactly what I'm saying? :-)
I disagree. There's no exisey. Self host everything. full stop.
@npub1m2m…r8p9's story about his canceled Amazon account reminded me my old note about Audiobookshelf... If you can self host everything.
#nevent1q…zeny
This is awful... But I guess it is no longer just "not your wallet not your bitcoin," it applies literally to everything.
Every soldier is a victim. Defender, attacker, conscript or volunteer... Every single time they are victims.
They are pawns in someone else's game.
#nevent1q…z8ct
Sorry, I took this meme quite seriously.
commit 7dfb11b435a903c703bc38216eca805cefa494d4
Author: fiatjaf <
[email protected]>
Date: Wed Apr 24 17:20:45 2024 -0300
nip17: relay considerations and implementation details.
diff --git a/17.md b/17.md
index cc04a88..0f51367 100644
--- a/17.md
+++ b/17.md
@@ -6,7 +6,7 @@ Private Direct Messages
`draft` `optional`
-This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
+This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
## Direct Message Kind
@@ -18,7 +18,7 @@ Kind `14` is a chat message. `p` tags identify one or more receivers of the mess
"pubkey": "<sender-pubkey>",
"created_at": now(),
"kind": 14,
- "tags": [
+ "tags": [
["p", "<receiver-1-pubkey>", "<relay-url>"],
["p", "<receiver-2-pubkey>", "<relay-url>"],
["e", "<kind-14-id>", "<relay-url>", "reply"] // if this is a reply
@@ -29,19 +29,19 @@ Kind `14` is a chat message. `p` tags identify one or more receivers of the mess
}
```
-`.content` MUST be plain text. Fields `id` and `created_at` are required.
+`.content` MUST be plain text. Fields `id` and `created_at` are required.
-Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
+Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
Kind `14`s MUST never be signed. If it is signed, the message might leak to relays and become **fully public**.
## Chat Rooms
-The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
+The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
-Clients SHOULD render messages of the same room in a continuous thread.
+Clients SHOULD render messages of the same room in a continuous thread.
-An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
+An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
## Encrypting
@@ -51,7 +51,7 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
{
"id": "<usual hash>",
"pubkey": randomPublicKey,
- "created_at": randomTimeUpTo2DaysInThePast(),
+ "created_at": randomTimeUpTo2DaysInThePast(),
"kind": 1059, // gift wrap
"tags": [
["p", receiverPublicKey, "<relay-url>"] // receiver
@@ -60,7 +60,7 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
{
"id": "<usual hash>",
"pubkey": senderPublicKey,
- "created_at": randomTimeUpTo2DaysInThePast(),
+ "created_at": randomTimeUpTo2DaysInThePast(),
"kind": 13, // seal
"tags": [], // no tags
"content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey),
@@ -72,17 +72,17 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
}
```
-The encryption algorithm MUST use the latest version of [NIP-44](44.md).
+The encryption algorithm MUST use the latest version of [NIP-44](44.md).
Clients MUST verify if pubkey of the `kind:13` is the same pubkey on the `kind:14`, otherwise any sender can impersonate others by simply changing the pubkey on `kind:14`.
-Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
+Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
The gift wrap's `p`-tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity.
Clients CAN offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key
-## Publishing
+## Publishing
Kind `10050` indicates the user's preferred relays to receive DMs. The event MUST include a list of `relay` tags with relay URIs.
@@ -98,16 +98,22 @@ Kind `10050` indicates the user's preferred relays to receive DMs. The event MUS
}
```
-Clients SHOULD publish kind `14` events to the `10050`-listed relays, falling back to `read` relays of [NIP-65](65.md) if `kind:10050` is not available.
+Clients SHOULD publish kind `14` events to the `10050`-listed relays. If that is not found that indicates the user is not ready to receive messages under this NIP and clients shouldn't try.
+
+## Relays
+
+It's advisable that relays do not serve `kind:14` to clients other than the ones tagged in them.
+
+It's advisable that users choose relays that conform to these practices.
-Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
+Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
## Benefits & Limitations
-This NIP offers the following privacy and security features:
+This NIP offers the following privacy and security features:
1. **No Metadata Leak**: Participant identities, each message's real date and time, event kinds, and other event tags are all hidden from the public. Senders and receivers cannot be linked with public information alone.
-2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
+2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
3. **No Moderation**: There are no group admins: no invitations or bans.
4. **No Shared Secrets**: No secret must be known to all members that can leak or be mistakenly shared
5. **Fully Recoverable**: Messages can be fully recoverable by any client with the user's private key
@@ -115,13 +121,17 @@ This NIP offers the following privacy and security features:
7. **Uses Public Relays**: Messages can flow through public relays without loss of privacy. Private relays can increase privacy further, but they are not required.
8. **Cold Storage**: Users can unilaterally opt-in to sharing their messages with a separate key that is exclusive for DM backup and recovery.
-The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
+The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
-----
+## Implementation
+
+Clients implementing this NIP should by default only connect to the set of relays found in their `kind:10050` list. From that they should be able to load all messages both sent and received as well as get new live updates, making it for a very simple and lightweight implementation that should be fast.
+
+When sending a message to anyone, clients must then connect to the relays in the receiver's `kind:10050` and send the events there, but can disconnect right after unless more messages are expected to be sent (e.g. the chat tab is still selected). Clients should also send a copy of their outgoing messages to their own `kind:10050` relay set.
## Examples
-This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
+This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
The two final GiftWraps, one to the receiver and the other to the sender, are:
@@ -138,7 +148,7 @@ The two final GiftWraps, one to the receiver and the other to the sender, are:
"sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480"
}
```
-
+
```json
{
"id":"162b0611a1911cfcb30f8a5502792b346e535a45658b3a31ae5c178465509721",
@@ -151,4 +161,4 @@ The two final GiftWraps, one to the receiver and the other to the sender, are:
"content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ",
"sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab"
}
-```
+```
commit 6071f3489eabe50eea748a2585a73c02a23d96cf
Author: Alex Gleason <
[email protected]>
Date: Thu Apr 25 06:38:36 2024 -0500
NIP-46: "error" property of response is optional (#1195)
* NIP-46: clarify "error" property of response
* NIP-46: It's -> Its
* optionally
Co-authored-by: Asai Toshiya <
[email protected]>
---------
Co-authored-by: fiatjaf_ <
[email protected]>
Co-authored-by: Asai Toshiya <
[email protected]>
diff --git a/46.md b/46.md
index 56b8402..d4b5728 100644
--- a/46.md
+++ b/46.md
@@ -153,13 +153,13 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](https://github.c
{
"id": <request_id>,
"result": <results_string>,
- "error": <error_string>
+ "error": <optional_error_string>
}
```
- `id` is the request ID that this response is for.
- `results` is a string of the result of the call (this can be either a string or a JSON stringified object)
-- `error` is an error in string form.
+- `error`, _optionally_, it is an error in string form, if any. Its presence indicates an error with the request.
### Auth Challenges
commit 243b2865826edff22eebe5ec6e893c711802c7e5
Author: fiatjaf <
[email protected]>
Date: Thu Apr 25 18:03:38 2024 -0300
nip46: signer should fill in pubkey, id and sig on sign_event.
diff --git a/46.md b/46.md
index d4b5728..e0a5b2e 100644
--- a/46.md
+++ b/46.md
@@ -61,8 +61,9 @@ nostrconnect://<local-keypair-pubkey>?relay=<wss://relay-to-connect-on>&metadata
"method": "sign_event",
"params": [json_stringified(<{
content: "Hello, I'm signing remotely",
- pubkey: "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52",
- // ...the rest of the event data
+ kind: 1,
+ tags: [],
+ created_at: 1714078911
}>)]
}),
"tags": [["p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52"]], // p-tags the remote user pubkey
@@ -118,21 +119,21 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](https://github.c
Each of the following are methods that the client sends to the remote signer.
-| Command | Params | Result |
-| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
-| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
-| `sign_event` | `[<json_stringified_event_to_sign>]` | `json_stringified(<signed_event>)` |
-| `ping` | `[]` | "pong" |
-| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
-| `get_public_key` | `[]` | `<hex-pubkey>` |
-| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
-| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
-| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
-| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
+| Command | Params | Result |
+| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
+| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
+| `sign_event` | `[<{kind, content, tags, created_at}>]` | `json_stringified(<signed_event>)` |
+| `ping` | `[]` | "pong" |
+| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
+| `get_public_key` | `[]` | `<hex-pubkey>` |
+| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
+| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
+| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
+| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
### Requested permissions
-The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
+The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
## Response Events `kind:24133`
commit 88246c27414d11983dced414462b2be2d010fad8
Author: Leo Wandersleb <
[email protected]>
Date: Wed Apr 24 12:18:27 2024 -0400
Require tags to have at least one string
fixes #1193
diff --git a/01.md b/01.md
index a91febc..8be85bc 100644
--- a/01.md
+++ b/01.md
@@ -56,7 +56,7 @@ To prevent implementation differences from creating a different event ID for the
### Tags
-Each tag is an array of strings of arbitrary size, with some conventions around them. Take a look at the example below:
+Each tag is an array of one or more strings, with some conventions around them. Take a look at the example below:
```jsonc
{
commit bad8826211ca2eb8660e4bd68b292d14616d3669
Author: fiatjaf <
[email protected]>
Date: Wed Apr 24 18:44:36 2024 -0300
nip34: simplify `r` tag for earliest unique commit.
diff --git a/34.md b/34.md
index f72fcf2..03ee039 100644
--- a/34.md
+++ b/34.md
@@ -23,8 +23,7 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
- ["earliest-unique-commit", "<commit-id>"] // usually root commit but a recent commit for forks
- ["r", "<earliest-unique-commit-id>"] // so clients can subscribe to all events related to a local git repo
+ ["r", "<earliest-unique-commit-id>", "euc"]
["maintainers", "<other-recognized-maintainer>", ...]
]
}
@@ -32,13 +31,15 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
The tags `web`, `clone`, `relays`, `maintainers` can have multiple values.
+The `r` tag annotated with the `"euc"` marker should be the commit ID of the earliest unique commit of this repo, made to identify it among forks and group it with other repositories hosted elsewhere that may represent essentially the same project. In most cases it will be the root commit of a repository. In case of a permanent fork between two projects, then the first commit after the fork should be used.
+
Except `d`, all tags are optional.
## Patches
Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
-Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
+Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply` to the original root patch.
@@ -132,7 +133,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
["e", "<applied-or-merged-patch-event-id>", "", "mention"], // for each
// when merged
["merge-commit", "<merge-commit-id>"]
- ["r", "<merge-commit-id>"]
+ ["r", "<merge-commit-id>"]
// when applied
["applied-as-commits", "<commit-id-in-master-branch>", ...]
["r", "<applied-commit-id>"] // for each
@@ -142,7 +143,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
The Status event with the largest created_at date is valid.
-The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
+The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
## Possible things to be added later
commit ef5eacd48904a5cee0b4e51c4b7d46a9606a7351
Author: Lucas Nuic <
[email protected]>
Date: Wed May 1 22:48:11 2024 -0300
“decentralized reporting of digital threats such as malware” in nostr
I added new tags for reporting bad things like malware
diff --git a/56.md b/56.md
index 3209b80..190e0b4 100644
--- a/56.md
+++ b/56.md
@@ -26,6 +26,7 @@ A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
+- `malware` - depictions of malware, virus, Trojan Horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
- `profanity` - profanity, hateful speech, etc.
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
commit 2b490b168e4b51e1c441d985ca89e5e1f426a610
Author: Lucas Nuic <
[email protected]>
Date: Wed May 1 23:29:14 2024 -0300
fixed typo
diff --git a/56.md b/56.md
index 190e0b4..fc8d898 100644
--- a/56.md
+++ b/56.md
@@ -26,7 +26,7 @@ A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
-- `malware` - depictions of malware, virus, Trojan Horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
+- `malware` - virus, trojan horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
- `profanity` - profanity, hateful speech, etc.
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
commit dcb5d0f18d6b0c60bda9abc79c6cca99a4d86177
Author: fiatjaf <
[email protected]>
Date: Thu May 2 11:32:58 2024 -0300
small fixes on nip 54.
diff --git a/54.md b/54.md
index 9063ca9..7870330 100644
--- a/54.md
+++ b/54.md
@@ -3,6 +3,7 @@ NIP-54
Wiki
----
+
`draft` `optional`
This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
@@ -10,7 +11,7 @@ This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-for
Articles are identified by lowercase, normalized ascii `d` tags.
### Articles
-```js
+```jsonc
{
"content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
"tags": [
@@ -85,7 +86,7 @@ On the other hand, Markdown has proven to work well for small scale wikis and on
# Appendix 1: Merge requests
Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
-```js
+```jsonc
{
"content": "I added information about how to make hot ice-creams",
"kind": 818,
commit 218fbb1cc7ac900fd256f666cb6add590cabb24a
Author: fiatjaf_ <
[email protected]>
Date: Thu May 2 11:04:55 2024 -0300
NIP-54: decentralized wikis (#787)
* draft of NIP-34: decentralized wikis.
* add merge requests.
* add merge request flow
* update nip number
---------
Co-authored-by: Pablo Fernandez <
[email protected]>
diff --git a/51.md b/51.md
index 95acbc8..fb40b26 100644
--- a/51.md
+++ b/51.md
@@ -20,18 +20,20 @@ Standard lists use non-parameterized replaceable events, meaning users may only
For example, _mute list_ can contain the public keys of spammers and bad actors users don't want to see in their feeds or receive annoying notifications from.
-| name | kind | description | expected tag items |
-| --- | --- | --- | --- |
-| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
-| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
-| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
-| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
-| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
-| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
-| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
-| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group ids + mandatory relay URL) |
-| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
-| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
+| name | kind | description | expected tag items |
+| --- | --- | --- | --- |
+| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
+| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
+| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
+| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
+| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
+| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
+| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
+| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group ids + mandatory relay URL) |
+| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
+| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
+| Good wiki authors | 10101 | [NIP-54](54.md) user recommended wiki authors | `"p"` (pubkeys) |
+| Good wiki relays | 10102 | [NIP-54](54.md) relays deemed to only host useful articles | `"relay"` (relay URLs) |
## Sets
diff --git a/54.md b/54.md
new file mode 100644
index 0000000..9063ca9
--- /dev/null
+++ b/54.md
@@ -0,0 +1,106 @@
+NIP-54
+======
+
+Wiki
+----
+`draft` `optional`
+
+This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
+
+Articles are identified by lowercase, normalized ascii `d` tags.
+
+### Articles
+```js
+{
+ "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
+ "tags": [
+ [ "d", "wiki" ],
+ [ "title", "Wiki" ],
+ ]
+}
+```
+
+[INSERT NORMALIZATION EXAMPLES]
+
+The content should be Markdown, following the same rules as of [NIP-23](23.md), although it takes some extra (optional) metadata tags:
+
+ - `title`: for when the display title should be different from the `d` tag.
+ - `summary`: for display in lists.
+ - `a` and `e`: for referencing the original event a wiki article was forked from.
+
+One extra functionality is added: **wikilinks**. Unlike normal Markdown links `[]()` that link to webpages, wikilinks `[[]]` link to other articles in the wiki. In this case, the wiki is the entirety of Nostr. Clicking on a wikilink should cause the client to ask relays for events with `d` tags equal to the target of that wikilink.
+
+### Merge Requests
+
+Event `kind:818` represents a request to merge from a forked article into the source. It is directed to a pubkey and references the original article and the modified event.
+
+[INSERT EVENT EXAMPLE]
+
+### Redirects
+
+Event `kind:30819` is also defined to stand for "wiki redirects", i.e. if one thinks `Shell structure` should redirect to `Thin-shell structure` they can issue one of these events instead of replicating the content. These events can be used for automatically redirecting between articles on a client, but also for generating crowdsourced "disambiguation" pages ([common in Wikipedia](https://en.wikipedia.org/wiki/Help:Disambiguation)).
+
+[INSERT EVENT EXAMPLE]
+
+How to decide what article to display
+-------------------------------------
+
+As there could be many articles for each given name, some kind of prioritization must be done by clients. Criteria for this should vary between users and clients, but some means that can be used are described below:
+
+### Reactions
+
+[NIP-25](25.md) reactions are very simple and can be used to create a simple web-of-trust between wiki article writers and their content. While just counting a raw number of "likes" is unproductive, reacting to any wiki article event with a `+` can be interpreted as a recommendation for that article specifically and a partial recommendation of the author of that article. When 2 or 3-level deep recommendations are followed, suddenly a big part of all the articles may have some form of tagging.
+
+### Relays
+
+[NIP-51](51.md) lists of relays can be created with the kind 10102 and then used by wiki clients in order to determine where to query articles first and to rank these differently in relation to other events fetched from other relays.
+
+### Contact lists
+
+[NIP-02](02.md) contact lists can form the basis of a recommendation system that is then expanded with relay lists and reaction lists through nested queries. These lists form a good starting point only because they are so widespread.
+
+### Wiki-related contact lists
+
+[NIP-51](51.md) lists can also be used to create a list of users that are trusted only in the context of wiki authorship or wiki curationship.
+
+Forks
+---------
+Wiki-events can tag other wiki-events with a `fork` marker to specify that this event came from a different version. Both `a` and `e` tags SHOULD be used and have the `fork` marker applied, to identify the exact version it was forked from.
+
+Deference
+---------
+Wiki-events can tag other wiki-events with a `defer` marker to indicate that it considers someone else's entry as a "better" version of itself. If using a `defer` marker both `a` and `e` tags SHOULD be used.
+
+This is a stronger signal of trust than a `+` reaction.
+
+This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an indepedent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
+
+Why Markdown?
+-------------
+
+If the idea is to make a wiki then the most obvious text format to use is probably the mediawiki/wikitext format used by Wikipedia since it's widely deployed in all mediawiki installations and used for decades with great success. However, it turns out that format is very bloated and convoluted, has way too many features and probably because of that it doesn't have many alternative implementations out there, and the ones that exist are not complete and don't look very trustworthy. Also it is very much a centralized format that can probably be changed at the whims of the Wikipedia owners.
+
+On the other hand, Markdown has proven to work well for small scale wikis and one of the biggest wikis in the planet (which is not very often thought of as a wiki), [StackOverflow](https://stackoverflow.com) and its child sites, and also one of the biggest "personal wiki" software, [Obsidian](https://obsidian.md/). Markdown can probably deliver 95% of the functionality of wikitext. When augmented with tables, diagram generators and MathJax (which are common extensions that exist in the wild and can be included in this NIP) that rate probably goes to 99%, and its simplicity is a huge benefit that can't be overlooked. Wikitext format can also be transpíled into Markdown using Pandoc. Given all that, I think it's a reasonable suspicion that mediawiki is not inherently better than Markdown, the success of Wikipedia probably cannot be predicated on the syntax language choice.
+
+# Appendix 1: Merge requests
+Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
+
+```js
+{
+ "content": "I added information about how to make hot ice-creams",
+ "kind": 818,
+ "tags": [
+ [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
+ [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
+ [ "p", "<destination-pubkey>" ],
+ [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
+ ]
+}
+```
+
+`.content`: an optional explanation detailing why this merge is being requested.
+`a` tag: tag of the article which should be modified (i.e. the target of this merge request).
+`e` tag: optional version of the article in which this modifications is based
+`e` tag with `source` marker: the ID of the event that should be merged. This event id MUST be of a `kind:30818` as defined in this NIP.
+
+The destination-pubkey (the pubkey being requested to merge something into their article can create [[NIP-25]] reactions that tag the `kind:818` event with `+` or `-`
diff --git a/README.md b/README.md
index 619c984..b3736ea 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-51: Lists](51.md)
- [NIP-52: Calendar Events](52.md)
- [NIP-53: Live Activities](53.md)
+- [NIP-54: Wiki](54.md)
- [NIP-56: Reporting](56.md)
- [NIP-57: Lightning Zaps](57.md)
- [NIP-58: Badges](58.md)
@@ -171,6 +172,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `30402` | Classified Listing | [99](99.md) |
| `30403` | Draft Classified Listing | [99](99.md) |
| `30617` | Repository announcements | [34](34.md) |
+| `30818` | Wiki article | [54](54.md) |
| `31922` | Date-Based Calendar Event | [52](52.md) |
| `31923` | Time-Based Calendar Event | [52](52.md) |
| `31924` | Calendar | [52](52.md) |
commit 3834c6b60474a677b53847743212df27710e64ec
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 4 16:10:13 2024 -0400
Simplifying reactions
diff --git a/25.md b/25.md
index 3b4aa59..bdee066 100644
--- a/25.md
+++ b/25.md
@@ -25,14 +25,13 @@ consider it a "+".
Tags
----
-The reaction event SHOULD include `e` and `p` tags from the note the user is
-reacting to. This allows users to be notified of reactions to posts they were
-mentioned in. Including the `e` tags enables clients to pull all the reactions
-associated with individual posts or all the posts in a thread.
+The reaction event SHOULD include `e` and `p` tags pointing to the note the user is
+reacting to. The `p` tag allows authors to be notified. The `e` tags enables clients
+to pull all the reactions to individual posts.
-The last `e` tag MUST be the `id` of the note that is being reacted to.
+The `e` tag MUST be the `id` of the note that is being reacted to.
-The last `p` tag MUST be the `pubkey` of the event being reacted to.
+The `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
of the reacted event as its value.
@@ -41,9 +40,6 @@ Example code
```swift
func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> NostrEvent {
- var tags: [[String]] = liked.tags.filter {
- tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p")
- }
tags.append(["e", liked.id])
tags.append(["p", liked.pubkey])
tags.append(["k", liked.kind])
commit 4bcf91944a9e53680cc928424e7af145242b1a39
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 4 16:35:39 2024 -0400
adds a tags.
diff --git a/25.md b/25.md
index bdee066..7cc96b5 100644
--- a/25.md
+++ b/25.md
@@ -25,12 +25,15 @@ consider it a "+".
Tags
----
-The reaction event SHOULD include `e` and `p` tags pointing to the note the user is
+The reaction event SHOULD include `a`, `e` and `p` tags pointing to the note the user is
reacting to. The `p` tag allows authors to be notified. The `e` tags enables clients
-to pull all the reactions to individual posts.
+to pull all the reactions to individual events and `a` tags enables clients to seek reactions
+for all versions of a replaceable event.
The `e` tag MUST be the `id` of the note that is being reacted to.
+The `a` tag MUST contain the coordinates (`kind:pubkey:d-tag`) of the replaceable being reacted to.
+
The `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
commit f393df80361da9226be131f0e91970268bb6be2d
Merge: dcb5d0f 2b490b1
Author: Alex Gleason <
[email protected]>
Date: Sat May 4 19:43:51 2024 -0500
Merge pull request #1213 from lucasnuic/reporting-digital-threats-as-malware
NIP-56 to reporting of digital threats
commit c1360c4f0b111143747bad6226df6f00499f5cfe
Author: fiatjaf <
[email protected]>
Date: Sat May 4 23:34:37 2024 -0300
nip54: add normalization rules.
diff --git a/54.md b/54.md
index 7870330..c481eb6 100644
--- a/54.md
+++ b/54.md
@@ -21,7 +21,12 @@ Articles are identified by lowercase, normalized ascii `d` tags.
}
```
-[INSERT NORMALIZATION EXAMPLES]
+### `d` tag normalization rules
+
+- Any non-letter character MUST be converted to a `-`.
+- All letters MUST be converted to lowercase.
+
+### Content rules
The content should be Markdown, following the same rules as of [NIP-23](23.md), although it takes some extra (optional) metadata tags:
commit 8073c848a33007c6e03d1de4d4fd17d46c2a0242
Merge: 4fa65b8 4bcf919
Author: hodlbod <
[email protected]>
Date: Mon May 6 08:28:36 2024 -0700
Merge pull request #1221 from vitorpamplona/fix-reactions
Changes reactions to not include the entire thread as e-tags.
commit 4fa65b81cede9eaf8375d4f92bc80cf298190e0c
Author: fiatjaf <
[email protected]>
Date: Sat May 4 23:36:48 2024 -0300
nip54: fix json indentation.
diff --git a/54.md b/54.md
index c481eb6..2090182 100644
--- a/54.md
+++ b/54.md
@@ -13,11 +13,11 @@ Articles are identified by lowercase, normalized ascii `d` tags.
### Articles
```jsonc
{
- "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
- "tags": [
- [ "d", "wiki" ],
- [ "title", "Wiki" ],
- ]
+ "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
+ "tags": [
+ ["d", "wiki"],
+ ["title", "Wiki"],
+ ]
}
```
@@ -93,14 +93,14 @@ Users can request other users to get their entries merged into someone else's en
```jsonc
{
- "content": "I added information about how to make hot ice-creams",
- "kind": 818,
- "tags": [
- [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
- [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
- [ "p", "<destination-pubkey>" ],
- [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
- ]
+ "content": "I added information about how to make hot ice-creams",
+ "kind": 818,
+ "tags": [
+ [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
+ [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
+ [ "p", "<destination-pubkey>" ],
+ [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
+ ]
}
```
commit cb9bddb8dfd11972286215d9bdee7434764ccf7b
Author: Adam Shannon <
[email protected]>
Date: Sat May 11 11:52:32 2024 -0500
all: minor spelling fixes
diff --git a/34.md b/34.md
index 03ee039..fcc2cec 100644
--- a/34.md
+++ b/34.md
@@ -125,7 +125,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
["p", "<root-event-author>"],
["p", "<revision-author>"],
- // optional for improved subscription filter efficency
+ // optional for improved subscription filter efficiency
["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
["r", "<earliest-unique-commit-id-of-repo>"]
diff --git a/46.md b/46.md
index e0a5b2e..1528116 100644
--- a/46.md
+++ b/46.md
@@ -208,7 +208,7 @@ When the user types a NIP-05 the client:
#### Remote signer discovery via NIP-89
-In this last case, most often used to fascilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events.
+In this last case, most often used to facilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events.
First the client will query for `kind: 31990` events that have a `k` tag of `24133`.
diff --git a/54.md b/54.md
index 2090182..8823af9 100644
--- a/54.md
+++ b/54.md
@@ -79,7 +79,7 @@ Wiki-events can tag other wiki-events with a `defer` marker to indicate that it
This is a stronger signal of trust than a `+` reaction.
-This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an indepedent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
+This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an independent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
Why Markdown?
-------------
diff --git a/72.md b/72.md
index 4bafce0..5a8be0a 100644
--- a/72.md
+++ b/72.md
@@ -76,7 +76,7 @@ The post-approval event MUST include `a` tags of the communities the moderator i
It's recommended that multiple moderators approve posts to avoid deleting them from the community when a moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign new approvals for posts in the past or the community will restart. The owner can also periodically copy and re-sign of each moderator's approval events to make sure posts don't disappear with moderators.
-Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the repleceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
+Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the replaceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
Clients SHOULD evaluate any non-`34550:*` `a` tag as posts to be included in all `34550:*` `a` tags.
diff --git a/90.md b/90.md
index 241eb38..2b499a8 100644
--- a/90.md
+++ b/90.md
@@ -199,7 +199,7 @@ Some service providers might choose to submit a `payment-required` as the first
It's not up to this NIP to define how individual vending machines should choose to run their business.
# Cancellation
-A job request might be cancelled by publishing a `kind:5` delete request event tagging the job request event.
+A job request might be canceled by publishing a `kind:5` delete request event tagging the job request event.
# Appendix 1: Job chaining
A Customer MAY request multiple jobs to be processed as a chain, where the output of a job is the input of another job. (e.g. podcast transcription -> summarization of the transcription). This is done by specifying as input an event id of a different job with the `job` type.
commit 69e14f1dca1e7ae439072d157b62ad3462086116
Merge: 8073c84 cb9bddb
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 11 13:19:29 2024 -0400
Merge pull request #1230 from adamdecaf/misc-spelling-fixes
all: minor spelling fixes
commit c2d9b40d5bcf2d04cd04c19b42065e5158ecbab8
Author: Adam Shannon <
[email protected]>
Date: Sat May 11 12:38:01 2024 -0500
nip90: fix links
diff --git a/90.md b/90.md
index 2b499a8..5a15ebb 100644
--- a/90.md
+++ b/90.md
@@ -162,8 +162,8 @@ Service providers can give feedback about a job back to the customer.
```
* `content`: Either empty or a job-result (e.g. for partial-result samples)
-* `amount` tag: as defined in the [Job Result](#job-result) section.
-* `status` tag: Service Providers SHOULD indicate what this feedback status refers to. [Appendix 1](#appendix-1-job-feedback-status) defines status. Extra human-readable information can be added as an extra argument.
+* `amount` tag: as defined in the [Job Result](#job-result-kind6000-6999) section.
+* `status` tag: Service Providers SHOULD indicate what this feedback status refers to. [Job Feedback Status](#job-feedback-status) defines status. Extra human-readable information can be added as an extra argument.
* NOTE: If the input params requires input to be encrypted, then `content` field will have encrypted payload with `p` tag as key.
@@ -177,7 +177,7 @@ Service providers can give feedback about a job back to the customer.
| `success` | Service Provider successfully processed the job. |
| `partial` | Service Provider partially processed the job. The `.content` might include a sample of the partial results. |
-Any job feedback event MIGHT include results in the `.content` field, as described in the [Job Result](#job-result) section. This is useful for service providers to provide a sample of the results that have been processed so far.
+Any job feedback event MIGHT include results in the `.content` field, as described in the [Job Result](#job-result-kind6000-6999) section. This is useful for service providers to provide a sample of the results that have been processed so far.
# Protocol Flow
commit 9f13e76f022317a915386c1053dc8bac0a1a0dd3
Author: Asai Toshiya <
[email protected]>
Date: Mon May 13 21:11:30 2024 +0900
BREAKING.md: add NIP-34 change
diff --git a/BREAKING.md b/BREAKING.md
index 8024814..b59bc8b 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -5,6 +5,7 @@ reverse chronological order.
| Date | Commit | NIP | Change |
| ----------- | --------- | -------- | ------ |
+| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
commit 0acdf57ab18ef4143fc6ca8dc800adf1437bf95e
Merge: 69e14f1 c2d9b40
Author: hodlbod <
[email protected]>
Date: Sat May 11 11:36:22 2024 -0700
Merge pull request #1231 from adamdecaf/nip-90-link-fixes
nip90: fix links
commit a02c3621a956355c1e44640891d6316a1567463f
Merge: 0acdf57 9f13e76
Author: hodlbod <
[email protected]>
Date: Mon May 13 05:55:51 2024 -0700
Merge pull request #1235 from AsaiToshiya/AsaiToshiya-patch-8
BREAKING.md: add NIP-34 change
commit 38ee6511dc3ac9fb1b5b91920963844e2a9a0ada
Author: Asai Toshiya <
[email protected]>
Date: Tue May 14 01:17:46 2024 +0900
BREAKING.md: fix date
diff --git a/BREAKING.md b/BREAKING.md
index b59bc8b..7b48ee0 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -7,7 +7,7 @@ reverse chronological order.
| ----------- | --------- | -------- | ------ |
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
-| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
+| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed |
commit 734f379a2a2f225f76f87cdcf074c997a0d40d35
Author: Jon Staab <
[email protected]>
Date: Tue Apr 23 11:34:17 2024 -0700
Add ontolo to nip 32
diff --git a/32.md b/32.md
index be4e872..92497a6 100644
--- a/32.md
+++ b/32.md
@@ -151,3 +151,11 @@ A good heuristic for whether a use case fits this NIP is whether labels would ev
For example, many events might be labeled with a particular place, topic, or pubkey, but labels
with specific values like "John Doe" or "3.18743" are not labels, they are values, and should
be handled in some other way.
+
+
+Appendix: Known Ontologies
+-------------------------
+
+Below is a non-exhaustive list of ontologies currently in widespread use.
+
+- (social.ontolo.categories)[https://ontolo.social/]
commit b1f771302a6a1a94c888b619e08a9c302df85fc2
Author: Sam Samskies <
[email protected]>
Date: Sat May 11 14:58:40 2024 -0500
fix NWC connection string example
diff --git a/47.md b/47.md
index 9033847..0f93b20 100644
--- a/47.md
+++ b/47.md
@@ -95,7 +95,7 @@ The **client** should then store this connection and use it when the user wants
### Example connection string
```sh
-nostr+walletconnect:b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c
+nostr+walletconnect://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c
```
## Commands
commit caee48316f811f928d92c44892ea173d990b2ebc
Author: Asai Toshiya <
[email protected]>
Date: Fri May 17 19:45:27 2024 +0900
NIP-24: clarify meaning of "event" for title
diff --git a/24.md b/24.md
index 449101a..b21f48e 100644
--- a/24.md
+++ b/24.md
@@ -40,4 +40,4 @@ tags
These tags may be present in multiple event kinds. Whenever a different meaning is not specified by some more specific NIP, they have the following meanings:
- `r`: a web URL the event is referring to in some way
- - `title`: title of the event
+ - `title`: name of [NIP-51](51.md) sets, [NIP-52](52.md) calendar event, [NIP-53](53.md) live event or [NIP-99](99.md) listing
commit 1da44a5b712363da6ed2aa149f498da08d087782
Author: Terry Yiu <
[email protected]>
Date: Fri May 17 08:13:02 2024 -0400
Add missing comma in the example gift wrap JSON for NIP-59
diff --git a/59.md b/59.md
index 7eff2b8..4dc857f 100644
--- a/59.md
+++ b/59.md
@@ -155,7 +155,7 @@ Sign the `gift wrap` using the random key generated in the previous step.
"created_at": 1703021488,
"pubkey": "18b1a75918f1f2c90c23da616bce317d36e348bcf5f7ba55e75949319210c87c",
"id": "5c005f3ccf01950aa8d131203248544fb1e41a0d698e846bd419cec3890903ac",
- "sig": "35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df750097b04f9e13053764251b8bc5dd7e8e0794a3426a90b6bcc7e5ff660f54259"
+ "sig": "35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df750097b04f9e13053764251b8bc5dd7e8e0794a3426a90b6bcc7e5ff660f54259",
"tags": [["p", "166bf3765ebd1fc55decfe395beff2ea3b2a4e0a8946e7eb578512b555737c99"]],
}
```
commit bff2e9a28adcb5a6935157441825ca4fe1329a25
Merge: 7c3fd43 caee483
Author: hodlbod <
[email protected]>
Date: Fri May 17 08:00:20 2024 -0700
Merge pull request #1239 from AsaiToshiya/AsaiToshiya-patch-9
NIP-24: clarify meaning of "event" for title
commit 7c3fd43736a938482e7241cc17666a0dba9c4681
Merge: 734f379 1da44a5
Author: Asai Toshiya <
[email protected]>
Date: Fri May 17 21:19:33 2024 +0900
Merge pull request #1240 from tyiu/tyiu/missing-comma-nip-59
Add missing comma in the example gift wrap JSON for NIP-59
commit 0628ec171c99aac7ccece43e64a0d32c15fb54d0
Author: randymcmillan <
[email protected]>
Date: Wed May 15 22:10:43 2024 -0400
cargo:init
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..d4d1799
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "nips"
+version.workspace = true
+license.workspace = true
+rust-version.workspace = true
+edition.workspace = true
+readme.workspace = true
+homepage.workspace = true
+repository.workspace = true
+documentation.workspace = true
+categories.workspace = true
+keywords.workspace = true
+description.workspace = true
+authors.workspace = true
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
commit a59ce8970ae8fb9c05bcd9e716e95187e9db6c17
Author: Braydon Fuller <
[email protected]>
Date: Fri May 17 12:02:21 2024 -0700
Fix connection string protocol description. (#1243)
* Fix connection string protocol description.
* Update `nostr+walletconnect` reference.
diff --git a/47.md b/47.md
index 0f93b20..983d2c9 100644
--- a/47.md
+++ b/47.md
@@ -81,7 +81,7 @@ If the command was successful, the `error` field must be null.
## Nostr Wallet Connect URI
**client** discovers **wallet service** by scanning a QR code, handling a deeplink or pasting in a URI.
-The **wallet service** generates this connection URI with protocol `nostr+walletconnect:` and base path it's hex-encoded `pubkey` with the following query string parameters:
+The **wallet service** generates this connection URI with protocol `nostr+walletconnect://` and base path it's hex-encoded `pubkey` with the following query string parameters:
- `relay` Required. URL of the relay where the **wallet service** is connected and will be listening for events. May be more than one.
- `secret` Required. 32-byte randomly generated hex encoded string. The **client** MUST use this to sign events and encrypt payloads when communicating with the **wallet service**.
@@ -402,7 +402,7 @@ Response:
## Example pay invoice flow
-0. The user scans the QR code generated by the **wallet service** with their **client** application, they follow a `nostr+walletconnect:` deeplink or configure the connection details manually.
+0. The user scans the QR code generated by the **wallet service** with their **client** application, they follow a `nostr+walletconnect://` deeplink or configure the connection details manually.
1. **client** sends an event to the **wallet service** with kind `23194`. The content is a `pay_invoice` request. The private key is the secret from the connection string above.
2. **wallet service** verifies that the author's key is authorized to perform the payment, decrypts the payload and sends the payment.
3. **wallet service** responds to the event by sending an event with kind `23195` and content being a response either containing an error message or a preimage.
commit 2b17a5407e0eb614edb62704e214ae13aecec386
Author: randymcmillan <
[email protected]>
Date: Thu May 16 09:24:37 2024 -0400
Cargo.toml:src/main.rs:add include_dir
diff --git a/Cargo.toml b/Cargo.toml
index d4d1799..56695eb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,3 +16,4 @@ authors.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..add5545 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,13 @@
+use std::path::Path;
+use include_dir::{include_dir, Dir};
+static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
fn main() {
- println!("Hello, world!");
+ print_entries();
+}
+//#[cfg(feature = "glob")]
+fn print_entries() -> () {
+ let glob = "**/*.md";
+ for entry in PROJECT_DIR.find(glob).unwrap() {
+ println!("Found {}", entry.path().display());
+ }
}
commit ea115396fff0ac3db30a16d7f4920e209aabed41
Author: randymcmillan <
[email protected]>
Date: Thu May 16 16:31:43 2024 -0400
display markdown:initial config
diff --git a/Cargo.toml b/Cargo.toml
index 56695eb..f461a40 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,4 +16,6 @@ authors.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+comrak = "0.23.0"
include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
+markdown2html-converter = "1.1.12"
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..99acb95
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1 @@
+-include cargo.mk
diff --git a/cargo.mk b/cargo.mk
new file mode 120000
index 0000000..09daa8d
--- /dev/null
+++ b/cargo.mk
@@ -0,0 +1 @@
+../cargo.mk
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index add5545..146ddba 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,13 +1,53 @@
-use std::path::Path;
use include_dir::{include_dir, Dir};
+use std::path::Path;
+extern crate comrak;
+use comrak::nodes::NodeValue;
+use comrak::{format_html, parse_document, Arena, Options};
+
+static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
+
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
+
+fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String {
+ // The returned nodes are created in the supplied Arena, and are bound by its lifetime.
+ let arena = Arena::new();
+
+ // Parse the document into a root `AstNode`
+ let root = parse_document(&arena, document, &Options::default());
+
+ // Iterate over all the descendants of root.
+ for node in root.descendants() {
+ if let NodeValue::Text(ref mut text) = node.data.borrow_mut().value {
+ // If the node is a text node, perform the string replacement.
+ *text = text.replace(orig_string, replacement)
+ }
+ }
+
+ let mut html = vec![];
+ format_html(root, &Options::default(), &mut html).unwrap();
+
+ String::from_utf8(html).unwrap()
+}
+
fn main() {
+
+ // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my* input.\n";
+ // let orig = "my";
+ // let repl = "your";
+ // let html = replace_text(&doc, &orig, &repl);
+ // println!("{}", html);
+
print_entries();
}
-//#[cfg(feature = "glob")]
+
fn print_entries() -> () {
let glob = "**/*.md";
for entry in PROJECT_DIR.find(glob).unwrap() {
+
println!("Found {}", entry.path().display());
+
+ let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ let readme = README_MD.contents_utf8().unwrap();
+ println!("readme={}", readme);
}
}
commit 53c924176337e2923330dfb677060b37268cbe7f
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:58:13 2024 -0400
build.rs
diff --git a/build.rs b/build.rs
index 439ffaf..b6d5f6c 100644
--- a/build.rs
+++ b/build.rs
@@ -3,6 +3,8 @@ use std::path::Path;
use std::process::Command;
fn main() {
+let _out_dir = env::var("OUT_DIR").unwrap();
+
Command::new("git")
.args(&[
"remote",
commit d2e4ce291b3181dcbc4eb4855a0a050e0a8ffe33
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:55:14 2024 -0400
Cargo.toml:workspace config
diff --git a/Cargo.toml b/Cargo.toml
index f461a40..b45a312 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,18 +1,14 @@
[package]
name = "nips"
-version.workspace = true
-license.workspace = true
-rust-version.workspace = true
-edition.workspace = true
-readme.workspace = true
-homepage.workspace = true
-repository.workspace = true
-documentation.workspace = true
-categories.workspace = true
-keywords.workspace = true
-description.workspace = true
-authors.workspace = true
-
+version = { workspace = true }
+edition = { workspace = true }
+rust-version = { workspace = true }
+license = { workspace = true }
+homepage = { workspace = true }
+repository = { workspace = true }
+documentation = { workspace = true }
+keywords = { workspace = true }
+readme = { workspace = true }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
commit 8f081030fdae7917cd7cd58f86dd705bef1382f2
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:20:49 2024 -0400
nips/src/main.rs:apply cargo +nightly fmt
diff --git a/src/main.rs b/src/main.rs
index 146ddba..d253240 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,6 @@
use include_dir::{include_dir, Dir};
-use std::path::Path;
extern crate comrak;
+
use comrak::nodes::NodeValue;
use comrak::{format_html, parse_document, Arena, Options};
@@ -9,7 +9,8 @@ static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String {
- // The returned nodes are created in the supplied Arena, and are bound by its lifetime.
+ // The returned nodes are created in the supplied Arena, and are bound by its
+ // lifetime.
let arena = Arena::new();
// Parse the document into a root `AstNode`
@@ -30,24 +31,35 @@ fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String
}
fn main() {
-
- // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my* input.\n";
- // let orig = "my";
+ // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my*
+ // input.\n"; let orig = "my";
// let repl = "your";
// let html = replace_text(&doc, &orig, &repl);
// println!("{}", html);
- print_entries();
+ const BOUND: u8 = 50;
+ print_entries::<{ BOUND }>();
}
-fn print_entries() -> () {
+fn print_entries<const BOUND: u8>() -> () {
+ let mut count: u8 = 0;
let glob = "**/*.md";
- for entry in PROJECT_DIR.find(glob).unwrap() {
+ let mut nip_vec = Vec::<String>::new(); // Create an empty Vec
+ for entry in PROJECT_DIR.find(glob).unwrap() {
+ count = count + 1;
+ println!("count={}", count);
println!("Found {}", entry.path().display());
-
- let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- let readme = README_MD.contents_utf8().unwrap();
- println!("readme={}", readme);
}
+ for i in 1..count - 1 {
+ //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
+ //println!("Found {}", entry.path().display());
+ //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ //let readme = README_MD.contents_utf8().unwrap();
+ // println!("readme={}", readme);
+ nip_vec.push((i * 1).to_string());
+ }
+
+ println!("Vec: {:?}", nip_vec);
+ println!("BOUND={}", BOUND);
}
commit bd57127acf808ba4b5c4bc0c7415ab63f4aa85de
Author: randymcmillan <
[email protected]>
Date: Fri May 17 12:19:42 2024 -0400
src/main.rs:intermediate:traverse docs
diff --git a/src/main.rs b/src/main.rs
index 002e7bc..f6a5105 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -56,28 +56,40 @@ fn print_entries<const BOUND: u8>() -> () {
let content = md_content.contents_utf8().unwrap();
println!("\n{}", content);
}
- let (a, b) = nip_vec.split_at(1);
- println!("a={:}", format!("{:?}",a[0]));
- let mut readme = PROJECT_DIR.get_file(a[0].clone()).unwrap();
+
+ println!("count={}", count); //original document count
+
+ //README.md
+ let (first, remainder) = nip_vec.split_at(1);
+ //println!("a={:}", format!("{:?}",a[0]));
+ let mut readme = PROJECT_DIR.get_file(first[0].clone()).unwrap();
let readme_md = readme.contents_utf8().unwrap();
println!("\n{}", readme_md);
- println!("b={:?}", b);
- let (c, d) = b.split_at(1);
- println!("c={:?}", c);
- println!("d={:?}", d);
- let (e, f) = d.split_at(1);
- println!("e={:?}", e);
- println!("f={:?}", f);
- let (g, h) = f.split_at(1);
- println!("e={:?}", g);
- println!("f={:?}", h);
- //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
- //println!("Found {}", entry.path().display());
- //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- //let readme = README_MD.contents_utf8().unwrap();
- //println!("readme={}", readme);
- //nip_vec.push((i * 1).to_string());
-
- //println!("Vec: {:?}", nip_vec);
- //println!("BOUND={}", BOUND);
+
+ count = count - 1;
+ println!("count={}", count);
+
+ //second
+ //BREAKING.md
+ let mut breaking = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let breaking_md = breaking.contents_utf8().unwrap();
+ println!("\n{}", breaking_md);
+
+ //REMAINDERS
+ //count variable based on new documents added to nips repo
+
+ //traverse documents from last to no more remainders
+ count = count - 1;
+
+ //loop {
+ // if count > 1 {
+ // print!("count={}", count);
+ // }
+ // count = count - 1;
+ //}
+ println!("count={}", count);
+ let (last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ //println!("\nlast_md={}", last_md);
}
commit 2b43b8b9fd00a4492dd9adedf3297a9aa55181d7
Author: randymcmillan <
[email protected]>
Date: Fri May 17 09:24:39 2024 -0400
build.rs:src/main.rs:apply cargo +nightly fmt
diff --git a/build.rs b/build.rs
index b6d5f6c..62483c7 100644
--- a/build.rs
+++ b/build.rs
@@ -1,9 +1,9 @@
use std::env;
-use std::path::Path;
+//use std::path::Path;
use std::process::Command;
fn main() {
-let _out_dir = env::var("OUT_DIR").unwrap();
+ let _out_dir = env::var("OUT_DIR").unwrap();
Command::new("git")
.args(&[
diff --git a/src/main.rs b/src/main.rs
index d253240..2193be3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,7 @@ extern crate comrak;
use comrak::nodes::NodeValue;
use comrak::{format_html, parse_document, Arena, Options};
-static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
+//static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
@@ -48,18 +48,23 @@ fn print_entries<const BOUND: u8>() -> () {
for entry in PROJECT_DIR.find(glob).unwrap() {
count = count + 1;
- println!("count={}", count);
- println!("Found {}", entry.path().display());
+ //println!("count={}", count);
+ //println!("Found {}", entry.path().display());
+ nip_vec.push((entry.path().display()).to_string());
+ nip_vec.push("md content".to_string());
+ let mut md_content = PROJECT_DIR.get_file(entry.path()).unwrap();
+ let content = md_content.contents_utf8().unwrap();
+ println!("\n{}", content);
}
for i in 1..count - 1 {
//nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
//println!("Found {}", entry.path().display());
//let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
//let readme = README_MD.contents_utf8().unwrap();
- // println!("readme={}", readme);
- nip_vec.push((i * 1).to_string());
+ //println!("readme={}", readme);
+ //nip_vec.push((i * 1).to_string());
}
- println!("Vec: {:?}", nip_vec);
- println!("BOUND={}", BOUND);
+ //println!("Vec: {:?}", nip_vec);
+ //println!("BOUND={}", BOUND);
}
commit 9d7c194abef287ba59c81960d88e696d3291773c
Author: randymcmillan <
[email protected]>
Date: Fri May 17 11:16:30 2024 -0400
src/main.rs:intermediate access to README.md
diff --git a/src/main.rs b/src/main.rs
index 2193be3..002e7bc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -49,21 +49,34 @@ fn print_entries<const BOUND: u8>() -> () {
for entry in PROJECT_DIR.find(glob).unwrap() {
count = count + 1;
//println!("count={}", count);
- //println!("Found {}", entry.path().display());
+ //println!("{}", entry.path().display());
nip_vec.push((entry.path().display()).to_string());
- nip_vec.push("md content".to_string());
+ //nip_vec.push("md content".to_string());
let mut md_content = PROJECT_DIR.get_file(entry.path()).unwrap();
let content = md_content.contents_utf8().unwrap();
println!("\n{}", content);
}
- for i in 1..count - 1 {
- //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
- //println!("Found {}", entry.path().display());
- //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- //let readme = README_MD.contents_utf8().unwrap();
- //println!("readme={}", readme);
- //nip_vec.push((i * 1).to_string());
- }
+ let (a, b) = nip_vec.split_at(1);
+ println!("a={:}", format!("{:?}",a[0]));
+ let mut readme = PROJECT_DIR.get_file(a[0].clone()).unwrap();
+ let readme_md = readme.contents_utf8().unwrap();
+ println!("\n{}", readme_md);
+ println!("b={:?}", b);
+ let (c, d) = b.split_at(1);
+ println!("c={:?}", c);
+ println!("d={:?}", d);
+ let (e, f) = d.split_at(1);
+ println!("e={:?}", e);
+ println!("f={:?}", f);
+ let (g, h) = f.split_at(1);
+ println!("e={:?}", g);
+ println!("f={:?}", h);
+ //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
+ //println!("Found {}", entry.path().display());
+ //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ //let readme = README_MD.contents_utf8().unwrap();
+ //println!("readme={}", readme);
+ //nip_vec.push((i * 1).to_string());
//println!("Vec: {:?}", nip_vec);
//println!("BOUND={}", BOUND);
commit 8127bbda809b0cc3163bf79f3bfdf3f46016b481
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:49:49 2024 -0400
build.rs:git fetch/rebase upstream/master
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..439ffaf
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,36 @@
+use std::env;
+use std::path::Path;
+use std::process::Command;
+
+fn main() {
+ Command::new("git")
+ .args(&[
+ "remote",
+ "add",
+ "gnostr-org",
+ "
[email protected]:gnostr-org/nips.git",
+ ])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&[
+ "remote",
+ "add",
+ "upstream",
+ "
[email protected]:nostr-protocol/nips.git",
+ ])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["fetch", "--all"])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["fetch", "--all", "--tags"])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["rebase", "upstream/master"])
+ .status()
+ .unwrap();
+}
commit 0f968441be79c4d18c0935e67f5c0e4c8a9f8fa0
Author: randymcmillan <
[email protected]>
Date: Fri May 17 17:53:19 2024 -0400
post-commit-history:script
diff --git a/post-commit-history b/post-commit-history
new file mode 100755
index 0000000..55ea811
--- /dev/null
+++ b/post-commit-history
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+count=0;
+new_count=0;
+INIT_COMMIT=$(git rev-list --all --max-parents=0)
+#echo $INIT_COMMIT;#exit
+##git log -1 --skip 2 --pretty=format:"%h"
+##git rev-parse --short=256 HEAD~2
+
+## n=`printf '%016s' "$(git rev-parse --short=4 HEAD~2)"`
+#n=`printf '%064s' "$(git rev-parse HEAD~0)"`
+echo $n
+## exit
+
+## branch=master
+## for commit in $(git rev-list $branch)
+## do
+## ## if git ls-tree --name-only -r $commit | grep -q '\.hbm\.xml$'; then
+## if git ls-tree --name-only -r $commit; then
+##
+## ##echo $commit
+## exit 0
+## fi
+## done
+## exit;
+
+## var=$((var+1))
+## ((var=var+1))
+## ((var+=1))
+## ((var++))
+
+#count=0
+for commit_hash in $(git rev-list master);do
+
+padded_commit_hash=`printf '%064s' "$commit_hash"`
+#echo $padded_commit_hash
+#exit
+#echo $commit_hash
+count=$((count+1))
+done
+#exit
+export COUNT=$count
+#exit
+
+#new_count = 0
+for commit_hash in $(gnostr-reflog);do
+#echo $commit_hash
+padded_commit_hash=`printf '%064s' "$commit_hash"`
+#echo $padded_commit_hash
+export NEW_COUNT=$new_count
+#n=`printf '%064s' "$(git rev-parse HEAD~$count)"`
+#echo $n
+gnostr --sec $padded_commit_hash -t $padded_commit_hash --tag nip_commit $commit_hash --content "$(git show $commit_hash || exit)" | gnostr-post-event --relay wss://e.nos.lol || exit
+##echo $commit_hash;
+ #for commit_padded_hash in $(gnostr-reflog -p);do
+ ##echo $commit_padded_hash;
+ # gnostr --sec $commit_padded_hash --content "$(git show $commit_hash)"
+ #done
+if [[ "$commit_hash" == "$INIT_COMMIT" ]]; then
+exit;
+fi
+new_count=$((new_count+1))
+#echo $count & wait
+#echo $new_count & wait
+#exit
+done
+exit;
commit 5973f629e89363defe501531959063f7eabb6bba
Author: randymcmillan <
[email protected]>
Date: Fri May 17 12:31:50 2024 -0400
src/main.rs:intermediate:traverse docs
diff --git a/src/main.rs b/src/main.rs
index f6a5105..4840ddf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -81,15 +81,31 @@ fn print_entries<const BOUND: u8>() -> () {
//traverse documents from last to no more remainders
count = count - 1;
- //loop {
- // if count > 1 {
- // print!("count={}", count);
- // }
- // count = count - 1;
- //}
+
+ print!("count={}",count);
+ count = count - 1;
+ println!("count={}", count);
+ let (mut last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
+
+ print!("count={}",count);
+ count = count - 1;
+ println!("count={}", count);
+ let (mut last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
+
+ print!("count={}",count);
+ count = count - 1;
println!("count={}", count);
- let (last, remainder) = remainder.split_at(1);
+ let (mut last, remainder) = remainder.split_at(1);
let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
let last_md = last.contents_utf8().unwrap();
- //println!("\nlast_md={}", last_md);
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
}
commit 849f59f6ba540c8a30c5304c8c3ffe10165a6148
Merge: 5b2461e ac1221f
Author: Alex Gleason <
[email protected]>
Date: Mon Mar 4 20:43:18 2024 -0500
Merge pull request #1100 from AsaiToshiya/AsaiToshiya-patch-3
BREAKING.md: add NIP-18 change
commit ac1221fa5d855fd838e29d71c636897feae6c3a2
Author: Asai Toshiya <
[email protected]>
Date: Tue Mar 5 10:34:01 2024 +0900
BREAKING.md: add NIP-18 change
diff --git a/BREAKING.md b/BREAKING.md
index cd8c03d..3693c34 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -5,6 +5,7 @@ reverse chronological order.
| Date | Commit | NIP | Change |
| ----------- | --------- | -------- | ------ |
+| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed |
commit 9a283796ce95261c960d1b9ffc13e8f278079956
Author: fiatjaf_ <
[email protected]>
Date: Tue Mar 5 08:57:59 2024 -0300
NIP-34: git stuff (#997)
* NIP-34: git stuff.
* repository head.
* threads/issues and replies.
* add "p" optional tags to events.
* add list of things to do later in the end.
* multiple values in some tags instead of multiple tags.
* replace "patches", "issues" tags and replace that with "relays".
* bring in tags that allow for a commit id to be stable.
* edit "reply" kind to say it should follow normal NIP-10 threading rules.
* update "things to be added later".
* add commit time to "committer" tag.
* remove "head" tag.
* mention the possibility of mentioning others users in patches.
Co-authored-by: DanConwayDev <
[email protected]>
* clarify commit-pgp-sig.
* clarify requirements and threading of replies.
* add t=root tag.
---------
Co-authored-by: DanConwayDev <
[email protected]>
diff --git a/34.md b/34.md
new file mode 100644
index 0000000..651407d
--- /dev/null
+++ b/34.md
@@ -0,0 +1,102 @@
+NIP-34
+======
+
+`git` stuff
+-----------
+
+`draft` `optional`
+
+This NIP defines all the ways code collaboration using and adjacent to [`git`](https://git-scm.com/) can be done using Nostr.
+
+## Repository announcements
+
+Git repositories are hosted in Git-enabled servers, but their existence can be announced using Nostr events, as well as their willingness to receive patches, bug reports and comments in general.
+
+```jsonc
+{
+ "kind": 30617,
+ "content": "",
+ "tags": [
+ ["d", "<repo-id>"],
+ ["name", "<human-readable project name>"],
+ ["description", "brief human-readable project description>"],
+ ["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
+ ["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
+ ["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
+ ]
+}
+```
+
+The tags `web`, `clone`, `relays` can have multiple values.
+
+Except `d`, all tags are optional.
+
+## Patches
+
+Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
+
+```jsonc
+{
+ "kind": 1617,
+ "content": "<patch>", // contents of <git format-patch>
+ "tags": [
+ ["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>"],
+ ["p", "<repository-owner>"],
+ ["p", "<other-user>"], // optionally send the patch to another user to bring it to their attention
+
+ // for the first patch in a thread or series
+ ["t", "root"],
+
+ // optional tags for when it is desirable that the merged patch has a stable commit id
+ // these fields are necessary for ensuring that the commit resulting from applying a patch
+ // has the same id as it had in the proposer's machine -- all these tags can be omitted
+ // if the maintainer doesn't care about these things
+ ["commit", "<current-commit-id>"],
+ ["parent-commit", "<parent-commit-id>"],
+ ["commit-pgp-sig", "-----BEGIN PGP SIGNATURE-----..."], // empty string for unsigned commit
+ ["committer", "<name>", "<email>", "<timestamp>", "<timezone offset in minutes>"],
+ ]
+}
+```
+
+## Issues
+
+Issues are Markdown text that is just human-readable conversational threads related to the repository: bug reports, feature requests, questions or comments of any kind. Like patches, these SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag.
+
+```jsonc
+{
+ "kind": 1621,
+ "content": "<markdown text>",
+ "tags": [
+ ["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>"],
+ ["p", "<repository-owner>"]
+ ]
+}
+```
+
+## Replies
+
+Replies are also Markdown text. The difference is that they MUST be issued as replies to either a `kind:1621` _issue_ or a `kind:1617` _patch_ event. The threading of replies and patches should follow NIP-10 rules.
+
+```jsonc
+{
+ "kind": 1622,
+ "content": "<markdown text>",
+ "tags": [
+ ["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
+ ["e", "<issue-or-patch-id-hex>", "", "root"],
+
+ // other "e" and "p" tags should be applied here when necessary, following the threading rules of NIP-10
+ ["p", "<patch-author-pubkey-hex>", "", "mention"],
+ ["e", "<previous-reply-id-hex>", "", "reply"],
+ // ...
+ ]
+}
+```
+
+## Possible things to be added later
+
+- "status" kind (for letting people know a patch was merged or an issue was fixed or won't be fixed)
+- "branch merge" kind (specifying a URL from where to fetch the branch to be merged)
+- "cover letter" kind (to which multiple patches can refer and serve as a unifying layer to them)
+- inline file comments kind (we probably need one for patches and a different one for merged files)
commit c4c9bd00579d6537a87dc047de0a20db730e0da6
Merge: 6871b3b 1166fb9
Author: Alex Gleason <
[email protected]>
Date: Fri Mar 8 05:28:49 2024 -0600
Merge pull request #1105 from nostr-protocol/alexgleason-patch-1
NIP-50: search by nip05 domain
commit 808569e562e774c17bd0caccf28b6ac95bc0641a
Author: Asai Toshiya <
[email protected]>
Date: Wed Mar 6 12:35:59 2024 +0900
README: add NIP-34
diff --git a/README.md b/README.md
index 505e3e0..5d163fd 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-30: Custom Emoji](30.md)
- [NIP-31: Dealing with Unknown Events](31.md)
- [NIP-32: Labeling](32.md)
+- [NIP-34: `git` stuff](34.md)
- [NIP-36: Sensitive Content](36.md)
- [NIP-38: User Statuses](38.md)
- [NIP-39: External Identities in Profiles](39.md)
commit d11f50bd0ad6663eb53e1da495f8a8b91bb194f5
Author: nostr.wine <
[email protected]>
Date: Fri Mar 8 11:23:22 2024 -0500
NIP-50: add event classification extensions
diff --git a/50.md b/50.md
index 6603303..a3fcf87 100644
--- a/50.md
+++ b/50.md
@@ -47,4 +47,8 @@ Relays SHOULD exclude spam from search results by default if they support some f
Relay MAY support these extensions:
- `include:spam` - turn off spam filtering, if it was enabled by default
-- `domain:<domain>` - include events from users whose valid nip05 domain matches the domain
+- `domain:<domain>` - include only events from users whose valid nip05 domain matches the domain
+- `topic:<topic>` - include only events within a classified topic (short string, one to two words)
+- `language:<two letter ISO 639-1 language code>` - include only events of a specified language
+- `sentiment:<negative/neutral/positive>` - include only events of a specific sentiment
+- `nsfw:<true/false>` - include or exclude nsfw events (default: true)
commit 1166fb9fb5e359a023de613417861ae2cb23e6a7
Author: Alex Gleason <
[email protected]>
Date: Wed Mar 6 13:59:36 2024 -0600
NIP-50: search by nip05 domain
diff --git a/50.md b/50.md
index 9d1a54c..6603303 100644
--- a/50.md
+++ b/50.md
@@ -47,3 +47,4 @@ Relays SHOULD exclude spam from search results by default if they support some f
Relay MAY support these extensions:
- `include:spam` - turn off spam filtering, if it was enabled by default
+- `domain:<domain>` - include events from users whose valid nip05 domain matches the domain
commit 6871b3b334c3ae6ec23266b42d238859805a1ebe
Author: Asai Toshiya <
[email protected]>
Date: Thu Mar 7 06:45:35 2024 +0900
README: add kinds and tags for NIP-34
diff --git a/README.md b/README.md
index 5d163fd..90a6394 100644
--- a/README.md
+++ b/README.md
@@ -111,6 +111,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `1059` | Gift Wrap | [59](59.md) |
| `1063` | File Metadata | [94](94.md) |
| `1311` | Live Chat Message | [53](53.md) |
+| `1617` | Patches | [34](34.md) |
+| `1621` | Issues | [34](34.md) |
+| `1622` | Replies | [34](34.md) |
| `1971` | Problem Tracker | [nostrocket][nostrocket] |
| `1984` | Reporting | [56](56.md) |
| `1985` | Label | [32](32.md) |
@@ -163,6 +166,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `30315` | User Statuses | [38](38.md) |
| `30402` | Classified Listing | [99](99.md) |
| `30403` | Draft Classified Listing | [99](99.md) |
+| `30617` | Repository announcements | [34](34.md) |
| `31922` | Date-Based Calendar Event | [52](52.md) |
| `31923` | Time-Based Calendar Event | [52](52.md) |
| `31924` | Calendar | [52](52.md) |
@@ -224,9 +228,10 @@ Please update these lists when proposing NIPs introducing new event kinds.
| `bolt11` | `bolt11` invoice | -- | [57](57.md) |
| `challenge` | challenge string | -- | [42](42.md) |
| `client` | name, address | relay URL | [89](89.md) |
+| `clone` | git clone URL | -- | [34](34.md) |
| `content-warning` | reason | -- | [36](36.md) |
| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) |
-| `description` | invoice/badge description | -- | [57](57.md), [58](58.md) |
+| `description` | description | -- | [34](34.md), [57](57.md), [58](58.md) |
| `emoji` | shortcode, image URL | -- | [30](30.md) |
| `encrypted` | -- | -- | [90](90.md) |
| `expiration` | unix timestamp (string) | -- | [40](40.md) |
@@ -235,7 +240,7 @@ Please update these lists when proposing NIPs introducing new event kinds.
| `imeta` | inline metadata | -- | [92](92.md) |
| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) |
| `location` | location string | -- | [52](52.md), [99](99.md) |
-| `name` | badge name | -- | [58](58.md) |
+| `name` | name | -- | [34](34.md), [58](58.md) |
| `nonce` | random | -- | [13](13.md) |
| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) |
| `price` | price | currency, frequency | [99](99.md) |
@@ -248,6 +253,7 @@ Please update these lists when proposing NIPs introducing new event kinds.
| `summary` | article summary | -- | [23](23.md) |
| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) |
| `title` | article title | -- | [23](23.md) |
+| `web` | webpage URL | -- | [34](34.md) |
| `zap` | pubkey (hex), relay URL | weight | [57](57.md) |
## Criteria for acceptance of NIPs
commit 9e9ae1eb88db13471faa660a3e4f66d2d5e60a31
Merge: c4c9bd0 0438236
Author: Alex Gleason <
[email protected]>
Date: Mon Mar 11 00:28:08 2024 -0500
Merge pull request #1113 from nostr-wine/nip50-extensions
NIP-50: add event classification extensions
commit 0438236268194cfec1e0e02579e29e75bd52b173
Author: nostr.wine <
[email protected]>
Date: Fri Mar 8 12:05:49 2024 -0500
Update 50.md
diff --git a/50.md b/50.md
index a3fcf87..a6e02be 100644
--- a/50.md
+++ b/50.md
@@ -48,7 +48,6 @@ Relays SHOULD exclude spam from search results by default if they support some f
Relay MAY support these extensions:
- `include:spam` - turn off spam filtering, if it was enabled by default
- `domain:<domain>` - include only events from users whose valid nip05 domain matches the domain
-- `topic:<topic>` - include only events within a classified topic (short string, one to two words)
- `language:<two letter ISO 639-1 language code>` - include only events of a specified language
- `sentiment:<negative/neutral/positive>` - include only events of a specific sentiment
- `nsfw:<true/false>` - include or exclude nsfw events (default: true)
commit de71f998289a829ac4b2c0b0e601b02a2bf755b6
Author: Asai Toshiya <
[email protected]>
Date: Wed Mar 13 12:46:16 2024 +0900
NIP-96: simplify server list
diff --git a/96.md b/96.md
index 3ebbef8..f7d901f 100644
--- a/96.md
+++ b/96.md
@@ -82,14 +82,7 @@ it must use the "api_url" field instead.
### List of Supporting File Storage Servers
-| Name | Domain |
-| ------------- | ------------------------- |
-| nostrcheck.me | https://nostrcheck.me |
-| nostrage | https://nostrage.com |
-| sove | https://sove.rent |
-| nostr.build | https://nostr.build |
-| sovbit | https://files.sovbit.host |
-| void.cat | https://void.cat |
+See https://github.com/aljazceru/awesome-nostr#nip-96-file-storage-servers.
## Upload
commit 4f33dbc2b86684f9bf26dd1b0fc9789e3cbf2165
Author: silberengel <
[email protected]>
Date: Mon Mar 18 08:01:06 2024 +0100
Added bot field to denote automated npubs
diff --git a/24.md b/24.md
index d444a4b..449101a 100644
--- a/24.md
+++ b/24.md
@@ -16,6 +16,7 @@ These are extra fields not specified in NIP-01 that may be present in the string
- `display_name`: an alternative, bigger name with richer characters than `name`. `name` should always be set regardless of the presence of `display_name` in the metadata.
- `website`: a web URL related in any way to the event author.
- `banner`: an URL to a wide (~1024x768) picture to be optionally displayed in the background of a profile screen.
+ - `bot`: a boolean to clarify that the content is entirely or partially the result of automation, such as with chatbots or newsfeeds.
### Deprecated fields
commit 4b79bc67c471f77061d62704538e5fdd6ac28ae8
Author: Nostr.Band <
[email protected]>
Date: Fri Mar 22 08:01:37 2024 +0100
Add optional_requested_permissions
This is implemented in nsec.app, nostr.band, Coracle and Nostrudel, so maybe it's time to update the NIP.
diff --git a/46.md b/46.md
index eb96494..8ba65d9 100644
--- a/46.md
+++ b/46.md
@@ -120,7 +120,7 @@ Each of the following are methods that the client sends to the remote signer.
| Command | Params | Result |
| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
-| `connect` | `[<remote_user_pubkey>, <optional_secret>]` | "ack" |
+| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
| `sign_event` | `[<json_stringified_event_to_sign>]` | `json_stringified(<signed_event>)` |
| `ping` | `[]` | "pong" |
| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
@@ -130,6 +130,10 @@ Each of the following are methods that the client sends to the remote signer.
| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
+### Requested permissions
+
+The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
+
## Response Events `kind:24133`
```json
@@ -185,7 +189,7 @@ Each of the following are methods that the client sends to the remote signer.
| Command | Params | Result |
| ---------------- | ------------------------------------------ | ------------------------------------ |
-| `create_account` | `[<username>, <domain>, <optional_email>]` | `<newly_created_remote_user_pubkey>` |
+| `create_account` | `[<username>, <domain>, <optional_email>, <optional_requested_permissions>]` | `<newly_created_remote_user_pubkey>` |
## Appendix
commit 3443b3b589e39f96519feb70e27fa36d204559e1
Merge: 4b79bc6 4f33dbc
Author: Alex Gleason <
[email protected]>
Date: Sun Mar 24 16:13:58 2024 -0500
Merge pull request #1126 from SilberWitch/master
Added bot field to denote automated npubs
commit cf0e6e1567662a80ff8f4ed1500909b843d5162f
Merge: de71f99 965eb45
Author: hodlbod <
[email protected]>
Date: Thu Mar 21 07:42:56 2024 -0700
Merge pull request #1132 from utxo-one/dev-nip05relay
Recommend setting relays in NIP05
commit 46a6bf331ae823dad079a9740f37d57e58b92358
Author: utxo <
[email protected]>
Date: Thu Mar 21 10:15:02 2024 -0400
Make relay attribute recommended in NIP-05
diff --git a/05.md b/05.md
index 6437550..a4b804c 100644
--- a/05.md
+++ b/05.md
@@ -1,8 +1,6 @@
-NIP-05
-======
+# NIP-05
-Mapping Nostr keys to DNS-based internet identifiers
-----------------------------------------------------
+## Mapping Nostr keys to DNS-based internet identifiers
`final` `optional`
@@ -33,9 +31,9 @@ It will make a GET request to `https://example.com/.well-known/nostr.json?name=b
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
}
}
-````
+```
-or with the **optional** `"relays"` attribute:
+or with the **recommended** `"relays"` attribute:
```json
{
@@ -43,14 +41,17 @@ or with the **optional** `"relays"` attribute:
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
},
"relays": {
- "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [ "wss://relay.example.com", "wss://relay2.example.com" ]
+ "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [
+ "wss://relay.example.com",
+ "wss://relay2.example.com"
+ ]
}
}
-````
+```
If the pubkey matches the one given in `"names"` (as in the example above) that means the association is right and the `"nip05"` identifier is valid and can be displayed.
-The optional `"relays"` attribute may contain an object with public keys as properties and arrays of relay URLs as values. When present, that can be used to help clients learn in which relays the specific user may be found. Web servers which serve `/.well-known/nostr.json` files dynamically based on the query string SHOULD also serve the relays data for any name they serve in the same reply when that is available.
+The recommended `"relays"` attribute may contain an object with public keys as properties and arrays of relay URLs as values. When present, that can be used to help clients learn in which relays the specific user may be found. Web servers which serve `/.well-known/nostr.json` files dynamically based on the query string SHOULD also serve the relays data for any name they serve in the same reply when that is available.
## Finding users from their NIP-05 identifier
commit 965eb45b30b6000da976addcf3163858abadcf07
Author: utxo <
[email protected]>
Date: Thu Mar 21 10:18:42 2024 -0400
remove prettier formatting
diff --git a/05.md b/05.md
index a4b804c..405078a 100644
--- a/05.md
+++ b/05.md
@@ -1,6 +1,8 @@
-# NIP-05
+NIP-05
+======
-## Mapping Nostr keys to DNS-based internet identifiers
+Mapping Nostr keys to DNS-based internet identifiers
+----------------------------------------------------
`final` `optional`
@@ -31,7 +33,7 @@ It will make a GET request to `https://example.com/.well-known/nostr.json?name=b
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
}
}
-```
+````
or with the **recommended** `"relays"` attribute:
@@ -41,13 +43,10 @@ or with the **recommended** `"relays"` attribute:
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
},
"relays": {
- "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [
- "wss://relay.example.com",
- "wss://relay2.example.com"
- ]
+ "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [ "wss://relay.example.com", "wss://relay2.example.com" ]
}
}
-```
+````
If the pubkey matches the one given in `"names"` (as in the example above) that means the association is right and the `"nip05"` identifier is valid and can be displayed.
commit 9971db355164815c986251f8f89d1c7c70ec9e53
Author: arthurfranca <
[email protected]>
Date: Sat Mar 30 22:33:24 2024 -0300
Minor fix to nip01
diff --git a/01.md b/01.md
index 905e45f..a91febc 100644
--- a/01.md
+++ b/01.md
@@ -81,7 +81,7 @@ This NIP defines 3 standard tags that can be used across all event kinds with th
- for a parameterized replaceable event: `["a", <kind integer>:<32-bytes lowercase hex of a pubkey>:<d tag value>, <recommended relay URL, optional>]`
- for a non-parameterized replaceable event: `["a", <kind integer>:<32-bytes lowercase hex of a pubkey>:, <recommended relay URL, optional>]`
-As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key tags are expected to be indexed by relays, such that it is possible, for example, to query or subscribe to events that reference the event `"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"` by using the `{"#e": "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"}` filter.
+As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key tags are expected to be indexed by relays, such that it is possible, for example, to query or subscribe to events that reference the event `"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"` by using the `{"#e": ["5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"]}` filter.
### Kinds
commit 881780186077154f35abef89fe60c6d28343c8fd
Author: Vitor Pamplona <
[email protected]>
Date: Thu Mar 28 16:57:00 2024 -0400
Clarifies relays to be used for NIP-28
diff --git a/28.md b/28.md
index 2dcf800..65ebb3f 100644
--- a/28.md
+++ b/28.md
@@ -23,11 +23,11 @@ Client-centric moderation gives client developers discretion over what types of
Create a public chat channel.
-In the channel creation `content` field, Client SHOULD include basic channel metadata (`name`, `about`, `picture` as specified in kind 41).
+In the channel creation `content` field, Client SHOULD include basic channel metadata (`name`, `about`, `picture` and `relays` as specified in kind 41).
```json
{
- "content": "{\"name\": \"Demo Channel\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\"}",
+ "content": "{\"name\": \"Demo Channel\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}",
...
}
```
@@ -46,6 +46,7 @@ Clients SHOULD support basic metadata fields:
- `name` - string - Channel name
- `about` - string - Channel description
- `picture` - string - URL of channel picture
+- `relays` - array - List of relays to download and broadcast events to
Clients MAY add additional metadata fields.
@@ -53,7 +54,7 @@ Clients SHOULD use [NIP-10](10.md) marked "e" tags to recommend a relay.
```json
{
- "content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\"}",
+ "content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}",
"tags": [["e", <channel_create_event_id>, <relay-url>]],
...
}
@@ -132,12 +133,11 @@ Clients MAY hide event 42s for users other than the user who sent the event 44.
}
```
-## NIP-10 relay recommendations
+## Relay recommendations
-For [NIP-10](10.md) relay recommendations, clients generally SHOULD use the relay URL of the original (oldest) kind 40 event.
-
-Clients MAY recommend any relay URL. For example, if a relay hosting the original kind 40 event for a channel goes offline, clients could instead fetch channel data from a backup relay, or a relay that clients trust more than the original relay.
+Clients SHOULD use the relay URLs of the metadata events.
+Clients MAY use any relay URL. For example, if a relay hosting the original kind 40 event for a channel goes offline, clients could instead fetch channel data from a backup relay, or a relay that clients trust more than the original relay.
Motivation
----------
commit af5d4074886916877c350dbdfec61e62a9875255
Author: Alex Gleason <
[email protected]>
Date: Tue Apr 2 10:00:07 2024 -0500
Update BREAKING.md for NIP-46 (stringified params)
diff --git a/BREAKING.md b/BREAKING.md
index 3693c34..8024814 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -6,6 +6,7 @@ reverse chronological order.
| Date | Commit | NIP | Change |
| ----------- | --------- | -------- | ------ |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
+| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed |
commit 769432efc42b69e5f23956a98d944238bba8d461
Author: Asai Toshiya <
[email protected]>
Date: Fri Mar 29 08:06:00 2024 +0900
README: fix order of kinds
diff --git a/README.md b/README.md
index 90a6394..c3c5ef0 100644
--- a/README.md
+++ b/README.md
@@ -173,8 +173,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `31925` | Calendar Event RSVP | [52](52.md) |
| `31989` | Handler recommendation | [89](89.md) |
| `31990` | Handler information | [89](89.md) |
-| `39000-9` | Group metadata events | [29](29.md) |
| `34550` | Community Definition | [72](72.md) |
+| `39000-9` | Group metadata events | [29](29.md) |
[nostrocket]: https://github.com/nostrocket/NIPS/blob/main/Problems.md
[lnpub]: https://github.com/shocknet/Lightning.Pub/blob/master/proto/autogenerated/client.md
commit 715e4a044dc4af7cc54ef63428f4d45c9ba2d24e
Merge: 8817801 9971db3
Author: Alex Gleason <
[email protected]>
Date: Sat Mar 30 20:39:35 2024 -0500
Merge pull request #1149 from arthurfranca/patch-4
Minor fix to nip01
commit b765b3c0301958d46115b834872bbd0c8bac588c
Author: kuiperanon <
[email protected]>
Date: Tue Apr 9 11:25:05 2024 -0500
Clarify use of ambiguous terminology in spec of bunker token
It's very confusing as to whether it refers to remote user pubkey vs remote signer pubkey. This is complicated further by the typo in the explanation of "remote signer pubkey".
diff --git a/46.md b/46.md
index 8ba65d9..56b8402 100644
--- a/46.md
+++ b/46.md
@@ -25,7 +25,7 @@ This is most common in a situation where you have your own nsecbunker or other t
The remote signer would provide a connection token in the form:
```
-bunker://<remote-pubkey>?relay=<wss://relay-to-connect-on>&relay=<wss://another-relay-to-connect-on>&secret=<optional-secret-value>
+bunker://<remote-user-pubkey>?relay=<wss://relay-to-connect-on>&relay=<wss://another-relay-to-connect-on>&secret=<optional-secret-value>
```
This token is pasted into the client by the user and the client then uses the details to connect to the remote signer via the specified relay(s).
commit b224f6d05d5b208b632e8e1f5ac489b7f27079ae
Author: Matthew Lorentz <
[email protected]>
Date: Wed Apr 3 10:59:37 2024 -0400
Update description of NIP-56
diff --git a/56.md b/56.md
index d6978c2..3209b80 100644
--- a/56.md
+++ b/56.md
@@ -4,10 +4,12 @@ NIP-56
Reporting
---------
-`draft` `optional`
+`optional`
-A report is a `kind 1984` note that is used to report other notes for spam,
-illegal and explicit content.
+A report is a `kind 1984` event that signals to users and relays that
+some referenced content is objectionable. The definition of objectionable is
+obviously subjective and all agents on the network (users, apps, relays, etc.)
+may consume and take action on them as they see fit.
The `content` MAY contain additional information submitted by the entity
reporting the content.
commit ca97490cdf4d499752bee2fa589514e2a474419b
Author: Asai Toshiya <
[email protected]>
Date: Wed Apr 3 13:09:22 2024 +0900
NIP-58: minor JSON fix
diff --git a/58.md b/58.md
index 0ecef25..4a9ed4c 100644
--- a/58.md
+++ b/58.md
@@ -83,7 +83,7 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according
["name", "Medal of Bravery"],
["description", "Awarded to users demonstrating bravery"],
["image", "https://nostr.academy/awards/bravery.png", "1024x1024"],
- ["thumb", "https://nostr.academy/awards/bravery_256x256.png", "256x256"],
+ ["thumb", "https://nostr.academy/awards/bravery_256x256.png", "256x256"]
],
...
}
@@ -99,7 +99,7 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according
"tags": [
["a", "30009:alice:bravery"],
["p", "bob", "wss://relay"],
- ["p", "charlie", "wss://relay"],
+ ["p", "charlie", "wss://relay"]
],
...
}
@@ -117,7 +117,7 @@ Honorable Bob The Brave:
["a", "30009:alice:bravery"],
["e", "<bravery badge award event id>", "wss://nostr.academy"],
["a", "30009:alice:honor"],
- ["e", "<honor badge award event id>", "wss://nostr.academy"],
+ ["e", "<honor badge award event id>", "wss://nostr.academy"]
],
...
}
commit 3c75180fb7947c133a063ba475067a3b8f42d619
Author: Matthew Lorentz <
[email protected]>
Date: Wed Apr 3 10:50:02 2024 -0400
Add category to reports
diff --git a/56.md b/56.md
index a2861e3..d6978c2 100644
--- a/56.md
+++ b/56.md
@@ -28,6 +28,7 @@ being reported, which consists of the following report types:
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
- `impersonation` - someone pretending to be someone else
+- `other` - for reports that don't fit in the above categories
Some report tags only make sense for profile reports, such as `impersonation`
commit d607a288b5db72a84f3d6cc8fd42304d31e1f66b
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 07:59:16 2024 +0000
NIP-34: clarify nip10 thread application
for consistancy and so that the intended order of patches is easier to ascertain
enables additional patches to be appended to a patch set, supporting a PR-like workflow alongside
patch-over-email-like workflow
diff --git a/34.md b/34.md
index 651407d..2a7f489 100644
--- a/34.md
+++ b/34.md
@@ -35,6 +35,10 @@ Except `d`, all tags are optional.
Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
+Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
+
+The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply` to the original root patch.
+
```jsonc
{
"kind": 1617,
commit 46ea8dcf9cedd1f64e9444b70ac0ed24e40bbe1a
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 08:03:48 2024 +0000
NIP-34: add repo-id standard
suggested guidance for repo-id
diff --git a/34.md b/34.md
index 2a7f489..7eea92b 100644
--- a/34.md
+++ b/34.md
@@ -17,7 +17,7 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
"kind": 30617,
"content": "",
"tags": [
- ["d", "<repo-id>"],
+ ["d", "<repo-id>"], // usually kebab-case short name
["name", "<human-readable project name>"],
["description", "brief human-readable project description>"],
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
commit 403b5199a490b6a148063003e00924f5e79ba36c
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 10:21:06 2024 +0000
NIP-34: add status events
merge-commit and applied-commit-id tags enable discussion of patches to be
mapped to lines of code accepted into the master branch
diff --git a/34.md b/34.md
index c6e7225..f72fcf2 100644
--- a/34.md
+++ b/34.md
@@ -106,8 +106,46 @@ Replies are also Markdown text. The difference is that they MUST be issued as re
}
```
+## Status
+
+Root Patches and Issues have a Status that defaults to 'Open' and can be set by issuing Status events.
+
+```jsonc
+{
+ "kind": 1630, // Open
+ "kind": 1631, // Applied / Merged for Patches; Resolved for Issues
+ "kind": 1632, // Closed
+ "kind": 1633, // Draft
+ "content": "<markdown text>",
+ "tags": [
+ ["e", "<issue-or-original-root-patch-id-hex>", "", "root"],
+ ["e", "<accepted-revision-root-id-hex>", "", "reply"], // for when revisions applied
+ ["p", "<repository-owner>"],
+ ["p", "<root-event-author>"],
+ ["p", "<revision-author>"],
+
+ // optional for improved subscription filter efficency
+ ["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
+ ["r", "<earliest-unique-commit-id-of-repo>"]
+
+ // optional for `1631` status
+ ["e", "<applied-or-merged-patch-event-id>", "", "mention"], // for each
+ // when merged
+ ["merge-commit", "<merge-commit-id>"]
+ ["r", "<merge-commit-id>"]
+ // when applied
+ ["applied-as-commits", "<commit-id-in-master-branch>", ...]
+ ["r", "<applied-commit-id>"] // for each
+ ]
+}
+```
+
+The Status event with the largest created_at date is valid.
+
+The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
+
+
## Possible things to be added later
-- "status" kind (for letting people know a patch was merged or an issue was fixed or won't be fixed)
- "branch merge" kind (specifying a URL from where to fetch the branch to be merged)
- inline file comments kind (we probably need one for patches and a different one for merged files)
commit cb0d35a5f9f1b88a270f7fbbfbdb97e095e28d56
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 08:25:49 2024 +0000
NIP-34: optional additional repo maintainers
can be used by clients to tag multiple maintainers in patches
helps clients identify whether multiple repo events for the same repository
are complementary or in competion
diff --git a/34.md b/34.md
index 7eea92b..bb7e3ee 100644
--- a/34.md
+++ b/34.md
@@ -23,11 +23,12 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
+ ["maintainers", "<other-recognized-maintainer>", ...]
]
}
```
-The tags `web`, `clone`, `relays` can have multiple values.
+The tags `web`, `clone`, `relays`, `maintainers` can have multiple values.
Except `d`, all tags are optional.
commit 0b62729e318497922822c39471ab31a869563ba5
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 09:20:25 2024 +0000
NIP-34: clarify cover letters
remove cover letters from 'possible things to be added later' and
add a clarification that can they can be added through patches
diff --git a/34.md b/34.md
index fefc7af..c6e7225 100644
--- a/34.md
+++ b/34.md
@@ -69,6 +69,8 @@ The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply`
}
```
+The first patch in a series MAY be a cover letter in the format produced by `git format-patch`.
+
## Issues
Issues are Markdown text that is just human-readable conversational threads related to the repository: bug reports, feature requests, questions or comments of any kind. Like patches, these SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag.
@@ -108,5 +110,4 @@ Replies are also Markdown text. The difference is that they MUST be issued as re
- "status" kind (for letting people know a patch was merged or an issue was fixed or won't be fixed)
- "branch merge" kind (specifying a URL from where to fetch the branch to be merged)
-- "cover letter" kind (to which multiple patches can refer and serve as a unifying layer to them)
- inline file comments kind (we probably need one for patches and a different one for merged files)
commit 8225a018c72c4d11b575ed4e57fa587d08c09027
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 09:01:19 2024 +0000
NIP-34: optional tags to improve discoverability
earliest-unique-commit r tag enables clients to:
- retrieve all repo events refering to a local git repo
- group repo events with different identifers that refer to same repo
- retrieve all patches for a local repo,
irespective of the tagged repo event
current-commit-id r tag enables clients to prevent accidental submission of a patch,
which has already been proposed
root-revision tag enables clients to filter out proposal revisions
from a list of proposals
diff --git a/34.md b/34.md
index bb7e3ee..fefc7af 100644
--- a/34.md
+++ b/34.md
@@ -23,6 +23,8 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
+ ["earliest-unique-commit", "<commit-id>"] // usually root commit but a recent commit for forks
+ ["r", "<earliest-unique-commit-id>"] // so clients can subscribe to all events related to a local git repo
["maintainers", "<other-recognized-maintainer>", ...]
]
}
@@ -46,17 +48,20 @@ The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply`
"content": "<patch>", // contents of <git format-patch>
"tags": [
["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>"],
+ ["r", "<earliest-unique-commit-id-of-repo>"] // so clients can subscribe to all patches sent to a local git repo
["p", "<repository-owner>"],
["p", "<other-user>"], // optionally send the patch to another user to bring it to their attention
- // for the first patch in a thread or series
- ["t", "root"],
+ ["t", "root"], // ommited for additional patches in a series
+ // for the first patch in a revision
+ ["t", "root-revision"],
// optional tags for when it is desirable that the merged patch has a stable commit id
// these fields are necessary for ensuring that the commit resulting from applying a patch
// has the same id as it had in the proposer's machine -- all these tags can be omitted
// if the maintainer doesn't care about these things
["commit", "<current-commit-id>"],
+ ["r", "<current-commit-id>"] // so clients can find existing patches for a specific commit
["parent-commit", "<parent-commit-id>"],
["commit-pgp-sig", "-----BEGIN PGP SIGNATURE-----..."], // empty string for unsigned commit
["committer", "<name>", "<email>", "<timestamp>", "<timezone offset in minutes>"],
commit cab47cf0f179f578bf9d3be0e61a5a2224053f33
Merge: 403b519 eb3a857
Author: Alex Gleason <
[email protected]>
Date: Sun Apr 21 22:37:50 2024 -0500
Merge pull request #1187 from AsaiToshiya/AsaiToshiya-patch-7
README: add status kinds of NIP-34
commit df30012430c88d49fb5b124992b04d5c61b6338b
Author: Vitor Pamplona <
[email protected]>
Date: Wed Apr 24 15:31:45 2024 -0400
NIP-17 (old 24) Sealed Gift-Wrapped Messages for Private DMs and Small Group Chats (#686)
diff --git a/04.md b/04.md
index dc232b4..a561a2f 100644
--- a/04.md
+++ b/04.md
@@ -1,4 +1,4 @@
-> __Warning__ `unrecommended`: deprecated in favor of [NIP-44](44.md)
+> __Warning__ `unrecommended`: deprecated in favor of [NIP-17](17.md)
NIP-04
======
diff --git a/11.md b/11.md
index 45102d7..a50038a 100644
--- a/11.md
+++ b/11.md
@@ -37,7 +37,7 @@ Detailed plain-text information about the relay may be contained in the `descrip
### Pubkey
-An administrative contact may be listed with a `pubkey`, in the same format as Nostr events (32-byte hex for a `secp256k1` public key). If a contact is listed, this provides clients with a recommended address to send encrypted direct messages (See `NIP-04`) to a system administrator. Expected uses of this address are to report abuse or illegal content, file bug reports, or request other technical assistance.
+An administrative contact may be listed with a `pubkey`, in the same format as Nostr events (32-byte hex for a `secp256k1` public key). If a contact is listed, this provides clients with a recommended address to send encrypted direct messages (See [NIP-17](17.md)) to a system administrator. Expected uses of this address are to report abuse or illegal content, file bug reports, or request other technical assistance.
Relay operators have no obligation to respond to direct messages.
diff --git a/17.md b/17.md
new file mode 100644
index 0000000..cc04a88
--- /dev/null
+++ b/17.md
@@ -0,0 +1,154 @@
+NIP-17
+======
+
+Private Direct Messages
+-----------------------
+
+`draft` `optional`
+
+This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
+
+## Direct Message Kind
+
+Kind `14` is a chat message. `p` tags identify one or more receivers of the message.
+
+```js
+{
+ "id": "<usual hash>",
+ "pubkey": "<sender-pubkey>",
+ "created_at": now(),
+ "kind": 14,
+ "tags": [
+ ["p", "<receiver-1-pubkey>", "<relay-url>"],
+ ["p", "<receiver-2-pubkey>", "<relay-url>"],
+ ["e", "<kind-14-id>", "<relay-url>", "reply"] // if this is a reply
+ ["subject", "<conversation-title>"],
+ ...
+ ],
+ "content": "<message-in-plain-text>",
+}
+```
+
+`.content` MUST be plain text. Fields `id` and `created_at` are required.
+
+Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
+
+Kind `14`s MUST never be signed. If it is signed, the message might leak to relays and become **fully public**.
+
+## Chat Rooms
+
+The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
+
+Clients SHOULD render messages of the same room in a continuous thread.
+
+An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
+
+## Encrypting
+
+Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually.
+
+```js
+{
+ "id": "<usual hash>",
+ "pubkey": randomPublicKey,
+ "created_at": randomTimeUpTo2DaysInThePast(),
+ "kind": 1059, // gift wrap
+ "tags": [
+ ["p", receiverPublicKey, "<relay-url>"] // receiver
+ ],
+ "content": nip44Encrypt(
+ {
+ "id": "<usual hash>",
+ "pubkey": senderPublicKey,
+ "created_at": randomTimeUpTo2DaysInThePast(),
+ "kind": 13, // seal
+ "tags": [], // no tags
+ "content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey),
+ "sig": "<signed by senderPrivateKey>"
+ },
+ randomPrivateKey, receiverPublicKey
+ ),
+ "sig": "<signed by randomPrivateKey>"
+}
+```
+
+The encryption algorithm MUST use the latest version of [NIP-44](44.md).
+
+Clients MUST verify if pubkey of the `kind:13` is the same pubkey on the `kind:14`, otherwise any sender can impersonate others by simply changing the pubkey on `kind:14`.
+
+Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
+
+The gift wrap's `p`-tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity.
+
+Clients CAN offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key
+
+## Publishing
+
+Kind `10050` indicates the user's preferred relays to receive DMs. The event MUST include a list of `relay` tags with relay URIs.
+
+```js
+{
+ "kind": 10050,
+ "tags": [
+ ["relay", "wss://inbox.nostr.wine"],
+ ["relay", "wss://myrelay.nostr1.com"],
+ ],
+ "content": "",
+ //...other fields
+}
+```
+
+Clients SHOULD publish kind `14` events to the `10050`-listed relays, falling back to `read` relays of [NIP-65](65.md) if `kind:10050` is not available.
+
+Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
+
+## Benefits & Limitations
+
+This NIP offers the following privacy and security features:
+
+1. **No Metadata Leak**: Participant identities, each message's real date and time, event kinds, and other event tags are all hidden from the public. Senders and receivers cannot be linked with public information alone.
+2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
+3. **No Moderation**: There are no group admins: no invitations or bans.
+4. **No Shared Secrets**: No secret must be known to all members that can leak or be mistakenly shared
+5. **Fully Recoverable**: Messages can be fully recoverable by any client with the user's private key
+6. **Optional Forward Secrecy**: Users and clients can opt-in for "disappearing messages".
+7. **Uses Public Relays**: Messages can flow through public relays without loss of privacy. Private relays can increase privacy further, but they are not required.
+8. **Cold Storage**: Users can unilaterally opt-in to sharing their messages with a separate key that is exclusive for DM backup and recovery.
+
+The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
+
+----
+
+## Examples
+
+This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
+
+The two final GiftWraps, one to the receiver and the other to the sender, are:
+
+```json
+{
+ "id":"2886780f7349afc1344047524540ee716f7bdc1b64191699855662330bf235d8",
+ "pubkey":"8f8a7ec43b77d25799281207e1a47f7a654755055788f7482653f9c9661c6d51",
+ "created_at":1703128320,
+ "kind":1059,
+ "tags":[
+ [ "p", "918e2da906df4ccd12c8ac672d8335add131a4cf9d27ce42b3bb3625755f0788"]
+ ],
+ "content":"AsqzdlMsG304G8h08bE67dhAR1gFTzTckUUyuvndZ8LrGCvwI4pgC3d6hyAK0Wo9gtkLqSr2rT2RyHlE5wRqbCOlQ8WvJEKwqwIJwT5PO3l2RxvGCHDbd1b1o40ZgIVwwLCfOWJ86I5upXe8K5AgpxYTOM1BD+SbgI5jOMA8tgpRoitJedVSvBZsmwAxXM7o7sbOON4MXHzOqOZpALpS2zgBDXSAaYAsTdEM4qqFeik+zTk3+L6NYuftGidqVluicwSGS2viYWr5OiJ1zrj1ERhYSGLpQnPKrqDaDi7R1KrHGFGyLgkJveY/45y0rv9aVIw9IWF11u53cf2CP7akACel2WvZdl1htEwFu/v9cFXD06fNVZjfx3OssKM/uHPE9XvZttQboAvP5UoK6lv9o3d+0GM4/3zP+yO3C0NExz1ZgFmbGFz703YJzM+zpKCOXaZyzPjADXp8qBBeVc5lmJqiCL4solZpxA1865yPigPAZcc9acSUlg23J1dptFK4n3Tl5HfSHP+oZ/QS/SHWbVFCtq7ZMQSRxLgEitfglTNz9P1CnpMwmW/Y4Gm5zdkv0JrdUVrn2UO9ARdHlPsW5ARgDmzaxnJypkfoHXNfxGGXWRk0sKLbz/ipnaQP/eFJv/ibNuSfqL6E4BnN/tHJSHYEaTQ/PdrA2i9laG3vJti3kAl5Ih87ct0w/tzYfp4SRPhEF1zzue9G/16eJEMzwmhQ5Ec7jJVcVGa4RltqnuF8unUu3iSRTQ+/MNNUkK6Mk+YuaJJs6Fjw6tRHuWi57SdKKv7GGkr0zlBUU2Dyo1MwpAqzsCcCTeQSv+8qt4wLf4uhU9Br7F/L0ZY9bFgh6iLDCdB+4iABXyZwT7Ufn762195hrSHcU4Okt0Zns9EeiBOFxnmpXEslYkYBpXw70GmymQfJlFOfoEp93QKCMS2DAEVeI51dJV1e+6t3pCSsQN69Vg6jUCsm1TMxSs2VX4BRbq562+VffchvW2BB4gMjsvHVUSRl8i5/ZSDlfzSPXcSGALLHBRzy+gn0oXXJ/447VHYZJDL3Ig8+QW5oFMgnWYhuwI5QSLEyflUrfSz+Pdwn/5eyjybXKJftePBD9Q+8NQ8zulU5sqvsMeIx/bBUx0fmOXsS3vjqCXW5IjkmSUV7q54GewZqTQBlcx+90xh/LSUxXex7UwZwRnifvyCbZ+zwNTHNb12chYeNjMV7kAIr3cGQv8vlOMM8ajyaZ5KVy7HpSXQjz4PGT2/nXbL5jKt8Lx0erGXsSsazkdoYDG3U",
+ "sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480"
+}
+```
+
+```json
+{
+ "id":"162b0611a1911cfcb30f8a5502792b346e535a45658b3a31ae5c178465509721",
+ "pubkey":"626be2af274b29ea4816ad672ee452b7cf96bbb4836815a55699ae402183f512",
+ "created_at":1702711587,
+ "kind":1059,
+ "tags":[
+ [ "p", "44900586091b284416a0c001f677f9c49f7639a55c3f1e2ec130a8e1a7998e1b"]
+ ],
+ "content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ",
+ "sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab"
+}
+```
diff --git a/README.md b/README.md
index 5fcdaf7..619c984 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-01: Basic protocol flow description](01.md)
- [NIP-02: Follow List](02.md)
- [NIP-03: OpenTimestamps Attestations for Events](03.md)
-- [NIP-04: Encrypted Direct Message](04.md) --- **unrecommended**: deprecated in favor of [NIP-44](44.md)
+- [NIP-04: Encrypted Direct Message](04.md) --- **unrecommended**: deprecated in favor of [NIP-17](17.md)
- [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md)
- [NIP-06: Basic key derivation from mnemonic seed phrase](06.md)
- [NIP-07: `window.nostr` capability for web browsers](07.md)
@@ -36,6 +36,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-13: Proof of Work](13.md)
- [NIP-14: Subject tag in text events](14.md)
- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md)
+- [NIP-17: Private Direct Messages](17.md)
- [NIP-18: Reposts](18.md)
- [NIP-19: bech32-encoded entities](19.md)
- [NIP-21: `nostr:` URI scheme](21.md)
@@ -99,6 +100,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `11` | Group Thread | [29](29.md) |
| `12` | Group Thread Reply | [29](29.md) |
| `13` | Seal | [59](59.md) |
+| `14` | Direct Message | [17](17.md) |
| `16` | Generic Repost | [18](18.md) |
| `40` | Channel Creation | [28](28.md) |
| `41` | Channel Metadata | [28](28.md) |
@@ -138,6 +140,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `10009` | User groups | [51](51.md), [29](29.md) |
| `10015` | Interests list | [51](51.md) |
| `10030` | User emoji list | [51](51.md) |
+| `10050` | Relay list to receive DMs | [17](17.md) |
| `10096` | File storage server list | [96](96.md) |
| `13194` | Wallet Info | [47](47.md) |
| `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] |
@@ -247,10 +250,10 @@ Please update these lists when proposing NIPs introducing new event kinds.
| `price` | price | currency, frequency | [99](99.md) |
| `proxy` | external ID | protocol | [48](48.md) |
| `published_at` | unix timestamp (string) | -- | [23](23.md) |
-| `relay` | relay url | -- | [42](42.md) |
+| `relay` | relay url | -- | [42](42.md), [17](17.md) |
| `relays` | relay list | -- | [57](57.md) |
| `server` | file storage server url | -- | [96](96.md) |
-| `subject` | subject | -- | [14](14.md) |
+| `subject` | subject | -- | [14](14.md), [17](17.md) |
| `summary` | article summary | -- | [23](23.md) |
| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) |
| `title` | article title | -- | [23](23.md) |
commit eb3a857288fe99d99b73e07dfa28ac548fc10efb
Author: Asai Toshiya <
[email protected]>
Date: Mon Apr 22 12:35:48 2024 +0900
README: add status kinds of NIP-34
diff --git a/README.md b/README.md
index c3c5ef0..5fcdaf7 100644
--- a/README.md
+++ b/README.md
@@ -114,6 +114,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `1617` | Patches | [34](34.md) |
| `1621` | Issues | [34](34.md) |
| `1622` | Replies | [34](34.md) |
+| `1630`-`1633` | Status | [34](34.md) |
| `1971` | Problem Tracker | [nostrocket][nostrocket] |
| `1984` | Reporting | [56](56.md) |
| `1985` | Label | [32](32.md) |
commit 7dfb11b435a903c703bc38216eca805cefa494d4
Author: fiatjaf <
[email protected]>
Date: Wed Apr 24 17:20:45 2024 -0300
nip17: relay considerations and implementation details.
diff --git a/17.md b/17.md
index cc04a88..0f51367 100644
--- a/17.md
+++ b/17.md
@@ -6,7 +6,7 @@ Private Direct Messages
`draft` `optional`
-This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
+This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
## Direct Message Kind
@@ -18,7 +18,7 @@ Kind `14` is a chat message. `p` tags identify one or more receivers of the mess
"pubkey": "<sender-pubkey>",
"created_at": now(),
"kind": 14,
- "tags": [
+ "tags": [
["p", "<receiver-1-pubkey>", "<relay-url>"],
["p", "<receiver-2-pubkey>", "<relay-url>"],
["e", "<kind-14-id>", "<relay-url>", "reply"] // if this is a reply
@@ -29,19 +29,19 @@ Kind `14` is a chat message. `p` tags identify one or more receivers of the mess
}
```
-`.content` MUST be plain text. Fields `id` and `created_at` are required.
+`.content` MUST be plain text. Fields `id` and `created_at` are required.
-Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
+Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
Kind `14`s MUST never be signed. If it is signed, the message might leak to relays and become **fully public**.
## Chat Rooms
-The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
+The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
-Clients SHOULD render messages of the same room in a continuous thread.
+Clients SHOULD render messages of the same room in a continuous thread.
-An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
+An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
## Encrypting
@@ -51,7 +51,7 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
{
"id": "<usual hash>",
"pubkey": randomPublicKey,
- "created_at": randomTimeUpTo2DaysInThePast(),
+ "created_at": randomTimeUpTo2DaysInThePast(),
"kind": 1059, // gift wrap
"tags": [
["p", receiverPublicKey, "<relay-url>"] // receiver
@@ -60,7 +60,7 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
{
"id": "<usual hash>",
"pubkey": senderPublicKey,
- "created_at": randomTimeUpTo2DaysInThePast(),
+ "created_at": randomTimeUpTo2DaysInThePast(),
"kind": 13, // seal
"tags": [], // no tags
"content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey),
@@ -72,17 +72,17 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
}
```
-The encryption algorithm MUST use the latest version of [NIP-44](44.md).
+The encryption algorithm MUST use the latest version of [NIP-44](44.md).
Clients MUST verify if pubkey of the `kind:13` is the same pubkey on the `kind:14`, otherwise any sender can impersonate others by simply changing the pubkey on `kind:14`.
-Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
+Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
The gift wrap's `p`-tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity.
Clients CAN offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key
-## Publishing
+## Publishing
Kind `10050` indicates the user's preferred relays to receive DMs. The event MUST include a list of `relay` tags with relay URIs.
@@ -98,16 +98,22 @@ Kind `10050` indicates the user's preferred relays to receive DMs. The event MUS
}
```
-Clients SHOULD publish kind `14` events to the `10050`-listed relays, falling back to `read` relays of [NIP-65](65.md) if `kind:10050` is not available.
+Clients SHOULD publish kind `14` events to the `10050`-listed relays. If that is not found that indicates the user is not ready to receive messages under this NIP and clients shouldn't try.
+
+## Relays
+
+It's advisable that relays do not serve `kind:14` to clients other than the ones tagged in them.
+
+It's advisable that users choose relays that conform to these practices.
-Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
+Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
## Benefits & Limitations
-This NIP offers the following privacy and security features:
+This NIP offers the following privacy and security features:
1. **No Metadata Leak**: Participant identities, each message's real date and time, event kinds, and other event tags are all hidden from the public. Senders and receivers cannot be linked with public information alone.
-2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
+2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
3. **No Moderation**: There are no group admins: no invitations or bans.
4. **No Shared Secrets**: No secret must be known to all members that can leak or be mistakenly shared
5. **Fully Recoverable**: Messages can be fully recoverable by any client with the user's private key
@@ -115,13 +121,17 @@ This NIP offers the following privacy and security features:
7. **Uses Public Relays**: Messages can flow through public relays without loss of privacy. Private relays can increase privacy further, but they are not required.
8. **Cold Storage**: Users can unilaterally opt-in to sharing their messages with a separate key that is exclusive for DM backup and recovery.
-The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
+The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
-----
+## Implementation
+
+Clients implementing this NIP should by default only connect to the set of relays found in their `kind:10050` list. From that they should be able to load all messages both sent and received as well as get new live updates, making it for a very simple and lightweight implementation that should be fast.
+
+When sending a message to anyone, clients must then connect to the relays in the receiver's `kind:10050` and send the events there, but can disconnect right after unless more messages are expected to be sent (e.g. the chat tab is still selected). Clients should also send a copy of their outgoing messages to their own `kind:10050` relay set.
## Examples
-This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
+This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
The two final GiftWraps, one to the receiver and the other to the sender, are:
@@ -138,7 +148,7 @@ The two final GiftWraps, one to the receiver and the other to the sender, are:
"sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480"
}
```
-
+
```json
{
"id":"162b0611a1911cfcb30f8a5502792b346e535a45658b3a31ae5c178465509721",
@@ -151,4 +161,4 @@ The two final GiftWraps, one to the receiver and the other to the sender, are:
"content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ",
"sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab"
}
-```
+```
commit bad8826211ca2eb8660e4bd68b292d14616d3669
Author: fiatjaf <
[email protected]>
Date: Wed Apr 24 18:44:36 2024 -0300
nip34: simplify `r` tag for earliest unique commit.
diff --git a/34.md b/34.md
index f72fcf2..03ee039 100644
--- a/34.md
+++ b/34.md
@@ -23,8 +23,7 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
- ["earliest-unique-commit", "<commit-id>"] // usually root commit but a recent commit for forks
- ["r", "<earliest-unique-commit-id>"] // so clients can subscribe to all events related to a local git repo
+ ["r", "<earliest-unique-commit-id>", "euc"]
["maintainers", "<other-recognized-maintainer>", ...]
]
}
@@ -32,13 +31,15 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
The tags `web`, `clone`, `relays`, `maintainers` can have multiple values.
+The `r` tag annotated with the `"euc"` marker should be the commit ID of the earliest unique commit of this repo, made to identify it among forks and group it with other repositories hosted elsewhere that may represent essentially the same project. In most cases it will be the root commit of a repository. In case of a permanent fork between two projects, then the first commit after the fork should be used.
+
Except `d`, all tags are optional.
## Patches
Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
-Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
+Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply` to the original root patch.
@@ -132,7 +133,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
["e", "<applied-or-merged-patch-event-id>", "", "mention"], // for each
// when merged
["merge-commit", "<merge-commit-id>"]
- ["r", "<merge-commit-id>"]
+ ["r", "<merge-commit-id>"]
// when applied
["applied-as-commits", "<commit-id-in-master-branch>", ...]
["r", "<applied-commit-id>"] // for each
@@ -142,7 +143,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
The Status event with the largest created_at date is valid.
-The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
+The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
## Possible things to be added later
commit 6071f3489eabe50eea748a2585a73c02a23d96cf
Author: Alex Gleason <
[email protected]>
Date: Thu Apr 25 06:38:36 2024 -0500
NIP-46: "error" property of response is optional (#1195)
* NIP-46: clarify "error" property of response
* NIP-46: It's -> Its
* optionally
Co-authored-by: Asai Toshiya <
[email protected]>
---------
Co-authored-by: fiatjaf_ <
[email protected]>
Co-authored-by: Asai Toshiya <
[email protected]>
diff --git a/46.md b/46.md
index 56b8402..d4b5728 100644
--- a/46.md
+++ b/46.md
@@ -153,13 +153,13 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](https://github.c
{
"id": <request_id>,
"result": <results_string>,
- "error": <error_string>
+ "error": <optional_error_string>
}
```
- `id` is the request ID that this response is for.
- `results` is a string of the result of the call (this can be either a string or a JSON stringified object)
-- `error` is an error in string form.
+- `error`, _optionally_, it is an error in string form, if any. Its presence indicates an error with the request.
### Auth Challenges
commit 243b2865826edff22eebe5ec6e893c711802c7e5
Author: fiatjaf <
[email protected]>
Date: Thu Apr 25 18:03:38 2024 -0300
nip46: signer should fill in pubkey, id and sig on sign_event.
diff --git a/46.md b/46.md
index d4b5728..e0a5b2e 100644
--- a/46.md
+++ b/46.md
@@ -61,8 +61,9 @@ nostrconnect://<local-keypair-pubkey>?relay=<wss://relay-to-connect-on>&metadata
"method": "sign_event",
"params": [json_stringified(<{
content: "Hello, I'm signing remotely",
- pubkey: "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52",
- // ...the rest of the event data
+ kind: 1,
+ tags: [],
+ created_at: 1714078911
}>)]
}),
"tags": [["p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52"]], // p-tags the remote user pubkey
@@ -118,21 +119,21 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](https://github.c
Each of the following are methods that the client sends to the remote signer.
-| Command | Params | Result |
-| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
-| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
-| `sign_event` | `[<json_stringified_event_to_sign>]` | `json_stringified(<signed_event>)` |
-| `ping` | `[]` | "pong" |
-| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
-| `get_public_key` | `[]` | `<hex-pubkey>` |
-| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
-| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
-| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
-| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
+| Command | Params | Result |
+| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
+| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
+| `sign_event` | `[<{kind, content, tags, created_at}>]` | `json_stringified(<signed_event>)` |
+| `ping` | `[]` | "pong" |
+| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
+| `get_public_key` | `[]` | `<hex-pubkey>` |
+| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
+| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
+| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
+| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
### Requested permissions
-The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
+The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
## Response Events `kind:24133`
commit ef5eacd48904a5cee0b4e51c4b7d46a9606a7351
Author: Lucas Nuic <
[email protected]>
Date: Wed May 1 22:48:11 2024 -0300
“decentralized reporting of digital threats such as malware” in nostr
I added new tags for reporting bad things like malware
diff --git a/56.md b/56.md
index 3209b80..190e0b4 100644
--- a/56.md
+++ b/56.md
@@ -26,6 +26,7 @@ A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
+- `malware` - depictions of malware, virus, Trojan Horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
- `profanity` - profanity, hateful speech, etc.
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
commit 2b490b168e4b51e1c441d985ca89e5e1f426a610
Author: Lucas Nuic <
[email protected]>
Date: Wed May 1 23:29:14 2024 -0300
fixed typo
diff --git a/56.md b/56.md
index 190e0b4..fc8d898 100644
--- a/56.md
+++ b/56.md
@@ -26,7 +26,7 @@ A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
-- `malware` - depictions of malware, virus, Trojan Horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
+- `malware` - virus, trojan horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
- `profanity` - profanity, hateful speech, etc.
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
commit 88246c27414d11983dced414462b2be2d010fad8
Author: Leo Wandersleb <
[email protected]>
Date: Wed Apr 24 12:18:27 2024 -0400
Require tags to have at least one string
fixes #1193
diff --git a/01.md b/01.md
index a91febc..8be85bc 100644
--- a/01.md
+++ b/01.md
@@ -56,7 +56,7 @@ To prevent implementation differences from creating a different event ID for the
### Tags
-Each tag is an array of strings of arbitrary size, with some conventions around them. Take a look at the example below:
+Each tag is an array of one or more strings, with some conventions around them. Take a look at the example below:
```jsonc
{
commit 218fbb1cc7ac900fd256f666cb6add590cabb24a
Author: fiatjaf_ <
[email protected]>
Date: Thu May 2 11:04:55 2024 -0300
NIP-54: decentralized wikis (#787)
* draft of NIP-34: decentralized wikis.
* add merge requests.
* add merge request flow
* update nip number
---------
Co-authored-by: Pablo Fernandez <
[email protected]>
diff --git a/51.md b/51.md
index 95acbc8..fb40b26 100644
--- a/51.md
+++ b/51.md
@@ -20,18 +20,20 @@ Standard lists use non-parameterized replaceable events, meaning users may only
For example, _mute list_ can contain the public keys of spammers and bad actors users don't want to see in their feeds or receive annoying notifications from.
-| name | kind | description | expected tag items |
-| --- | --- | --- | --- |
-| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
-| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
-| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
-| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
-| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
-| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
-| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
-| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group ids + mandatory relay URL) |
-| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
-| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
+| name | kind | description | expected tag items |
+| --- | --- | --- | --- |
+| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
+| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
+| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
+| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
+| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
+| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
+| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
+| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group ids + mandatory relay URL) |
+| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
+| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
+| Good wiki authors | 10101 | [NIP-54](54.md) user recommended wiki authors | `"p"` (pubkeys) |
+| Good wiki relays | 10102 | [NIP-54](54.md) relays deemed to only host useful articles | `"relay"` (relay URLs) |
## Sets
diff --git a/54.md b/54.md
new file mode 100644
index 0000000..9063ca9
--- /dev/null
+++ b/54.md
@@ -0,0 +1,106 @@
+NIP-54
+======
+
+Wiki
+----
+`draft` `optional`
+
+This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
+
+Articles are identified by lowercase, normalized ascii `d` tags.
+
+### Articles
+```js
+{
+ "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
+ "tags": [
+ [ "d", "wiki" ],
+ [ "title", "Wiki" ],
+ ]
+}
+```
+
+[INSERT NORMALIZATION EXAMPLES]
+
+The content should be Markdown, following the same rules as of [NIP-23](23.md), although it takes some extra (optional) metadata tags:
+
+ - `title`: for when the display title should be different from the `d` tag.
+ - `summary`: for display in lists.
+ - `a` and `e`: for referencing the original event a wiki article was forked from.
+
+One extra functionality is added: **wikilinks**. Unlike normal Markdown links `[]()` that link to webpages, wikilinks `[[]]` link to other articles in the wiki. In this case, the wiki is the entirety of Nostr. Clicking on a wikilink should cause the client to ask relays for events with `d` tags equal to the target of that wikilink.
+
+### Merge Requests
+
+Event `kind:818` represents a request to merge from a forked article into the source. It is directed to a pubkey and references the original article and the modified event.
+
+[INSERT EVENT EXAMPLE]
+
+### Redirects
+
+Event `kind:30819` is also defined to stand for "wiki redirects", i.e. if one thinks `Shell structure` should redirect to `Thin-shell structure` they can issue one of these events instead of replicating the content. These events can be used for automatically redirecting between articles on a client, but also for generating crowdsourced "disambiguation" pages ([common in Wikipedia](https://en.wikipedia.org/wiki/Help:Disambiguation)).
+
+[INSERT EVENT EXAMPLE]
+
+How to decide what article to display
+-------------------------------------
+
+As there could be many articles for each given name, some kind of prioritization must be done by clients. Criteria for this should vary between users and clients, but some means that can be used are described below:
+
+### Reactions
+
+[NIP-25](25.md) reactions are very simple and can be used to create a simple web-of-trust between wiki article writers and their content. While just counting a raw number of "likes" is unproductive, reacting to any wiki article event with a `+` can be interpreted as a recommendation for that article specifically and a partial recommendation of the author of that article. When 2 or 3-level deep recommendations are followed, suddenly a big part of all the articles may have some form of tagging.
+
+### Relays
+
+[NIP-51](51.md) lists of relays can be created with the kind 10102 and then used by wiki clients in order to determine where to query articles first and to rank these differently in relation to other events fetched from other relays.
+
+### Contact lists
+
+[NIP-02](02.md) contact lists can form the basis of a recommendation system that is then expanded with relay lists and reaction lists through nested queries. These lists form a good starting point only because they are so widespread.
+
+### Wiki-related contact lists
+
+[NIP-51](51.md) lists can also be used to create a list of users that are trusted only in the context of wiki authorship or wiki curationship.
+
+Forks
+---------
+Wiki-events can tag other wiki-events with a `fork` marker to specify that this event came from a different version. Both `a` and `e` tags SHOULD be used and have the `fork` marker applied, to identify the exact version it was forked from.
+
+Deference
+---------
+Wiki-events can tag other wiki-events with a `defer` marker to indicate that it considers someone else's entry as a "better" version of itself. If using a `defer` marker both `a` and `e` tags SHOULD be used.
+
+This is a stronger signal of trust than a `+` reaction.
+
+This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an indepedent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
+
+Why Markdown?
+-------------
+
+If the idea is to make a wiki then the most obvious text format to use is probably the mediawiki/wikitext format used by Wikipedia since it's widely deployed in all mediawiki installations and used for decades with great success. However, it turns out that format is very bloated and convoluted, has way too many features and probably because of that it doesn't have many alternative implementations out there, and the ones that exist are not complete and don't look very trustworthy. Also it is very much a centralized format that can probably be changed at the whims of the Wikipedia owners.
+
+On the other hand, Markdown has proven to work well for small scale wikis and one of the biggest wikis in the planet (which is not very often thought of as a wiki), [StackOverflow](https://stackoverflow.com) and its child sites, and also one of the biggest "personal wiki" software, [Obsidian](https://obsidian.md/). Markdown can probably deliver 95% of the functionality of wikitext. When augmented with tables, diagram generators and MathJax (which are common extensions that exist in the wild and can be included in this NIP) that rate probably goes to 99%, and its simplicity is a huge benefit that can't be overlooked. Wikitext format can also be transpíled into Markdown using Pandoc. Given all that, I think it's a reasonable suspicion that mediawiki is not inherently better than Markdown, the success of Wikipedia probably cannot be predicated on the syntax language choice.
+
+# Appendix 1: Merge requests
+Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
+
+```js
+{
+ "content": "I added information about how to make hot ice-creams",
+ "kind": 818,
+ "tags": [
+ [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
+ [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
+ [ "p", "<destination-pubkey>" ],
+ [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
+ ]
+}
+```
+
+`.content`: an optional explanation detailing why this merge is being requested.
+`a` tag: tag of the article which should be modified (i.e. the target of this merge request).
+`e` tag: optional version of the article in which this modifications is based
+`e` tag with `source` marker: the ID of the event that should be merged. This event id MUST be of a `kind:30818` as defined in this NIP.
+
+The destination-pubkey (the pubkey being requested to merge something into their article can create [[NIP-25]] reactions that tag the `kind:818` event with `+` or `-`
diff --git a/README.md b/README.md
index 619c984..b3736ea 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-51: Lists](51.md)
- [NIP-52: Calendar Events](52.md)
- [NIP-53: Live Activities](53.md)
+- [NIP-54: Wiki](54.md)
- [NIP-56: Reporting](56.md)
- [NIP-57: Lightning Zaps](57.md)
- [NIP-58: Badges](58.md)
@@ -171,6 +172,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `30402` | Classified Listing | [99](99.md) |
| `30403` | Draft Classified Listing | [99](99.md) |
| `30617` | Repository announcements | [34](34.md) |
+| `30818` | Wiki article | [54](54.md) |
| `31922` | Date-Based Calendar Event | [52](52.md) |
| `31923` | Time-Based Calendar Event | [52](52.md) |
| `31924` | Calendar | [52](52.md) |
commit f393df80361da9226be131f0e91970268bb6be2d
Merge: dcb5d0f 2b490b1
Author: Alex Gleason <
[email protected]>
Date: Sat May 4 19:43:51 2024 -0500
Merge pull request #1213 from lucasnuic/reporting-digital-threats-as-malware
NIP-56 to reporting of digital threats
commit 3834c6b60474a677b53847743212df27710e64ec
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 4 16:10:13 2024 -0400
Simplifying reactions
diff --git a/25.md b/25.md
index 3b4aa59..bdee066 100644
--- a/25.md
+++ b/25.md
@@ -25,14 +25,13 @@ consider it a "+".
Tags
----
-The reaction event SHOULD include `e` and `p` tags from the note the user is
-reacting to. This allows users to be notified of reactions to posts they were
-mentioned in. Including the `e` tags enables clients to pull all the reactions
-associated with individual posts or all the posts in a thread.
+The reaction event SHOULD include `e` and `p` tags pointing to the note the user is
+reacting to. The `p` tag allows authors to be notified. The `e` tags enables clients
+to pull all the reactions to individual posts.
-The last `e` tag MUST be the `id` of the note that is being reacted to.
+The `e` tag MUST be the `id` of the note that is being reacted to.
-The last `p` tag MUST be the `pubkey` of the event being reacted to.
+The `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
of the reacted event as its value.
@@ -41,9 +40,6 @@ Example code
```swift
func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> NostrEvent {
- var tags: [[String]] = liked.tags.filter {
- tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p")
- }
tags.append(["e", liked.id])
tags.append(["p", liked.pubkey])
tags.append(["k", liked.kind])
commit 4bcf91944a9e53680cc928424e7af145242b1a39
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 4 16:35:39 2024 -0400
adds a tags.
diff --git a/25.md b/25.md
index bdee066..7cc96b5 100644
--- a/25.md
+++ b/25.md
@@ -25,12 +25,15 @@ consider it a "+".
Tags
----
-The reaction event SHOULD include `e` and `p` tags pointing to the note the user is
+The reaction event SHOULD include `a`, `e` and `p` tags pointing to the note the user is
reacting to. The `p` tag allows authors to be notified. The `e` tags enables clients
-to pull all the reactions to individual posts.
+to pull all the reactions to individual events and `a` tags enables clients to seek reactions
+for all versions of a replaceable event.
The `e` tag MUST be the `id` of the note that is being reacted to.
+The `a` tag MUST contain the coordinates (`kind:pubkey:d-tag`) of the replaceable being reacted to.
+
The `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
commit dcb5d0f18d6b0c60bda9abc79c6cca99a4d86177
Author: fiatjaf <
[email protected]>
Date: Thu May 2 11:32:58 2024 -0300
small fixes on nip 54.
diff --git a/54.md b/54.md
index 9063ca9..7870330 100644
--- a/54.md
+++ b/54.md
@@ -3,6 +3,7 @@ NIP-54
Wiki
----
+
`draft` `optional`
This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
@@ -10,7 +11,7 @@ This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-for
Articles are identified by lowercase, normalized ascii `d` tags.
### Articles
-```js
+```jsonc
{
"content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
"tags": [
@@ -85,7 +86,7 @@ On the other hand, Markdown has proven to work well for small scale wikis and on
# Appendix 1: Merge requests
Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
-```js
+```jsonc
{
"content": "I added information about how to make hot ice-creams",
"kind": 818,
commit 8073c848a33007c6e03d1de4d4fd17d46c2a0242
Merge: 4fa65b8 4bcf919
Author: hodlbod <
[email protected]>
Date: Mon May 6 08:28:36 2024 -0700
Merge pull request #1221 from vitorpamplona/fix-reactions
Changes reactions to not include the entire thread as e-tags.
commit 69e14f1dca1e7ae439072d157b62ad3462086116
Merge: 8073c84 cb9bddb
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 11 13:19:29 2024 -0400
Merge pull request #1230 from adamdecaf/misc-spelling-fixes
all: minor spelling fixes
commit c1360c4f0b111143747bad6226df6f00499f5cfe
Author: fiatjaf <
[email protected]>
Date: Sat May 4 23:34:37 2024 -0300
nip54: add normalization rules.
diff --git a/54.md b/54.md
index 7870330..c481eb6 100644
--- a/54.md
+++ b/54.md
@@ -21,7 +21,12 @@ Articles are identified by lowercase, normalized ascii `d` tags.
}
```
-[INSERT NORMALIZATION EXAMPLES]
+### `d` tag normalization rules
+
+- Any non-letter character MUST be converted to a `-`.
+- All letters MUST be converted to lowercase.
+
+### Content rules
The content should be Markdown, following the same rules as of [NIP-23](23.md), although it takes some extra (optional) metadata tags:
commit cb9bddb8dfd11972286215d9bdee7434764ccf7b
Author: Adam Shannon <
[email protected]>
Date: Sat May 11 11:52:32 2024 -0500
all: minor spelling fixes
diff --git a/34.md b/34.md
index 03ee039..fcc2cec 100644
--- a/34.md
+++ b/34.md
@@ -125,7 +125,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
["p", "<root-event-author>"],
["p", "<revision-author>"],
- // optional for improved subscription filter efficency
+ // optional for improved subscription filter efficiency
["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
["r", "<earliest-unique-commit-id-of-repo>"]
diff --git a/46.md b/46.md
index e0a5b2e..1528116 100644
--- a/46.md
+++ b/46.md
@@ -208,7 +208,7 @@ When the user types a NIP-05 the client:
#### Remote signer discovery via NIP-89
-In this last case, most often used to fascilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events.
+In this last case, most often used to facilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events.
First the client will query for `kind: 31990` events that have a `k` tag of `24133`.
diff --git a/54.md b/54.md
index 2090182..8823af9 100644
--- a/54.md
+++ b/54.md
@@ -79,7 +79,7 @@ Wiki-events can tag other wiki-events with a `defer` marker to indicate that it
This is a stronger signal of trust than a `+` reaction.
-This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an indepedent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
+This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an independent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
Why Markdown?
-------------
diff --git a/72.md b/72.md
index 4bafce0..5a8be0a 100644
--- a/72.md
+++ b/72.md
@@ -76,7 +76,7 @@ The post-approval event MUST include `a` tags of the communities the moderator i
It's recommended that multiple moderators approve posts to avoid deleting them from the community when a moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign new approvals for posts in the past or the community will restart. The owner can also periodically copy and re-sign of each moderator's approval events to make sure posts don't disappear with moderators.
-Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the repleceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
+Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the replaceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
Clients SHOULD evaluate any non-`34550:*` `a` tag as posts to be included in all `34550:*` `a` tags.
diff --git a/90.md b/90.md
index 241eb38..2b499a8 100644
--- a/90.md
+++ b/90.md
@@ -199,7 +199,7 @@ Some service providers might choose to submit a `payment-required` as the first
It's not up to this NIP to define how individual vending machines should choose to run their business.
# Cancellation
-A job request might be cancelled by publishing a `kind:5` delete request event tagging the job request event.
+A job request might be canceled by publishing a `kind:5` delete request event tagging the job request event.
# Appendix 1: Job chaining
A Customer MAY request multiple jobs to be processed as a chain, where the output of a job is the input of another job. (e.g. podcast transcription -> summarization of the transcription). This is done by specifying as input an event id of a different job with the `job` type.
commit 4fa65b81cede9eaf8375d4f92bc80cf298190e0c
Author: fiatjaf <
[email protected]>
Date: Sat May 4 23:36:48 2024 -0300
nip54: fix json indentation.
diff --git a/54.md b/54.md
index c481eb6..2090182 100644
--- a/54.md
+++ b/54.md
@@ -13,11 +13,11 @@ Articles are identified by lowercase, normalized ascii `d` tags.
### Articles
```jsonc
{
- "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
- "tags": [
- [ "d", "wiki" ],
- [ "title", "Wiki" ],
- ]
+ "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
+ "tags": [
+ ["d", "wiki"],
+ ["title", "Wiki"],
+ ]
}
```
@@ -93,14 +93,14 @@ Users can request other users to get their entries merged into someone else's en
```jsonc
{
- "content": "I added information about how to make hot ice-creams",
- "kind": 818,
- "tags": [
- [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
- [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
- [ "p", "<destination-pubkey>" ],
- [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
- ]
+ "content": "I added information about how to make hot ice-creams",
+ "kind": 818,
+ "tags": [
+ [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
+ [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
+ [ "p", "<destination-pubkey>" ],
+ [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
+ ]
}
```
commit a02c3621a956355c1e44640891d6316a1567463f
Merge: 0acdf57 9f13e76
Author: hodlbod <
[email protected]>
Date: Mon May 13 05:55:51 2024 -0700
Merge pull request #1235 from AsaiToshiya/AsaiToshiya-patch-8
BREAKING.md: add NIP-34 change
commit 38ee6511dc3ac9fb1b5b91920963844e2a9a0ada
Author: Asai Toshiya <
[email protected]>
Date: Tue May 14 01:17:46 2024 +0900
BREAKING.md: fix date
diff --git a/BREAKING.md b/BREAKING.md
index b59bc8b..7b48ee0 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -7,7 +7,7 @@ reverse chronological order.
| ----------- | --------- | -------- | ------ |
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
-| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
+| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed |
commit 0acdf57ab18ef4143fc6ca8dc800adf1437bf95e
Merge: 69e14f1 c2d9b40
Author: hodlbod <
[email protected]>
Date: Sat May 11 11:36:22 2024 -0700
Merge pull request #1231 from adamdecaf/nip-90-link-fixes
nip90: fix links
commit c2d9b40d5bcf2d04cd04c19b42065e5158ecbab8
Author: Adam Shannon <
[email protected]>
Date: Sat May 11 12:38:01 2024 -0500
nip90: fix links
diff --git a/90.md b/90.md
index 2b499a8..5a15ebb 100644
--- a/90.md
+++ b/90.md
@@ -162,8 +162,8 @@ Service providers can give feedback about a job back to the customer.
```
* `content`: Either empty or a job-result (e.g. for partial-result samples)
-* `amount` tag: as defined in the [Job Result](#job-result) section.
-* `status` tag: Service Providers SHOULD indicate what this feedback status refers to. [Appendix 1](#appendix-1-job-feedback-status) defines status. Extra human-readable information can be added as an extra argument.
+* `amount` tag: as defined in the [Job Result](#job-result-kind6000-6999) section.
+* `status` tag: Service Providers SHOULD indicate what this feedback status refers to. [Job Feedback Status](#job-feedback-status) defines status. Extra human-readable information can be added as an extra argument.
* NOTE: If the input params requires input to be encrypted, then `content` field will have encrypted payload with `p` tag as key.
@@ -177,7 +177,7 @@ Service providers can give feedback about a job back to the customer.
| `success` | Service Provider successfully processed the job. |
| `partial` | Service Provider partially processed the job. The `.content` might include a sample of the partial results. |
-Any job feedback event MIGHT include results in the `.content` field, as described in the [Job Result](#job-result) section. This is useful for service providers to provide a sample of the results that have been processed so far.
+Any job feedback event MIGHT include results in the `.content` field, as described in the [Job Result](#job-result-kind6000-6999) section. This is useful for service providers to provide a sample of the results that have been processed so far.
# Protocol Flow
commit 9f13e76f022317a915386c1053dc8bac0a1a0dd3
Author: Asai Toshiya <
[email protected]>
Date: Mon May 13 21:11:30 2024 +0900
BREAKING.md: add NIP-34 change
diff --git a/BREAKING.md b/BREAKING.md
index 8024814..b59bc8b 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -5,6 +5,7 @@ reverse chronological order.
| Date | Commit | NIP | Change |
| ----------- | --------- | -------- | ------ |
+| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
commit b1f771302a6a1a94c888b619e08a9c302df85fc2
Author: Sam Samskies <
[email protected]>
Date: Sat May 11 14:58:40 2024 -0500
fix NWC connection string example
diff --git a/47.md b/47.md
index 9033847..0f93b20 100644
--- a/47.md
+++ b/47.md
@@ -95,7 +95,7 @@ The **client** should then store this connection and use it when the user wants
### Example connection string
```sh
-nostr+walletconnect:b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c
+nostr+walletconnect://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c
```
## Commands
commit 734f379a2a2f225f76f87cdcf074c997a0d40d35
Author: Jon Staab <
[email protected]>
Date: Tue Apr 23 11:34:17 2024 -0700
Add ontolo to nip 32
diff --git a/32.md b/32.md
index be4e872..92497a6 100644
--- a/32.md
+++ b/32.md
@@ -151,3 +151,11 @@ A good heuristic for whether a use case fits this NIP is whether labels would ev
For example, many events might be labeled with a particular place, topic, or pubkey, but labels
with specific values like "John Doe" or "3.18743" are not labels, they are values, and should
be handled in some other way.
+
+
+Appendix: Known Ontologies
+-------------------------
+
+Below is a non-exhaustive list of ontologies currently in widespread use.
+
+- (social.ontolo.categories)[https://ontolo.social/]
commit 7c3fd43736a938482e7241cc17666a0dba9c4681
Merge: 734f379 1da44a5
Author: Asai Toshiya <
[email protected]>
Date: Fri May 17 21:19:33 2024 +0900
Merge pull request #1240 from tyiu/tyiu/missing-comma-nip-59
Add missing comma in the example gift wrap JSON for NIP-59
commit 1da44a5b712363da6ed2aa149f498da08d087782
Author: Terry Yiu <
[email protected]>
Date: Fri May 17 08:13:02 2024 -0400
Add missing comma in the example gift wrap JSON for NIP-59
diff --git a/59.md b/59.md
index 7eff2b8..4dc857f 100644
--- a/59.md
+++ b/59.md
@@ -155,7 +155,7 @@ Sign the `gift wrap` using the random key generated in the previous step.
"created_at": 1703021488,
"pubkey": "18b1a75918f1f2c90c23da616bce317d36e348bcf5f7ba55e75949319210c87c",
"id": "5c005f3ccf01950aa8d131203248544fb1e41a0d698e846bd419cec3890903ac",
- "sig": "35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df750097b04f9e13053764251b8bc5dd7e8e0794a3426a90b6bcc7e5ff660f54259"
+ "sig": "35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df750097b04f9e13053764251b8bc5dd7e8e0794a3426a90b6bcc7e5ff660f54259",
"tags": [["p", "166bf3765ebd1fc55decfe395beff2ea3b2a4e0a8946e7eb578512b555737c99"]],
}
```
commit caee48316f811f928d92c44892ea173d990b2ebc
Author: Asai Toshiya <
[email protected]>
Date: Fri May 17 19:45:27 2024 +0900
NIP-24: clarify meaning of "event" for title
diff --git a/24.md b/24.md
index 449101a..b21f48e 100644
--- a/24.md
+++ b/24.md
@@ -40,4 +40,4 @@ tags
These tags may be present in multiple event kinds. Whenever a different meaning is not specified by some more specific NIP, they have the following meanings:
- `r`: a web URL the event is referring to in some way
- - `title`: title of the event
+ - `title`: name of [NIP-51](51.md) sets, [NIP-52](52.md) calendar event, [NIP-53](53.md) live event or [NIP-99](99.md) listing
commit bff2e9a28adcb5a6935157441825ca4fe1329a25
Merge: 7c3fd43 caee483
Author: hodlbod <
[email protected]>
Date: Fri May 17 08:00:20 2024 -0700
Merge pull request #1239 from AsaiToshiya/AsaiToshiya-patch-9
NIP-24: clarify meaning of "event" for title
commit a59ce8970ae8fb9c05bcd9e716e95187e9db6c17
Author: Braydon Fuller <
[email protected]>
Date: Fri May 17 12:02:21 2024 -0700
Fix connection string protocol description. (#1243)
* Fix connection string protocol description.
* Update `nostr+walletconnect` reference.
diff --git a/47.md b/47.md
index 0f93b20..983d2c9 100644
--- a/47.md
+++ b/47.md
@@ -81,7 +81,7 @@ If the command was successful, the `error` field must be null.
## Nostr Wallet Connect URI
**client** discovers **wallet service** by scanning a QR code, handling a deeplink or pasting in a URI.
-The **wallet service** generates this connection URI with protocol `nostr+walletconnect:` and base path it's hex-encoded `pubkey` with the following query string parameters:
+The **wallet service** generates this connection URI with protocol `nostr+walletconnect://` and base path it's hex-encoded `pubkey` with the following query string parameters:
- `relay` Required. URL of the relay where the **wallet service** is connected and will be listening for events. May be more than one.
- `secret` Required. 32-byte randomly generated hex encoded string. The **client** MUST use this to sign events and encrypt payloads when communicating with the **wallet service**.
@@ -402,7 +402,7 @@ Response:
## Example pay invoice flow
-0. The user scans the QR code generated by the **wallet service** with their **client** application, they follow a `nostr+walletconnect:` deeplink or configure the connection details manually.
+0. The user scans the QR code generated by the **wallet service** with their **client** application, they follow a `nostr+walletconnect://` deeplink or configure the connection details manually.
1. **client** sends an event to the **wallet service** with kind `23194`. The content is a `pay_invoice` request. The private key is the secret from the connection string above.
2. **wallet service** verifies that the author's key is authorized to perform the payment, decrypts the payload and sends the payment.
3. **wallet service** responds to the event by sending an event with kind `23195` and content being a response either containing an error message or a preimage.
commit 0628ec171c99aac7ccece43e64a0d32c15fb54d0
Author: randymcmillan <
[email protected]>
Date: Wed May 15 22:10:43 2024 -0400
cargo:init
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..d4d1799
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "nips"
+version.workspace = true
+license.workspace = true
+rust-version.workspace = true
+edition.workspace = true
+readme.workspace = true
+homepage.workspace = true
+repository.workspace = true
+documentation.workspace = true
+categories.workspace = true
+keywords.workspace = true
+description.workspace = true
+authors.workspace = true
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
commit 8f081030fdae7917cd7cd58f86dd705bef1382f2
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:20:49 2024 -0400
nips/src/main.rs:apply cargo +nightly fmt
diff --git a/src/main.rs b/src/main.rs
index 146ddba..d253240 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,6 @@
use include_dir::{include_dir, Dir};
-use std::path::Path;
extern crate comrak;
+
use comrak::nodes::NodeValue;
use comrak::{format_html, parse_document, Arena, Options};
@@ -9,7 +9,8 @@ static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String {
- // The returned nodes are created in the supplied Arena, and are bound by its lifetime.
+ // The returned nodes are created in the supplied Arena, and are bound by its
+ // lifetime.
let arena = Arena::new();
// Parse the document into a root `AstNode`
@@ -30,24 +31,35 @@ fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String
}
fn main() {
-
- // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my* input.\n";
- // let orig = "my";
+ // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my*
+ // input.\n"; let orig = "my";
// let repl = "your";
// let html = replace_text(&doc, &orig, &repl);
// println!("{}", html);
- print_entries();
+ const BOUND: u8 = 50;
+ print_entries::<{ BOUND }>();
}
-fn print_entries() -> () {
+fn print_entries<const BOUND: u8>() -> () {
+ let mut count: u8 = 0;
let glob = "**/*.md";
- for entry in PROJECT_DIR.find(glob).unwrap() {
+ let mut nip_vec = Vec::<String>::new(); // Create an empty Vec
+ for entry in PROJECT_DIR.find(glob).unwrap() {
+ count = count + 1;
+ println!("count={}", count);
println!("Found {}", entry.path().display());
-
- let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- let readme = README_MD.contents_utf8().unwrap();
- println!("readme={}", readme);
}
+ for i in 1..count - 1 {
+ //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
+ //println!("Found {}", entry.path().display());
+ //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ //let readme = README_MD.contents_utf8().unwrap();
+ // println!("readme={}", readme);
+ nip_vec.push((i * 1).to_string());
+ }
+
+ println!("Vec: {:?}", nip_vec);
+ println!("BOUND={}", BOUND);
}
commit 2b17a5407e0eb614edb62704e214ae13aecec386
Author: randymcmillan <
[email protected]>
Date: Thu May 16 09:24:37 2024 -0400
Cargo.toml:src/main.rs:add include_dir
diff --git a/Cargo.toml b/Cargo.toml
index d4d1799..56695eb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,3 +16,4 @@ authors.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..add5545 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,13 @@
+use std::path::Path;
+use include_dir::{include_dir, Dir};
+static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
fn main() {
- println!("Hello, world!");
+ print_entries();
+}
+//#[cfg(feature = "glob")]
+fn print_entries() -> () {
+ let glob = "**/*.md";
+ for entry in PROJECT_DIR.find(glob).unwrap() {
+ println!("Found {}", entry.path().display());
+ }
}
commit ea115396fff0ac3db30a16d7f4920e209aabed41
Author: randymcmillan <
[email protected]>
Date: Thu May 16 16:31:43 2024 -0400
display markdown:initial config
diff --git a/Cargo.toml b/Cargo.toml
index 56695eb..f461a40 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,4 +16,6 @@ authors.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+comrak = "0.23.0"
include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
+markdown2html-converter = "1.1.12"
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..99acb95
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1 @@
+-include cargo.mk
diff --git a/cargo.mk b/cargo.mk
new file mode 120000
index 0000000..09daa8d
--- /dev/null
+++ b/cargo.mk
@@ -0,0 +1 @@
+../cargo.mk
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index add5545..146ddba 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,13 +1,53 @@
-use std::path::Path;
use include_dir::{include_dir, Dir};
+use std::path::Path;
+extern crate comrak;
+use comrak::nodes::NodeValue;
+use comrak::{format_html, parse_document, Arena, Options};
+
+static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
+
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
+
+fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String {
+ // The returned nodes are created in the supplied Arena, and are bound by its lifetime.
+ let arena = Arena::new();
+
+ // Parse the document into a root `AstNode`
+ let root = parse_document(&arena, document, &Options::default());
+
+ // Iterate over all the descendants of root.
+ for node in root.descendants() {
+ if let NodeValue::Text(ref mut text) = node.data.borrow_mut().value {
+ // If the node is a text node, perform the string replacement.
+ *text = text.replace(orig_string, replacement)
+ }
+ }
+
+ let mut html = vec![];
+ format_html(root, &Options::default(), &mut html).unwrap();
+
+ String::from_utf8(html).unwrap()
+}
+
fn main() {
+
+ // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my* input.\n";
+ // let orig = "my";
+ // let repl = "your";
+ // let html = replace_text(&doc, &orig, &repl);
+ // println!("{}", html);
+
print_entries();
}
-//#[cfg(feature = "glob")]
+
fn print_entries() -> () {
let glob = "**/*.md";
for entry in PROJECT_DIR.find(glob).unwrap() {
+
println!("Found {}", entry.path().display());
+
+ let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ let readme = README_MD.contents_utf8().unwrap();
+ println!("readme={}", readme);
}
}
commit d2e4ce291b3181dcbc4eb4855a0a050e0a8ffe33
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:55:14 2024 -0400
Cargo.toml:workspace config
diff --git a/Cargo.toml b/Cargo.toml
index f461a40..b45a312 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,18 +1,14 @@
[package]
name = "nips"
-version.workspace = true
-license.workspace = true
-rust-version.workspace = true
-edition.workspace = true
-readme.workspace = true
-homepage.workspace = true
-repository.workspace = true
-documentation.workspace = true
-categories.workspace = true
-keywords.workspace = true
-description.workspace = true
-authors.workspace = true
-
+version = { workspace = true }
+edition = { workspace = true }
+rust-version = { workspace = true }
+license = { workspace = true }
+homepage = { workspace = true }
+repository = { workspace = true }
+documentation = { workspace = true }
+keywords = { workspace = true }
+readme = { workspace = true }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
commit 53c924176337e2923330dfb677060b37268cbe7f
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:58:13 2024 -0400
build.rs
diff --git a/build.rs b/build.rs
index 439ffaf..b6d5f6c 100644
--- a/build.rs
+++ b/build.rs
@@ -3,6 +3,8 @@ use std::path::Path;
use std::process::Command;
fn main() {
+let _out_dir = env::var("OUT_DIR").unwrap();
+
Command::new("git")
.args(&[
"remote",
commit 9d7c194abef287ba59c81960d88e696d3291773c
Author: randymcmillan <
[email protected]>
Date: Fri May 17 11:16:30 2024 -0400
src/main.rs:intermediate access to README.md
diff --git a/src/main.rs b/src/main.rs
index 2193be3..002e7bc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -49,21 +49,34 @@ fn print_entries<const BOUND: u8>() -> () {
for entry in PROJECT_DIR.find(glob).unwrap() {
count = count + 1;
//println!("count={}", count);
- //println!("Found {}", entry.path().display());
+ //println!("{}", entry.path().display());
nip_vec.push((entry.path().display()).to_string());
- nip_vec.push("md content".to_string());
+ //nip_vec.push("md content".to_string());
let mut md_content = PROJECT_DIR.get_file(entry.path()).unwrap();
let content = md_content.contents_utf8().unwrap();
println!("\n{}", content);
}
- for i in 1..count - 1 {
- //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
- //println!("Found {}", entry.path().display());
- //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- //let readme = README_MD.contents_utf8().unwrap();
- //println!("readme={}", readme);
- //nip_vec.push((i * 1).to_string());
- }
+ let (a, b) = nip_vec.split_at(1);
+ println!("a={:}", format!("{:?}",a[0]));
+ let mut readme = PROJECT_DIR.get_file(a[0].clone()).unwrap();
+ let readme_md = readme.contents_utf8().unwrap();
+ println!("\n{}", readme_md);
+ println!("b={:?}", b);
+ let (c, d) = b.split_at(1);
+ println!("c={:?}", c);
+ println!("d={:?}", d);
+ let (e, f) = d.split_at(1);
+ println!("e={:?}", e);
+ println!("f={:?}", f);
+ let (g, h) = f.split_at(1);
+ println!("e={:?}", g);
+ println!("f={:?}", h);
+ //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
+ //println!("Found {}", entry.path().display());
+ //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ //let readme = README_MD.contents_utf8().unwrap();
+ //println!("readme={}", readme);
+ //nip_vec.push((i * 1).to_string());
//println!("Vec: {:?}", nip_vec);
//println!("BOUND={}", BOUND);
commit 2b43b8b9fd00a4492dd9adedf3297a9aa55181d7
Author: randymcmillan <
[email protected]>
Date: Fri May 17 09:24:39 2024 -0400
build.rs:src/main.rs:apply cargo +nightly fmt
diff --git a/build.rs b/build.rs
index b6d5f6c..62483c7 100644
--- a/build.rs
+++ b/build.rs
@@ -1,9 +1,9 @@
use std::env;
-use std::path::Path;
+//use std::path::Path;
use std::process::Command;
fn main() {
-let _out_dir = env::var("OUT_DIR").unwrap();
+ let _out_dir = env::var("OUT_DIR").unwrap();
Command::new("git")
.args(&[
diff --git a/src/main.rs b/src/main.rs
index d253240..2193be3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,7 @@ extern crate comrak;
use comrak::nodes::NodeValue;
use comrak::{format_html, parse_document, Arena, Options};
-static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
+//static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
@@ -48,18 +48,23 @@ fn print_entries<const BOUND: u8>() -> () {
for entry in PROJECT_DIR.find(glob).unwrap() {
count = count + 1;
- println!("count={}", count);
- println!("Found {}", entry.path().display());
+ //println!("count={}", count);
+ //println!("Found {}", entry.path().display());
+ nip_vec.push((entry.path().display()).to_string());
+ nip_vec.push("md content".to_string());
+ let mut md_content = PROJECT_DIR.get_file(entry.path()).unwrap();
+ let content = md_content.contents_utf8().unwrap();
+ println!("\n{}", content);
}
for i in 1..count - 1 {
//nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
//println!("Found {}", entry.path().display());
//let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
//let readme = README_MD.contents_utf8().unwrap();
- // println!("readme={}", readme);
- nip_vec.push((i * 1).to_string());
+ //println!("readme={}", readme);
+ //nip_vec.push((i * 1).to_string());
}
- println!("Vec: {:?}", nip_vec);
- println!("BOUND={}", BOUND);
+ //println!("Vec: {:?}", nip_vec);
+ //println!("BOUND={}", BOUND);
}
commit 8127bbda809b0cc3163bf79f3bfdf3f46016b481
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:49:49 2024 -0400
build.rs:git fetch/rebase upstream/master
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..439ffaf
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,36 @@
+use std::env;
+use std::path::Path;
+use std::process::Command;
+
+fn main() {
+ Command::new("git")
+ .args(&[
+ "remote",
+ "add",
+ "gnostr-org",
+ "
[email protected]:gnostr-org/nips.git",
+ ])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&[
+ "remote",
+ "add",
+ "upstream",
+ "
[email protected]:nostr-protocol/nips.git",
+ ])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["fetch", "--all"])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["fetch", "--all", "--tags"])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["rebase", "upstream/master"])
+ .status()
+ .unwrap();
+}
commit bd57127acf808ba4b5c4bc0c7415ab63f4aa85de
Author: randymcmillan <
[email protected]>
Date: Fri May 17 12:19:42 2024 -0400
src/main.rs:intermediate:traverse docs
diff --git a/src/main.rs b/src/main.rs
index 002e7bc..f6a5105 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -56,28 +56,40 @@ fn print_entries<const BOUND: u8>() -> () {
let content = md_content.contents_utf8().unwrap();
println!("\n{}", content);
}
- let (a, b) = nip_vec.split_at(1);
- println!("a={:}", format!("{:?}",a[0]));
- let mut readme = PROJECT_DIR.get_file(a[0].clone()).unwrap();
+
+ println!("count={}", count); //original document count
+
+ //README.md
+ let (first, remainder) = nip_vec.split_at(1);
+ //println!("a={:}", format!("{:?}",a[0]));
+ let mut readme = PROJECT_DIR.get_file(first[0].clone()).unwrap();
let readme_md = readme.contents_utf8().unwrap();
println!("\n{}", readme_md);
- println!("b={:?}", b);
- let (c, d) = b.split_at(1);
- println!("c={:?}", c);
- println!("d={:?}", d);
- let (e, f) = d.split_at(1);
- println!("e={:?}", e);
- println!("f={:?}", f);
- let (g, h) = f.split_at(1);
- println!("e={:?}", g);
- println!("f={:?}", h);
- //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
- //println!("Found {}", entry.path().display());
- //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- //let readme = README_MD.contents_utf8().unwrap();
- //println!("readme={}", readme);
- //nip_vec.push((i * 1).to_string());
-
- //println!("Vec: {:?}", nip_vec);
- //println!("BOUND={}", BOUND);
+
+ count = count - 1;
+ println!("count={}", count);
+
+ //second
+ //BREAKING.md
+ let mut breaking = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let breaking_md = breaking.contents_utf8().unwrap();
+ println!("\n{}", breaking_md);
+
+ //REMAINDERS
+ //count variable based on new documents added to nips repo
+
+ //traverse documents from last to no more remainders
+ count = count - 1;
+
+ //loop {
+ // if count > 1 {
+ // print!("count={}", count);
+ // }
+ // count = count - 1;
+ //}
+ println!("count={}", count);
+ let (last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ //println!("\nlast_md={}", last_md);
}
commit 5973f629e89363defe501531959063f7eabb6bba
Author: randymcmillan <
[email protected]>
Date: Fri May 17 12:31:50 2024 -0400
src/main.rs:intermediate:traverse docs
diff --git a/src/main.rs b/src/main.rs
index f6a5105..4840ddf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -81,15 +81,31 @@ fn print_entries<const BOUND: u8>() -> () {
//traverse documents from last to no more remainders
count = count - 1;
- //loop {
- // if count > 1 {
- // print!("count={}", count);
- // }
- // count = count - 1;
- //}
+
+ print!("count={}",count);
+ count = count - 1;
+ println!("count={}", count);
+ let (mut last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
+
+ print!("count={}",count);
+ count = count - 1;
+ println!("count={}", count);
+ let (mut last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
+
+ print!("count={}",count);
+ count = count - 1;
println!("count={}", count);
- let (last, remainder) = remainder.split_at(1);
+ let (mut last, remainder) = remainder.split_at(1);
let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
let last_md = last.contents_utf8().unwrap();
- //println!("\nlast_md={}", last_md);
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
}
commit 0f968441be79c4d18c0935e67f5c0e4c8a9f8fa0
Author: randymcmillan <
[email protected]>
Date: Fri May 17 17:53:19 2024 -0400
post-commit-history:script
diff --git a/post-commit-history b/post-commit-history
new file mode 100755
index 0000000..55ea811
--- /dev/null
+++ b/post-commit-history
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+count=0;
+new_count=0;
+INIT_COMMIT=$(git rev-list --all --max-parents=0)
+#echo $INIT_COMMIT;#exit
+##git log -1 --skip 2 --pretty=format:"%h"
+##git rev-parse --short=256 HEAD~2
+
+## n=`printf '%016s' "$(git rev-parse --short=4 HEAD~2)"`
+#n=`printf '%064s' "$(git rev-parse HEAD~0)"`
+echo $n
+## exit
+
+## branch=master
+## for commit in $(git rev-list $branch)
+## do
+## ## if git ls-tree --name-only -r $commit | grep -q '\.hbm\.xml$'; then
+## if git ls-tree --name-only -r $commit; then
+##
+## ##echo $commit
+## exit 0
+## fi
+## done
+## exit;
+
+## var=$((var+1))
+## ((var=var+1))
+## ((var+=1))
+## ((var++))
+
+#count=0
+for commit_hash in $(git rev-list master);do
+
+padded_commit_hash=`printf '%064s' "$commit_hash"`
+#echo $padded_commit_hash
+#exit
+#echo $commit_hash
+count=$((count+1))
+done
+#exit
+export COUNT=$count
+#exit
+
+#new_count = 0
+for commit_hash in $(gnostr-reflog);do
+#echo $commit_hash
+padded_commit_hash=`printf '%064s' "$commit_hash"`
+#echo $padded_commit_hash
+export NEW_COUNT=$new_count
+#n=`printf '%064s' "$(git rev-parse HEAD~$count)"`
+#echo $n
+gnostr --sec $padded_commit_hash -t $padded_commit_hash --tag nip_commit $commit_hash --content "$(git show $commit_hash || exit)" | gnostr-post-event --relay wss://e.nos.lol || exit
+##echo $commit_hash;
+ #for commit_padded_hash in $(gnostr-reflog -p);do
+ ##echo $commit_padded_hash;
+ # gnostr --sec $commit_padded_hash --content "$(git show $commit_hash)"
+ #done
+if [[ "$commit_hash" == "$INIT_COMMIT" ]]; then
+exit;
+fi
+new_count=$((new_count+1))
+#echo $count & wait
+#echo $new_count & wait
+#exit
+done
+exit;
commit 4b79bc67c471f77061d62704538e5fdd6ac28ae8
Author: Nostr.Band <
[email protected]>
Date: Fri Mar 22 08:01:37 2024 +0100
Add optional_requested_permissions
This is implemented in nsec.app, nostr.band, Coracle and Nostrudel, so maybe it's time to update the NIP.
diff --git a/46.md b/46.md
index eb96494..8ba65d9 100644
--- a/46.md
+++ b/46.md
@@ -120,7 +120,7 @@ Each of the following are methods that the client sends to the remote signer.
| Command | Params | Result |
| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
-| `connect` | `[<remote_user_pubkey>, <optional_secret>]` | "ack" |
+| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
| `sign_event` | `[<json_stringified_event_to_sign>]` | `json_stringified(<signed_event>)` |
| `ping` | `[]` | "pong" |
| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
@@ -130,6 +130,10 @@ Each of the following are methods that the client sends to the remote signer.
| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
+### Requested permissions
+
+The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
+
## Response Events `kind:24133`
```json
@@ -185,7 +189,7 @@ Each of the following are methods that the client sends to the remote signer.
| Command | Params | Result |
| ---------------- | ------------------------------------------ | ------------------------------------ |
-| `create_account` | `[<username>, <domain>, <optional_email>]` | `<newly_created_remote_user_pubkey>` |
+| `create_account` | `[<username>, <domain>, <optional_email>, <optional_requested_permissions>]` | `<newly_created_remote_user_pubkey>` |
## Appendix
commit cf0e6e1567662a80ff8f4ed1500909b843d5162f
Merge: de71f99 965eb45
Author: hodlbod <
[email protected]>
Date: Thu Mar 21 07:42:56 2024 -0700
Merge pull request #1132 from utxo-one/dev-nip05relay
Recommend setting relays in NIP05
commit 965eb45b30b6000da976addcf3163858abadcf07
Author: utxo <
[email protected]>
Date: Thu Mar 21 10:18:42 2024 -0400
remove prettier formatting
diff --git a/05.md b/05.md
index a4b804c..405078a 100644
--- a/05.md
+++ b/05.md
@@ -1,6 +1,8 @@
-# NIP-05
+NIP-05
+======
-## Mapping Nostr keys to DNS-based internet identifiers
+Mapping Nostr keys to DNS-based internet identifiers
+----------------------------------------------------
`final` `optional`
@@ -31,7 +33,7 @@ It will make a GET request to `https://example.com/.well-known/nostr.json?name=b
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
}
}
-```
+````
or with the **recommended** `"relays"` attribute:
@@ -41,13 +43,10 @@ or with the **recommended** `"relays"` attribute:
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
},
"relays": {
- "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [
- "wss://relay.example.com",
- "wss://relay2.example.com"
- ]
+ "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [ "wss://relay.example.com", "wss://relay2.example.com" ]
}
}
-```
+````
If the pubkey matches the one given in `"names"` (as in the example above) that means the association is right and the `"nip05"` identifier is valid and can be displayed.
commit 46a6bf331ae823dad079a9740f37d57e58b92358
Author: utxo <
[email protected]>
Date: Thu Mar 21 10:15:02 2024 -0400
Make relay attribute recommended in NIP-05
diff --git a/05.md b/05.md
index 6437550..a4b804c 100644
--- a/05.md
+++ b/05.md
@@ -1,8 +1,6 @@
-NIP-05
-======
+# NIP-05
-Mapping Nostr keys to DNS-based internet identifiers
-----------------------------------------------------
+## Mapping Nostr keys to DNS-based internet identifiers
`final` `optional`
@@ -33,9 +31,9 @@ It will make a GET request to `https://example.com/.well-known/nostr.json?name=b
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
}
}
-````
+```
-or with the **optional** `"relays"` attribute:
+or with the **recommended** `"relays"` attribute:
```json
{
@@ -43,14 +41,17 @@ or with the **optional** `"relays"` attribute:
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
},
"relays": {
- "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [ "wss://relay.example.com", "wss://relay2.example.com" ]
+ "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [
+ "wss://relay.example.com",
+ "wss://relay2.example.com"
+ ]
}
}
-````
+```
If the pubkey matches the one given in `"names"` (as in the example above) that means the association is right and the `"nip05"` identifier is valid and can be displayed.
-The optional `"relays"` attribute may contain an object with public keys as properties and arrays of relay URLs as values. When present, that can be used to help clients learn in which relays the specific user may be found. Web servers which serve `/.well-known/nostr.json` files dynamically based on the query string SHOULD also serve the relays data for any name they serve in the same reply when that is available.
+The recommended `"relays"` attribute may contain an object with public keys as properties and arrays of relay URLs as values. When present, that can be used to help clients learn in which relays the specific user may be found. Web servers which serve `/.well-known/nostr.json` files dynamically based on the query string SHOULD also serve the relays data for any name they serve in the same reply when that is available.
## Finding users from their NIP-05 identifier
commit 4f33dbc2b86684f9bf26dd1b0fc9789e3cbf2165
Author: silberengel <
[email protected]>
Date: Mon Mar 18 08:01:06 2024 +0100
Added bot field to denote automated npubs
diff --git a/24.md b/24.md
index d444a4b..449101a 100644
--- a/24.md
+++ b/24.md
@@ -16,6 +16,7 @@ These are extra fields not specified in NIP-01 that may be present in the string
- `display_name`: an alternative, bigger name with richer characters than `name`. `name` should always be set regardless of the presence of `display_name` in the metadata.
- `website`: a web URL related in any way to the event author.
- `banner`: an URL to a wide (~1024x768) picture to be optionally displayed in the background of a profile screen.
+ - `bot`: a boolean to clarify that the content is entirely or partially the result of automation, such as with chatbots or newsfeeds.
### Deprecated fields
commit 3443b3b589e39f96519feb70e27fa36d204559e1
Merge: 4b79bc6 4f33dbc
Author: Alex Gleason <
[email protected]>
Date: Sun Mar 24 16:13:58 2024 -0500
Merge pull request #1126 from SilberWitch/master
Added bot field to denote automated npubs
commit 715e4a044dc4af7cc54ef63428f4d45c9ba2d24e
Merge: 8817801 9971db3
Author: Alex Gleason <
[email protected]>
Date: Sat Mar 30 20:39:35 2024 -0500
Merge pull request #1149 from arthurfranca/patch-4
Minor fix to nip01
commit 9971db355164815c986251f8f89d1c7c70ec9e53
Author: arthurfranca <
[email protected]>
Date: Sat Mar 30 22:33:24 2024 -0300
Minor fix to nip01
diff --git a/01.md b/01.md
index 905e45f..a91febc 100644
--- a/01.md
+++ b/01.md
@@ -81,7 +81,7 @@ This NIP defines 3 standard tags that can be used across all event kinds with th
- for a parameterized replaceable event: `["a", <kind integer>:<32-bytes lowercase hex of a pubkey>:<d tag value>, <recommended relay URL, optional>]`
- for a non-parameterized replaceable event: `["a", <kind integer>:<32-bytes lowercase hex of a pubkey>:, <recommended relay URL, optional>]`
-As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key tags are expected to be indexed by relays, such that it is possible, for example, to query or subscribe to events that reference the event `"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"` by using the `{"#e": "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"}` filter.
+As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key tags are expected to be indexed by relays, such that it is possible, for example, to query or subscribe to events that reference the event `"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"` by using the `{"#e": ["5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"]}` filter.
### Kinds
commit af5d4074886916877c350dbdfec61e62a9875255
Author: Alex Gleason <
[email protected]>
Date: Tue Apr 2 10:00:07 2024 -0500
Update BREAKING.md for NIP-46 (stringified params)
diff --git a/BREAKING.md b/BREAKING.md
index 3693c34..8024814 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -6,6 +6,7 @@ reverse chronological order.
| Date | Commit | NIP | Change |
| ----------- | --------- | -------- | ------ |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
+| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed |
commit 769432efc42b69e5f23956a98d944238bba8d461
Author: Asai Toshiya <
[email protected]>
Date: Fri Mar 29 08:06:00 2024 +0900
README: fix order of kinds
diff --git a/README.md b/README.md
index 90a6394..c3c5ef0 100644
--- a/README.md
+++ b/README.md
@@ -173,8 +173,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `31925` | Calendar Event RSVP | [52](52.md) |
| `31989` | Handler recommendation | [89](89.md) |
| `31990` | Handler information | [89](89.md) |
-| `39000-9` | Group metadata events | [29](29.md) |
| `34550` | Community Definition | [72](72.md) |
+| `39000-9` | Group metadata events | [29](29.md) |
[nostrocket]: https://github.com/nostrocket/NIPS/blob/main/Problems.md
[lnpub]: https://github.com/shocknet/Lightning.Pub/blob/master/proto/autogenerated/client.md
commit 881780186077154f35abef89fe60c6d28343c8fd
Author: Vitor Pamplona <
[email protected]>
Date: Thu Mar 28 16:57:00 2024 -0400
Clarifies relays to be used for NIP-28
diff --git a/28.md b/28.md
index 2dcf800..65ebb3f 100644
--- a/28.md
+++ b/28.md
@@ -23,11 +23,11 @@ Client-centric moderation gives client developers discretion over what types of
Create a public chat channel.
-In the channel creation `content` field, Client SHOULD include basic channel metadata (`name`, `about`, `picture` as specified in kind 41).
+In the channel creation `content` field, Client SHOULD include basic channel metadata (`name`, `about`, `picture` and `relays` as specified in kind 41).
```json
{
- "content": "{\"name\": \"Demo Channel\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\"}",
+ "content": "{\"name\": \"Demo Channel\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}",
...
}
```
@@ -46,6 +46,7 @@ Clients SHOULD support basic metadata fields:
- `name` - string - Channel name
- `about` - string - Channel description
- `picture` - string - URL of channel picture
+- `relays` - array - List of relays to download and broadcast events to
Clients MAY add additional metadata fields.
@@ -53,7 +54,7 @@ Clients SHOULD use [NIP-10](10.md) marked "e" tags to recommend a relay.
```json
{
- "content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\"}",
+ "content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}",
"tags": [["e", <channel_create_event_id>, <relay-url>]],
...
}
@@ -132,12 +133,11 @@ Clients MAY hide event 42s for users other than the user who sent the event 44.
}
```
-## NIP-10 relay recommendations
+## Relay recommendations
-For [NIP-10](10.md) relay recommendations, clients generally SHOULD use the relay URL of the original (oldest) kind 40 event.
-
-Clients MAY recommend any relay URL. For example, if a relay hosting the original kind 40 event for a channel goes offline, clients could instead fetch channel data from a backup relay, or a relay that clients trust more than the original relay.
+Clients SHOULD use the relay URLs of the metadata events.
+Clients MAY use any relay URL. For example, if a relay hosting the original kind 40 event for a channel goes offline, clients could instead fetch channel data from a backup relay, or a relay that clients trust more than the original relay.
Motivation
----------
commit ca97490cdf4d499752bee2fa589514e2a474419b
Author: Asai Toshiya <
[email protected]>
Date: Wed Apr 3 13:09:22 2024 +0900
NIP-58: minor JSON fix
diff --git a/58.md b/58.md
index 0ecef25..4a9ed4c 100644
--- a/58.md
+++ b/58.md
@@ -83,7 +83,7 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according
["name", "Medal of Bravery"],
["description", "Awarded to users demonstrating bravery"],
["image", "https://nostr.academy/awards/bravery.png", "1024x1024"],
- ["thumb", "https://nostr.academy/awards/bravery_256x256.png", "256x256"],
+ ["thumb", "https://nostr.academy/awards/bravery_256x256.png", "256x256"]
],
...
}
@@ -99,7 +99,7 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according
"tags": [
["a", "30009:alice:bravery"],
["p", "bob", "wss://relay"],
- ["p", "charlie", "wss://relay"],
+ ["p", "charlie", "wss://relay"]
],
...
}
@@ -117,7 +117,7 @@ Honorable Bob The Brave:
["a", "30009:alice:bravery"],
["e", "<bravery badge award event id>", "wss://nostr.academy"],
["a", "30009:alice:honor"],
- ["e", "<honor badge award event id>", "wss://nostr.academy"],
+ ["e", "<honor badge award event id>", "wss://nostr.academy"]
],
...
}
commit b765b3c0301958d46115b834872bbd0c8bac588c
Author: kuiperanon <
[email protected]>
Date: Tue Apr 9 11:25:05 2024 -0500
Clarify use of ambiguous terminology in spec of bunker token
It's very confusing as to whether it refers to remote user pubkey vs remote signer pubkey. This is complicated further by the typo in the explanation of "remote signer pubkey".
diff --git a/46.md b/46.md
index 8ba65d9..56b8402 100644
--- a/46.md
+++ b/46.md
@@ -25,7 +25,7 @@ This is most common in a situation where you have your own nsecbunker or other t
The remote signer would provide a connection token in the form:
```
-bunker://<remote-pubkey>?relay=<wss://relay-to-connect-on>&relay=<wss://another-relay-to-connect-on>&secret=<optional-secret-value>
+bunker://<remote-user-pubkey>?relay=<wss://relay-to-connect-on>&relay=<wss://another-relay-to-connect-on>&secret=<optional-secret-value>
```
This token is pasted into the client by the user and the client then uses the details to connect to the remote signer via the specified relay(s).
commit b224f6d05d5b208b632e8e1f5ac489b7f27079ae
Author: Matthew Lorentz <
[email protected]>
Date: Wed Apr 3 10:59:37 2024 -0400
Update description of NIP-56
diff --git a/56.md b/56.md
index d6978c2..3209b80 100644
--- a/56.md
+++ b/56.md
@@ -4,10 +4,12 @@ NIP-56
Reporting
---------
-`draft` `optional`
+`optional`
-A report is a `kind 1984` note that is used to report other notes for spam,
-illegal and explicit content.
+A report is a `kind 1984` event that signals to users and relays that
+some referenced content is objectionable. The definition of objectionable is
+obviously subjective and all agents on the network (users, apps, relays, etc.)
+may consume and take action on them as they see fit.
The `content` MAY contain additional information submitted by the entity
reporting the content.
commit d607a288b5db72a84f3d6cc8fd42304d31e1f66b
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 07:59:16 2024 +0000
NIP-34: clarify nip10 thread application
for consistancy and so that the intended order of patches is easier to ascertain
enables additional patches to be appended to a patch set, supporting a PR-like workflow alongside
patch-over-email-like workflow
diff --git a/34.md b/34.md
index 651407d..2a7f489 100644
--- a/34.md
+++ b/34.md
@@ -35,6 +35,10 @@ Except `d`, all tags are optional.
Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
+Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
+
+The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply` to the original root patch.
+
```jsonc
{
"kind": 1617,
commit 3c75180fb7947c133a063ba475067a3b8f42d619
Author: Matthew Lorentz <
[email protected]>
Date: Wed Apr 3 10:50:02 2024 -0400
Add category to reports
diff --git a/56.md b/56.md
index a2861e3..d6978c2 100644
--- a/56.md
+++ b/56.md
@@ -28,6 +28,7 @@ being reported, which consists of the following report types:
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
- `impersonation` - someone pretending to be someone else
+- `other` - for reports that don't fit in the above categories
Some report tags only make sense for profile reports, such as `impersonation`
commit 46ea8dcf9cedd1f64e9444b70ac0ed24e40bbe1a
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 08:03:48 2024 +0000
NIP-34: add repo-id standard
suggested guidance for repo-id
diff --git a/34.md b/34.md
index 2a7f489..7eea92b 100644
--- a/34.md
+++ b/34.md
@@ -17,7 +17,7 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
"kind": 30617,
"content": "",
"tags": [
- ["d", "<repo-id>"],
+ ["d", "<repo-id>"], // usually kebab-case short name
["name", "<human-readable project name>"],
["description", "brief human-readable project description>"],
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
commit eb3a857288fe99d99b73e07dfa28ac548fc10efb
Author: Asai Toshiya <
[email protected]>
Date: Mon Apr 22 12:35:48 2024 +0900
README: add status kinds of NIP-34
diff --git a/README.md b/README.md
index c3c5ef0..5fcdaf7 100644
--- a/README.md
+++ b/README.md
@@ -114,6 +114,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `1617` | Patches | [34](34.md) |
| `1621` | Issues | [34](34.md) |
| `1622` | Replies | [34](34.md) |
+| `1630`-`1633` | Status | [34](34.md) |
| `1971` | Problem Tracker | [nostrocket][nostrocket] |
| `1984` | Reporting | [56](56.md) |
| `1985` | Label | [32](32.md) |
commit 0b62729e318497922822c39471ab31a869563ba5
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 09:20:25 2024 +0000
NIP-34: clarify cover letters
remove cover letters from 'possible things to be added later' and
add a clarification that can they can be added through patches
diff --git a/34.md b/34.md
index fefc7af..c6e7225 100644
--- a/34.md
+++ b/34.md
@@ -69,6 +69,8 @@ The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply`
}
```
+The first patch in a series MAY be a cover letter in the format produced by `git format-patch`.
+
## Issues
Issues are Markdown text that is just human-readable conversational threads related to the repository: bug reports, feature requests, questions or comments of any kind. Like patches, these SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag.
@@ -108,5 +110,4 @@ Replies are also Markdown text. The difference is that they MUST be issued as re
- "status" kind (for letting people know a patch was merged or an issue was fixed or won't be fixed)
- "branch merge" kind (specifying a URL from where to fetch the branch to be merged)
-- "cover letter" kind (to which multiple patches can refer and serve as a unifying layer to them)
- inline file comments kind (we probably need one for patches and a different one for merged files)
commit 8225a018c72c4d11b575ed4e57fa587d08c09027
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 09:01:19 2024 +0000
NIP-34: optional tags to improve discoverability
earliest-unique-commit r tag enables clients to:
- retrieve all repo events refering to a local git repo
- group repo events with different identifers that refer to same repo
- retrieve all patches for a local repo,
irespective of the tagged repo event
current-commit-id r tag enables clients to prevent accidental submission of a patch,
which has already been proposed
root-revision tag enables clients to filter out proposal revisions
from a list of proposals
diff --git a/34.md b/34.md
index bb7e3ee..fefc7af 100644
--- a/34.md
+++ b/34.md
@@ -23,6 +23,8 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
+ ["earliest-unique-commit", "<commit-id>"] // usually root commit but a recent commit for forks
+ ["r", "<earliest-unique-commit-id>"] // so clients can subscribe to all events related to a local git repo
["maintainers", "<other-recognized-maintainer>", ...]
]
}
@@ -46,17 +48,20 @@ The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply`
"content": "<patch>", // contents of <git format-patch>
"tags": [
["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>"],
+ ["r", "<earliest-unique-commit-id-of-repo>"] // so clients can subscribe to all patches sent to a local git repo
["p", "<repository-owner>"],
["p", "<other-user>"], // optionally send the patch to another user to bring it to their attention
- // for the first patch in a thread or series
- ["t", "root"],
+ ["t", "root"], // ommited for additional patches in a series
+ // for the first patch in a revision
+ ["t", "root-revision"],
// optional tags for when it is desirable that the merged patch has a stable commit id
// these fields are necessary for ensuring that the commit resulting from applying a patch
// has the same id as it had in the proposer's machine -- all these tags can be omitted
// if the maintainer doesn't care about these things
["commit", "<current-commit-id>"],
+ ["r", "<current-commit-id>"] // so clients can find existing patches for a specific commit
["parent-commit", "<parent-commit-id>"],
["commit-pgp-sig", "-----BEGIN PGP SIGNATURE-----..."], // empty string for unsigned commit
["committer", "<name>", "<email>", "<timestamp>", "<timezone offset in minutes>"],
commit 403b5199a490b6a148063003e00924f5e79ba36c
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 10:21:06 2024 +0000
NIP-34: add status events
merge-commit and applied-commit-id tags enable discussion of patches to be
mapped to lines of code accepted into the master branch
diff --git a/34.md b/34.md
index c6e7225..f72fcf2 100644
--- a/34.md
+++ b/34.md
@@ -106,8 +106,46 @@ Replies are also Markdown text. The difference is that they MUST be issued as re
}
```
+## Status
+
+Root Patches and Issues have a Status that defaults to 'Open' and can be set by issuing Status events.
+
+```jsonc
+{
+ "kind": 1630, // Open
+ "kind": 1631, // Applied / Merged for Patches; Resolved for Issues
+ "kind": 1632, // Closed
+ "kind": 1633, // Draft
+ "content": "<markdown text>",
+ "tags": [
+ ["e", "<issue-or-original-root-patch-id-hex>", "", "root"],
+ ["e", "<accepted-revision-root-id-hex>", "", "reply"], // for when revisions applied
+ ["p", "<repository-owner>"],
+ ["p", "<root-event-author>"],
+ ["p", "<revision-author>"],
+
+ // optional for improved subscription filter efficency
+ ["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
+ ["r", "<earliest-unique-commit-id-of-repo>"]
+
+ // optional for `1631` status
+ ["e", "<applied-or-merged-patch-event-id>", "", "mention"], // for each
+ // when merged
+ ["merge-commit", "<merge-commit-id>"]
+ ["r", "<merge-commit-id>"]
+ // when applied
+ ["applied-as-commits", "<commit-id-in-master-branch>", ...]
+ ["r", "<applied-commit-id>"] // for each
+ ]
+}
+```
+
+The Status event with the largest created_at date is valid.
+
+The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
+
+
## Possible things to be added later
-- "status" kind (for letting people know a patch was merged or an issue was fixed or won't be fixed)
- "branch merge" kind (specifying a URL from where to fetch the branch to be merged)
- inline file comments kind (we probably need one for patches and a different one for merged files)
commit cb0d35a5f9f1b88a270f7fbbfbdb97e095e28d56
Author: DanConwayDev <
[email protected]>
Date: Thu Mar 7 08:25:49 2024 +0000
NIP-34: optional additional repo maintainers
can be used by clients to tag multiple maintainers in patches
helps clients identify whether multiple repo events for the same repository
are complementary or in competion
diff --git a/34.md b/34.md
index 7eea92b..bb7e3ee 100644
--- a/34.md
+++ b/34.md
@@ -23,11 +23,12 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
+ ["maintainers", "<other-recognized-maintainer>", ...]
]
}
```
-The tags `web`, `clone`, `relays` can have multiple values.
+The tags `web`, `clone`, `relays`, `maintainers` can have multiple values.
Except `d`, all tags are optional.
commit 7dfb11b435a903c703bc38216eca805cefa494d4
Author: fiatjaf <
[email protected]>
Date: Wed Apr 24 17:20:45 2024 -0300
nip17: relay considerations and implementation details.
diff --git a/17.md b/17.md
index cc04a88..0f51367 100644
--- a/17.md
+++ b/17.md
@@ -6,7 +6,7 @@ Private Direct Messages
`draft` `optional`
-This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
+This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
## Direct Message Kind
@@ -18,7 +18,7 @@ Kind `14` is a chat message. `p` tags identify one or more receivers of the mess
"pubkey": "<sender-pubkey>",
"created_at": now(),
"kind": 14,
- "tags": [
+ "tags": [
["p", "<receiver-1-pubkey>", "<relay-url>"],
["p", "<receiver-2-pubkey>", "<relay-url>"],
["e", "<kind-14-id>", "<relay-url>", "reply"] // if this is a reply
@@ -29,19 +29,19 @@ Kind `14` is a chat message. `p` tags identify one or more receivers of the mess
}
```
-`.content` MUST be plain text. Fields `id` and `created_at` are required.
+`.content` MUST be plain text. Fields `id` and `created_at` are required.
-Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
+Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
Kind `14`s MUST never be signed. If it is signed, the message might leak to relays and become **fully public**.
## Chat Rooms
-The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
+The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
-Clients SHOULD render messages of the same room in a continuous thread.
+Clients SHOULD render messages of the same room in a continuous thread.
-An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
+An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
## Encrypting
@@ -51,7 +51,7 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
{
"id": "<usual hash>",
"pubkey": randomPublicKey,
- "created_at": randomTimeUpTo2DaysInThePast(),
+ "created_at": randomTimeUpTo2DaysInThePast(),
"kind": 1059, // gift wrap
"tags": [
["p", receiverPublicKey, "<relay-url>"] // receiver
@@ -60,7 +60,7 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
{
"id": "<usual hash>",
"pubkey": senderPublicKey,
- "created_at": randomTimeUpTo2DaysInThePast(),
+ "created_at": randomTimeUpTo2DaysInThePast(),
"kind": 13, // seal
"tags": [], // no tags
"content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey),
@@ -72,17 +72,17 @@ Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be seale
}
```
-The encryption algorithm MUST use the latest version of [NIP-44](44.md).
+The encryption algorithm MUST use the latest version of [NIP-44](44.md).
Clients MUST verify if pubkey of the `kind:13` is the same pubkey on the `kind:14`, otherwise any sender can impersonate others by simply changing the pubkey on `kind:14`.
-Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
+Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
The gift wrap's `p`-tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity.
Clients CAN offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key
-## Publishing
+## Publishing
Kind `10050` indicates the user's preferred relays to receive DMs. The event MUST include a list of `relay` tags with relay URIs.
@@ -98,16 +98,22 @@ Kind `10050` indicates the user's preferred relays to receive DMs. The event MUS
}
```
-Clients SHOULD publish kind `14` events to the `10050`-listed relays, falling back to `read` relays of [NIP-65](65.md) if `kind:10050` is not available.
+Clients SHOULD publish kind `14` events to the `10050`-listed relays. If that is not found that indicates the user is not ready to receive messages under this NIP and clients shouldn't try.
+
+## Relays
+
+It's advisable that relays do not serve `kind:14` to clients other than the ones tagged in them.
+
+It's advisable that users choose relays that conform to these practices.
-Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
+Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
## Benefits & Limitations
-This NIP offers the following privacy and security features:
+This NIP offers the following privacy and security features:
1. **No Metadata Leak**: Participant identities, each message's real date and time, event kinds, and other event tags are all hidden from the public. Senders and receivers cannot be linked with public information alone.
-2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
+2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
3. **No Moderation**: There are no group admins: no invitations or bans.
4. **No Shared Secrets**: No secret must be known to all members that can leak or be mistakenly shared
5. **Fully Recoverable**: Messages can be fully recoverable by any client with the user's private key
@@ -115,13 +121,17 @@ This NIP offers the following privacy and security features:
7. **Uses Public Relays**: Messages can flow through public relays without loss of privacy. Private relays can increase privacy further, but they are not required.
8. **Cold Storage**: Users can unilaterally opt-in to sharing their messages with a separate key that is exclusive for DM backup and recovery.
-The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
+The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
-----
+## Implementation
+
+Clients implementing this NIP should by default only connect to the set of relays found in their `kind:10050` list. From that they should be able to load all messages both sent and received as well as get new live updates, making it for a very simple and lightweight implementation that should be fast.
+
+When sending a message to anyone, clients must then connect to the relays in the receiver's `kind:10050` and send the events there, but can disconnect right after unless more messages are expected to be sent (e.g. the chat tab is still selected). Clients should also send a copy of their outgoing messages to their own `kind:10050` relay set.
## Examples
-This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
+This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
The two final GiftWraps, one to the receiver and the other to the sender, are:
@@ -138,7 +148,7 @@ The two final GiftWraps, one to the receiver and the other to the sender, are:
"sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480"
}
```
-
+
```json
{
"id":"162b0611a1911cfcb30f8a5502792b346e535a45658b3a31ae5c178465509721",
@@ -151,4 +161,4 @@ The two final GiftWraps, one to the receiver and the other to the sender, are:
"content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ",
"sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab"
}
-```
+```
commit df30012430c88d49fb5b124992b04d5c61b6338b
Author: Vitor Pamplona <
[email protected]>
Date: Wed Apr 24 15:31:45 2024 -0400
NIP-17 (old 24) Sealed Gift-Wrapped Messages for Private DMs and Small Group Chats (#686)
diff --git a/04.md b/04.md
index dc232b4..a561a2f 100644
--- a/04.md
+++ b/04.md
@@ -1,4 +1,4 @@
-> __Warning__ `unrecommended`: deprecated in favor of [NIP-44](44.md)
+> __Warning__ `unrecommended`: deprecated in favor of [NIP-17](17.md)
NIP-04
======
diff --git a/11.md b/11.md
index 45102d7..a50038a 100644
--- a/11.md
+++ b/11.md
@@ -37,7 +37,7 @@ Detailed plain-text information about the relay may be contained in the `descrip
### Pubkey
-An administrative contact may be listed with a `pubkey`, in the same format as Nostr events (32-byte hex for a `secp256k1` public key). If a contact is listed, this provides clients with a recommended address to send encrypted direct messages (See `NIP-04`) to a system administrator. Expected uses of this address are to report abuse or illegal content, file bug reports, or request other technical assistance.
+An administrative contact may be listed with a `pubkey`, in the same format as Nostr events (32-byte hex for a `secp256k1` public key). If a contact is listed, this provides clients with a recommended address to send encrypted direct messages (See [NIP-17](17.md)) to a system administrator. Expected uses of this address are to report abuse or illegal content, file bug reports, or request other technical assistance.
Relay operators have no obligation to respond to direct messages.
diff --git a/17.md b/17.md
new file mode 100644
index 0000000..cc04a88
--- /dev/null
+++ b/17.md
@@ -0,0 +1,154 @@
+NIP-17
+======
+
+Private Direct Messages
+-----------------------
+
+`draft` `optional`
+
+This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps.
+
+## Direct Message Kind
+
+Kind `14` is a chat message. `p` tags identify one or more receivers of the message.
+
+```js
+{
+ "id": "<usual hash>",
+ "pubkey": "<sender-pubkey>",
+ "created_at": now(),
+ "kind": 14,
+ "tags": [
+ ["p", "<receiver-1-pubkey>", "<relay-url>"],
+ ["p", "<receiver-2-pubkey>", "<relay-url>"],
+ ["e", "<kind-14-id>", "<relay-url>", "reply"] // if this is a reply
+ ["subject", "<conversation-title>"],
+ ...
+ ],
+ "content": "<message-in-plain-text>",
+}
+```
+
+`.content` MUST be plain text. Fields `id` and `created_at` are required.
+
+Tags that mention, quote and assemble threading structures MUST follow [NIP-10](10.md).
+
+Kind `14`s MUST never be signed. If it is signed, the message might leak to relays and become **fully public**.
+
+## Chat Rooms
+
+The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
+
+Clients SHOULD render messages of the same room in a continuous thread.
+
+An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation.
+
+## Encrypting
+
+Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually.
+
+```js
+{
+ "id": "<usual hash>",
+ "pubkey": randomPublicKey,
+ "created_at": randomTimeUpTo2DaysInThePast(),
+ "kind": 1059, // gift wrap
+ "tags": [
+ ["p", receiverPublicKey, "<relay-url>"] // receiver
+ ],
+ "content": nip44Encrypt(
+ {
+ "id": "<usual hash>",
+ "pubkey": senderPublicKey,
+ "created_at": randomTimeUpTo2DaysInThePast(),
+ "kind": 13, // seal
+ "tags": [], // no tags
+ "content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey),
+ "sig": "<signed by senderPrivateKey>"
+ },
+ randomPrivateKey, receiverPublicKey
+ ),
+ "sig": "<signed by randomPrivateKey>"
+}
+```
+
+The encryption algorithm MUST use the latest version of [NIP-44](44.md).
+
+Clients MUST verify if pubkey of the `kind:13` is the same pubkey on the `kind:14`, otherwise any sender can impersonate others by simply changing the pubkey on `kind:14`.
+
+Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata.
+
+The gift wrap's `p`-tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity.
+
+Clients CAN offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key
+
+## Publishing
+
+Kind `10050` indicates the user's preferred relays to receive DMs. The event MUST include a list of `relay` tags with relay URIs.
+
+```js
+{
+ "kind": 10050,
+ "tags": [
+ ["relay", "wss://inbox.nostr.wine"],
+ ["relay", "wss://myrelay.nostr1.com"],
+ ],
+ "content": "",
+ //...other fields
+}
+```
+
+Clients SHOULD publish kind `14` events to the `10050`-listed relays, falling back to `read` relays of [NIP-65](65.md) if `kind:10050` is not available.
+
+Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable.
+
+## Benefits & Limitations
+
+This NIP offers the following privacy and security features:
+
+1. **No Metadata Leak**: Participant identities, each message's real date and time, event kinds, and other event tags are all hidden from the public. Senders and receivers cannot be linked with public information alone.
+2. **No Public Group Identifiers**: There is no public central queue, channel or otherwise converging identifier to correlate or count all messages in the same group.
+3. **No Moderation**: There are no group admins: no invitations or bans.
+4. **No Shared Secrets**: No secret must be known to all members that can leak or be mistakenly shared
+5. **Fully Recoverable**: Messages can be fully recoverable by any client with the user's private key
+6. **Optional Forward Secrecy**: Users and clients can opt-in for "disappearing messages".
+7. **Uses Public Relays**: Messages can flow through public relays without loss of privacy. Private relays can increase privacy further, but they are not required.
+8. **Cold Storage**: Users can unilaterally opt-in to sharing their messages with a separate key that is exclusive for DM backup and recovery.
+
+The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme.
+
+----
+
+## Examples
+
+This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`.
+
+The two final GiftWraps, one to the receiver and the other to the sender, are:
+
+```json
+{
+ "id":"2886780f7349afc1344047524540ee716f7bdc1b64191699855662330bf235d8",
+ "pubkey":"8f8a7ec43b77d25799281207e1a47f7a654755055788f7482653f9c9661c6d51",
+ "created_at":1703128320,
+ "kind":1059,
+ "tags":[
+ [ "p", "918e2da906df4ccd12c8ac672d8335add131a4cf9d27ce42b3bb3625755f0788"]
+ ],
+ "content":"AsqzdlMsG304G8h08bE67dhAR1gFTzTckUUyuvndZ8LrGCvwI4pgC3d6hyAK0Wo9gtkLqSr2rT2RyHlE5wRqbCOlQ8WvJEKwqwIJwT5PO3l2RxvGCHDbd1b1o40ZgIVwwLCfOWJ86I5upXe8K5AgpxYTOM1BD+SbgI5jOMA8tgpRoitJedVSvBZsmwAxXM7o7sbOON4MXHzOqOZpALpS2zgBDXSAaYAsTdEM4qqFeik+zTk3+L6NYuftGidqVluicwSGS2viYWr5OiJ1zrj1ERhYSGLpQnPKrqDaDi7R1KrHGFGyLgkJveY/45y0rv9aVIw9IWF11u53cf2CP7akACel2WvZdl1htEwFu/v9cFXD06fNVZjfx3OssKM/uHPE9XvZttQboAvP5UoK6lv9o3d+0GM4/3zP+yO3C0NExz1ZgFmbGFz703YJzM+zpKCOXaZyzPjADXp8qBBeVc5lmJqiCL4solZpxA1865yPigPAZcc9acSUlg23J1dptFK4n3Tl5HfSHP+oZ/QS/SHWbVFCtq7ZMQSRxLgEitfglTNz9P1CnpMwmW/Y4Gm5zdkv0JrdUVrn2UO9ARdHlPsW5ARgDmzaxnJypkfoHXNfxGGXWRk0sKLbz/ipnaQP/eFJv/ibNuSfqL6E4BnN/tHJSHYEaTQ/PdrA2i9laG3vJti3kAl5Ih87ct0w/tzYfp4SRPhEF1zzue9G/16eJEMzwmhQ5Ec7jJVcVGa4RltqnuF8unUu3iSRTQ+/MNNUkK6Mk+YuaJJs6Fjw6tRHuWi57SdKKv7GGkr0zlBUU2Dyo1MwpAqzsCcCTeQSv+8qt4wLf4uhU9Br7F/L0ZY9bFgh6iLDCdB+4iABXyZwT7Ufn762195hrSHcU4Okt0Zns9EeiBOFxnmpXEslYkYBpXw70GmymQfJlFOfoEp93QKCMS2DAEVeI51dJV1e+6t3pCSsQN69Vg6jUCsm1TMxSs2VX4BRbq562+VffchvW2BB4gMjsvHVUSRl8i5/ZSDlfzSPXcSGALLHBRzy+gn0oXXJ/447VHYZJDL3Ig8+QW5oFMgnWYhuwI5QSLEyflUrfSz+Pdwn/5eyjybXKJftePBD9Q+8NQ8zulU5sqvsMeIx/bBUx0fmOXsS3vjqCXW5IjkmSUV7q54GewZqTQBlcx+90xh/LSUxXex7UwZwRnifvyCbZ+zwNTHNb12chYeNjMV7kAIr3cGQv8vlOMM8ajyaZ5KVy7HpSXQjz4PGT2/nXbL5jKt8Lx0erGXsSsazkdoYDG3U",
+ "sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480"
+}
+```
+
+```json
+{
+ "id":"162b0611a1911cfcb30f8a5502792b346e535a45658b3a31ae5c178465509721",
+ "pubkey":"626be2af274b29ea4816ad672ee452b7cf96bbb4836815a55699ae402183f512",
+ "created_at":1702711587,
+ "kind":1059,
+ "tags":[
+ [ "p", "44900586091b284416a0c001f677f9c49f7639a55c3f1e2ec130a8e1a7998e1b"]
+ ],
+ "content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ",
+ "sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab"
+}
+```
diff --git a/README.md b/README.md
index 5fcdaf7..619c984 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-01: Basic protocol flow description](01.md)
- [NIP-02: Follow List](02.md)
- [NIP-03: OpenTimestamps Attestations for Events](03.md)
-- [NIP-04: Encrypted Direct Message](04.md) --- **unrecommended**: deprecated in favor of [NIP-44](44.md)
+- [NIP-04: Encrypted Direct Message](04.md) --- **unrecommended**: deprecated in favor of [NIP-17](17.md)
- [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md)
- [NIP-06: Basic key derivation from mnemonic seed phrase](06.md)
- [NIP-07: `window.nostr` capability for web browsers](07.md)
@@ -36,6 +36,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-13: Proof of Work](13.md)
- [NIP-14: Subject tag in text events](14.md)
- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md)
+- [NIP-17: Private Direct Messages](17.md)
- [NIP-18: Reposts](18.md)
- [NIP-19: bech32-encoded entities](19.md)
- [NIP-21: `nostr:` URI scheme](21.md)
@@ -99,6 +100,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `11` | Group Thread | [29](29.md) |
| `12` | Group Thread Reply | [29](29.md) |
| `13` | Seal | [59](59.md) |
+| `14` | Direct Message | [17](17.md) |
| `16` | Generic Repost | [18](18.md) |
| `40` | Channel Creation | [28](28.md) |
| `41` | Channel Metadata | [28](28.md) |
@@ -138,6 +140,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `10009` | User groups | [51](51.md), [29](29.md) |
| `10015` | Interests list | [51](51.md) |
| `10030` | User emoji list | [51](51.md) |
+| `10050` | Relay list to receive DMs | [17](17.md) |
| `10096` | File storage server list | [96](96.md) |
| `13194` | Wallet Info | [47](47.md) |
| `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] |
@@ -247,10 +250,10 @@ Please update these lists when proposing NIPs introducing new event kinds.
| `price` | price | currency, frequency | [99](99.md) |
| `proxy` | external ID | protocol | [48](48.md) |
| `published_at` | unix timestamp (string) | -- | [23](23.md) |
-| `relay` | relay url | -- | [42](42.md) |
+| `relay` | relay url | -- | [42](42.md), [17](17.md) |
| `relays` | relay list | -- | [57](57.md) |
| `server` | file storage server url | -- | [96](96.md) |
-| `subject` | subject | -- | [14](14.md) |
+| `subject` | subject | -- | [14](14.md), [17](17.md) |
| `summary` | article summary | -- | [23](23.md) |
| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) |
| `title` | article title | -- | [23](23.md) |
commit cab47cf0f179f578bf9d3be0e61a5a2224053f33
Merge: 403b519 eb3a857
Author: Alex Gleason <
[email protected]>
Date: Sun Apr 21 22:37:50 2024 -0500
Merge pull request #1187 from AsaiToshiya/AsaiToshiya-patch-7
README: add status kinds of NIP-34
commit 88246c27414d11983dced414462b2be2d010fad8
Author: Leo Wandersleb <
[email protected]>
Date: Wed Apr 24 12:18:27 2024 -0400
Require tags to have at least one string
fixes #1193
diff --git a/01.md b/01.md
index a91febc..8be85bc 100644
--- a/01.md
+++ b/01.md
@@ -56,7 +56,7 @@ To prevent implementation differences from creating a different event ID for the
### Tags
-Each tag is an array of strings of arbitrary size, with some conventions around them. Take a look at the example below:
+Each tag is an array of one or more strings, with some conventions around them. Take a look at the example below:
```jsonc
{
commit ef5eacd48904a5cee0b4e51c4b7d46a9606a7351
Author: Lucas Nuic <
[email protected]>
Date: Wed May 1 22:48:11 2024 -0300
“decentralized reporting of digital threats such as malware” in nostr
I added new tags for reporting bad things like malware
diff --git a/56.md b/56.md
index 3209b80..190e0b4 100644
--- a/56.md
+++ b/56.md
@@ -26,6 +26,7 @@ A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
+- `malware` - depictions of malware, virus, Trojan Horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
- `profanity` - profanity, hateful speech, etc.
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
commit 243b2865826edff22eebe5ec6e893c711802c7e5
Author: fiatjaf <
[email protected]>
Date: Thu Apr 25 18:03:38 2024 -0300
nip46: signer should fill in pubkey, id and sig on sign_event.
diff --git a/46.md b/46.md
index d4b5728..e0a5b2e 100644
--- a/46.md
+++ b/46.md
@@ -61,8 +61,9 @@ nostrconnect://<local-keypair-pubkey>?relay=<wss://relay-to-connect-on>&metadata
"method": "sign_event",
"params": [json_stringified(<{
content: "Hello, I'm signing remotely",
- pubkey: "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52",
- // ...the rest of the event data
+ kind: 1,
+ tags: [],
+ created_at: 1714078911
}>)]
}),
"tags": [["p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52"]], // p-tags the remote user pubkey
@@ -118,21 +119,21 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](https://github.c
Each of the following are methods that the client sends to the remote signer.
-| Command | Params | Result |
-| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
-| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
-| `sign_event` | `[<json_stringified_event_to_sign>]` | `json_stringified(<signed_event>)` |
-| `ping` | `[]` | "pong" |
-| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
-| `get_public_key` | `[]` | `<hex-pubkey>` |
-| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
-| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
-| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
-| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
+| Command | Params | Result |
+| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
+| `connect` | `[<remote_user_pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
+| `sign_event` | `[<{kind, content, tags, created_at}>]` | `json_stringified(<signed_event>)` |
+| `ping` | `[]` | "pong" |
+| `get_relays` | `[]` | `json_stringified({<relay_url>: {read: <boolean>, write: <boolean>}})` |
+| `get_public_key` | `[]` | `<hex-pubkey>` |
+| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
+| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
+| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
+| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
### Requested permissions
-The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
+The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later.
## Response Events `kind:24133`
commit bad8826211ca2eb8660e4bd68b292d14616d3669
Author: fiatjaf <
[email protected]>
Date: Wed Apr 24 18:44:36 2024 -0300
nip34: simplify `r` tag for earliest unique commit.
diff --git a/34.md b/34.md
index f72fcf2..03ee039 100644
--- a/34.md
+++ b/34.md
@@ -23,8 +23,7 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
["web", "<url for browsing>", ...], // a webpage url, if the git server being used provides such a thing
["clone", "<url for git-cloning>", ...], // a url to be given to `git clone` so anyone can clone it
["relays", "<relay-url>", ...] // relays that this repository will monitor for patches and issues
- ["earliest-unique-commit", "<commit-id>"] // usually root commit but a recent commit for forks
- ["r", "<earliest-unique-commit-id>"] // so clients can subscribe to all events related to a local git repo
+ ["r", "<earliest-unique-commit-id>", "euc"]
["maintainers", "<other-recognized-maintainer>", ...]
]
}
@@ -32,13 +31,15 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a
The tags `web`, `clone`, `relays`, `maintainers` can have multiple values.
+The `r` tag annotated with the `"euc"` marker should be the commit ID of the earliest unique commit of this repo, made to identify it among forks and group it with other repositories hosted elsewhere that may represent essentially the same project. In most cases it will be the root commit of a repository. In case of a permanent fork between two projects, then the first commit after the fork should be used.
+
Except `d`, all tags are optional.
## Patches
Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
-Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
+Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply` to the original root patch.
@@ -132,7 +133,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
["e", "<applied-or-merged-patch-event-id>", "", "mention"], // for each
// when merged
["merge-commit", "<merge-commit-id>"]
- ["r", "<merge-commit-id>"]
+ ["r", "<merge-commit-id>"]
// when applied
["applied-as-commits", "<commit-id-in-master-branch>", ...]
["r", "<applied-commit-id>"] // for each
@@ -142,7 +143,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
The Status event with the largest created_at date is valid.
-The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
+The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
## Possible things to be added later
commit 6071f3489eabe50eea748a2585a73c02a23d96cf
Author: Alex Gleason <
[email protected]>
Date: Thu Apr 25 06:38:36 2024 -0500
NIP-46: "error" property of response is optional (#1195)
* NIP-46: clarify "error" property of response
* NIP-46: It's -> Its
* optionally
Co-authored-by: Asai Toshiya <
[email protected]>
---------
Co-authored-by: fiatjaf_ <
[email protected]>
Co-authored-by: Asai Toshiya <
[email protected]>
diff --git a/46.md b/46.md
index 56b8402..d4b5728 100644
--- a/46.md
+++ b/46.md
@@ -153,13 +153,13 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](https://github.c
{
"id": <request_id>,
"result": <results_string>,
- "error": <error_string>
+ "error": <optional_error_string>
}
```
- `id` is the request ID that this response is for.
- `results` is a string of the result of the call (this can be either a string or a JSON stringified object)
-- `error` is an error in string form.
+- `error`, _optionally_, it is an error in string form, if any. Its presence indicates an error with the request.
### Auth Challenges
commit 218fbb1cc7ac900fd256f666cb6add590cabb24a
Author: fiatjaf_ <
[email protected]>
Date: Thu May 2 11:04:55 2024 -0300
NIP-54: decentralized wikis (#787)
* draft of NIP-34: decentralized wikis.
* add merge requests.
* add merge request flow
* update nip number
---------
Co-authored-by: Pablo Fernandez <
[email protected]>
diff --git a/51.md b/51.md
index 95acbc8..fb40b26 100644
--- a/51.md
+++ b/51.md
@@ -20,18 +20,20 @@ Standard lists use non-parameterized replaceable events, meaning users may only
For example, _mute list_ can contain the public keys of spammers and bad actors users don't want to see in their feeds or receive annoying notifications from.
-| name | kind | description | expected tag items |
-| --- | --- | --- | --- |
-| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
-| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
-| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
-| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
-| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
-| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
-| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
-| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group ids + mandatory relay URL) |
-| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
-| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
+| name | kind | description | expected tag items |
+| --- | --- | --- | --- |
+| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
+| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
+| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
+| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
+| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
+| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
+| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
+| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group ids + mandatory relay URL) |
+| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
+| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
+| Good wiki authors | 10101 | [NIP-54](54.md) user recommended wiki authors | `"p"` (pubkeys) |
+| Good wiki relays | 10102 | [NIP-54](54.md) relays deemed to only host useful articles | `"relay"` (relay URLs) |
## Sets
diff --git a/54.md b/54.md
new file mode 100644
index 0000000..9063ca9
--- /dev/null
+++ b/54.md
@@ -0,0 +1,106 @@
+NIP-54
+======
+
+Wiki
+----
+`draft` `optional`
+
+This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
+
+Articles are identified by lowercase, normalized ascii `d` tags.
+
+### Articles
+```js
+{
+ "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
+ "tags": [
+ [ "d", "wiki" ],
+ [ "title", "Wiki" ],
+ ]
+}
+```
+
+[INSERT NORMALIZATION EXAMPLES]
+
+The content should be Markdown, following the same rules as of [NIP-23](23.md), although it takes some extra (optional) metadata tags:
+
+ - `title`: for when the display title should be different from the `d` tag.
+ - `summary`: for display in lists.
+ - `a` and `e`: for referencing the original event a wiki article was forked from.
+
+One extra functionality is added: **wikilinks**. Unlike normal Markdown links `[]()` that link to webpages, wikilinks `[[]]` link to other articles in the wiki. In this case, the wiki is the entirety of Nostr. Clicking on a wikilink should cause the client to ask relays for events with `d` tags equal to the target of that wikilink.
+
+### Merge Requests
+
+Event `kind:818` represents a request to merge from a forked article into the source. It is directed to a pubkey and references the original article and the modified event.
+
+[INSERT EVENT EXAMPLE]
+
+### Redirects
+
+Event `kind:30819` is also defined to stand for "wiki redirects", i.e. if one thinks `Shell structure` should redirect to `Thin-shell structure` they can issue one of these events instead of replicating the content. These events can be used for automatically redirecting between articles on a client, but also for generating crowdsourced "disambiguation" pages ([common in Wikipedia](https://en.wikipedia.org/wiki/Help:Disambiguation)).
+
+[INSERT EVENT EXAMPLE]
+
+How to decide what article to display
+-------------------------------------
+
+As there could be many articles for each given name, some kind of prioritization must be done by clients. Criteria for this should vary between users and clients, but some means that can be used are described below:
+
+### Reactions
+
+[NIP-25](25.md) reactions are very simple and can be used to create a simple web-of-trust between wiki article writers and their content. While just counting a raw number of "likes" is unproductive, reacting to any wiki article event with a `+` can be interpreted as a recommendation for that article specifically and a partial recommendation of the author of that article. When 2 or 3-level deep recommendations are followed, suddenly a big part of all the articles may have some form of tagging.
+
+### Relays
+
+[NIP-51](51.md) lists of relays can be created with the kind 10102 and then used by wiki clients in order to determine where to query articles first and to rank these differently in relation to other events fetched from other relays.
+
+### Contact lists
+
+[NIP-02](02.md) contact lists can form the basis of a recommendation system that is then expanded with relay lists and reaction lists through nested queries. These lists form a good starting point only because they are so widespread.
+
+### Wiki-related contact lists
+
+[NIP-51](51.md) lists can also be used to create a list of users that are trusted only in the context of wiki authorship or wiki curationship.
+
+Forks
+---------
+Wiki-events can tag other wiki-events with a `fork` marker to specify that this event came from a different version. Both `a` and `e` tags SHOULD be used and have the `fork` marker applied, to identify the exact version it was forked from.
+
+Deference
+---------
+Wiki-events can tag other wiki-events with a `defer` marker to indicate that it considers someone else's entry as a "better" version of itself. If using a `defer` marker both `a` and `e` tags SHOULD be used.
+
+This is a stronger signal of trust than a `+` reaction.
+
+This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an indepedent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
+
+Why Markdown?
+-------------
+
+If the idea is to make a wiki then the most obvious text format to use is probably the mediawiki/wikitext format used by Wikipedia since it's widely deployed in all mediawiki installations and used for decades with great success. However, it turns out that format is very bloated and convoluted, has way too many features and probably because of that it doesn't have many alternative implementations out there, and the ones that exist are not complete and don't look very trustworthy. Also it is very much a centralized format that can probably be changed at the whims of the Wikipedia owners.
+
+On the other hand, Markdown has proven to work well for small scale wikis and one of the biggest wikis in the planet (which is not very often thought of as a wiki), [StackOverflow](https://stackoverflow.com) and its child sites, and also one of the biggest "personal wiki" software, [Obsidian](https://obsidian.md/). Markdown can probably deliver 95% of the functionality of wikitext. When augmented with tables, diagram generators and MathJax (which are common extensions that exist in the wild and can be included in this NIP) that rate probably goes to 99%, and its simplicity is a huge benefit that can't be overlooked. Wikitext format can also be transpíled into Markdown using Pandoc. Given all that, I think it's a reasonable suspicion that mediawiki is not inherently better than Markdown, the success of Wikipedia probably cannot be predicated on the syntax language choice.
+
+# Appendix 1: Merge requests
+Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
+
+```js
+{
+ "content": "I added information about how to make hot ice-creams",
+ "kind": 818,
+ "tags": [
+ [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
+ [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
+ [ "p", "<destination-pubkey>" ],
+ [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
+ ]
+}
+```
+
+`.content`: an optional explanation detailing why this merge is being requested.
+`a` tag: tag of the article which should be modified (i.e. the target of this merge request).
+`e` tag: optional version of the article in which this modifications is based
+`e` tag with `source` marker: the ID of the event that should be merged. This event id MUST be of a `kind:30818` as defined in this NIP.
+
+The destination-pubkey (the pubkey being requested to merge something into their article can create [[NIP-25]] reactions that tag the `kind:818` event with `+` or `-`
diff --git a/README.md b/README.md
index 619c984..b3736ea 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-51: Lists](51.md)
- [NIP-52: Calendar Events](52.md)
- [NIP-53: Live Activities](53.md)
+- [NIP-54: Wiki](54.md)
- [NIP-56: Reporting](56.md)
- [NIP-57: Lightning Zaps](57.md)
- [NIP-58: Badges](58.md)
@@ -171,6 +172,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `30402` | Classified Listing | [99](99.md) |
| `30403` | Draft Classified Listing | [99](99.md) |
| `30617` | Repository announcements | [34](34.md) |
+| `30818` | Wiki article | [54](54.md) |
| `31922` | Date-Based Calendar Event | [52](52.md) |
| `31923` | Time-Based Calendar Event | [52](52.md) |
| `31924` | Calendar | [52](52.md) |
commit dcb5d0f18d6b0c60bda9abc79c6cca99a4d86177
Author: fiatjaf <
[email protected]>
Date: Thu May 2 11:32:58 2024 -0300
small fixes on nip 54.
diff --git a/54.md b/54.md
index 9063ca9..7870330 100644
--- a/54.md
+++ b/54.md
@@ -3,6 +3,7 @@ NIP-54
Wiki
----
+
`draft` `optional`
This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
@@ -10,7 +11,7 @@ This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-for
Articles are identified by lowercase, normalized ascii `d` tags.
### Articles
-```js
+```jsonc
{
"content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
"tags": [
@@ -85,7 +86,7 @@ On the other hand, Markdown has proven to work well for small scale wikis and on
# Appendix 1: Merge requests
Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
-```js
+```jsonc
{
"content": "I added information about how to make hot ice-creams",
"kind": 818,
commit 2b490b168e4b51e1c441d985ca89e5e1f426a610
Author: Lucas Nuic <
[email protected]>
Date: Wed May 1 23:29:14 2024 -0300
fixed typo
diff --git a/56.md b/56.md
index 190e0b4..fc8d898 100644
--- a/56.md
+++ b/56.md
@@ -26,7 +26,7 @@ A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
-- `malware` - depictions of malware, virus, Trojan Horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
+- `malware` - virus, trojan horse, worm, robot, spyware, adware, back door, ransomware, rootkit, kidnapper, etc.
- `profanity` - profanity, hateful speech, etc.
- `illegal` - something which may be illegal in some jurisdiction
- `spam` - spam
commit f393df80361da9226be131f0e91970268bb6be2d
Merge: dcb5d0f 2b490b1
Author: Alex Gleason <
[email protected]>
Date: Sat May 4 19:43:51 2024 -0500
Merge pull request #1213 from lucasnuic/reporting-digital-threats-as-malware
NIP-56 to reporting of digital threats
commit 4bcf91944a9e53680cc928424e7af145242b1a39
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 4 16:35:39 2024 -0400
adds a tags.
diff --git a/25.md b/25.md
index bdee066..7cc96b5 100644
--- a/25.md
+++ b/25.md
@@ -25,12 +25,15 @@ consider it a "+".
Tags
----
-The reaction event SHOULD include `e` and `p` tags pointing to the note the user is
+The reaction event SHOULD include `a`, `e` and `p` tags pointing to the note the user is
reacting to. The `p` tag allows authors to be notified. The `e` tags enables clients
-to pull all the reactions to individual posts.
+to pull all the reactions to individual events and `a` tags enables clients to seek reactions
+for all versions of a replaceable event.
The `e` tag MUST be the `id` of the note that is being reacted to.
+The `a` tag MUST contain the coordinates (`kind:pubkey:d-tag`) of the replaceable being reacted to.
+
The `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
commit 3834c6b60474a677b53847743212df27710e64ec
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 4 16:10:13 2024 -0400
Simplifying reactions
diff --git a/25.md b/25.md
index 3b4aa59..bdee066 100644
--- a/25.md
+++ b/25.md
@@ -25,14 +25,13 @@ consider it a "+".
Tags
----
-The reaction event SHOULD include `e` and `p` tags from the note the user is
-reacting to. This allows users to be notified of reactions to posts they were
-mentioned in. Including the `e` tags enables clients to pull all the reactions
-associated with individual posts or all the posts in a thread.
+The reaction event SHOULD include `e` and `p` tags pointing to the note the user is
+reacting to. The `p` tag allows authors to be notified. The `e` tags enables clients
+to pull all the reactions to individual posts.
-The last `e` tag MUST be the `id` of the note that is being reacted to.
+The `e` tag MUST be the `id` of the note that is being reacted to.
-The last `p` tag MUST be the `pubkey` of the event being reacted to.
+The `p` tag MUST be the `pubkey` of the event being reacted to.
The reaction event MAY include a `k` tag with the stringified kind number
of the reacted event as its value.
@@ -41,9 +40,6 @@ Example code
```swift
func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> NostrEvent {
- var tags: [[String]] = liked.tags.filter {
- tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p")
- }
tags.append(["e", liked.id])
tags.append(["p", liked.pubkey])
tags.append(["k", liked.kind])
commit 69e14f1dca1e7ae439072d157b62ad3462086116
Merge: 8073c84 cb9bddb
Author: Vitor Pamplona <
[email protected]>
Date: Sat May 11 13:19:29 2024 -0400
Merge pull request #1230 from adamdecaf/misc-spelling-fixes
all: minor spelling fixes
commit cb9bddb8dfd11972286215d9bdee7434764ccf7b
Author: Adam Shannon <
[email protected]>
Date: Sat May 11 11:52:32 2024 -0500
all: minor spelling fixes
diff --git a/34.md b/34.md
index 03ee039..fcc2cec 100644
--- a/34.md
+++ b/34.md
@@ -125,7 +125,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
["p", "<root-event-author>"],
["p", "<revision-author>"],
- // optional for improved subscription filter efficency
+ // optional for improved subscription filter efficiency
["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
["r", "<earliest-unique-commit-id-of-repo>"]
diff --git a/46.md b/46.md
index e0a5b2e..1528116 100644
--- a/46.md
+++ b/46.md
@@ -208,7 +208,7 @@ When the user types a NIP-05 the client:
#### Remote signer discovery via NIP-89
-In this last case, most often used to fascilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events.
+In this last case, most often used to facilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events.
First the client will query for `kind: 31990` events that have a `k` tag of `24133`.
diff --git a/54.md b/54.md
index 2090182..8823af9 100644
--- a/54.md
+++ b/54.md
@@ -79,7 +79,7 @@ Wiki-events can tag other wiki-events with a `defer` marker to indicate that it
This is a stronger signal of trust than a `+` reaction.
-This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an indepedent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
+This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an independent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
Why Markdown?
-------------
diff --git a/72.md b/72.md
index 4bafce0..5a8be0a 100644
--- a/72.md
+++ b/72.md
@@ -76,7 +76,7 @@ The post-approval event MUST include `a` tags of the communities the moderator i
It's recommended that multiple moderators approve posts to avoid deleting them from the community when a moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign new approvals for posts in the past or the community will restart. The owner can also periodically copy and re-sign of each moderator's approval events to make sure posts don't disappear with moderators.
-Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the repleceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
+Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the replaceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
Clients SHOULD evaluate any non-`34550:*` `a` tag as posts to be included in all `34550:*` `a` tags.
diff --git a/90.md b/90.md
index 241eb38..2b499a8 100644
--- a/90.md
+++ b/90.md
@@ -199,7 +199,7 @@ Some service providers might choose to submit a `payment-required` as the first
It's not up to this NIP to define how individual vending machines should choose to run their business.
# Cancellation
-A job request might be cancelled by publishing a `kind:5` delete request event tagging the job request event.
+A job request might be canceled by publishing a `kind:5` delete request event tagging the job request event.
# Appendix 1: Job chaining
A Customer MAY request multiple jobs to be processed as a chain, where the output of a job is the input of another job. (e.g. podcast transcription -> summarization of the transcription). This is done by specifying as input an event id of a different job with the `job` type.
commit 8073c848a33007c6e03d1de4d4fd17d46c2a0242
Merge: 4fa65b8 4bcf919
Author: hodlbod <
[email protected]>
Date: Mon May 6 08:28:36 2024 -0700
Merge pull request #1221 from vitorpamplona/fix-reactions
Changes reactions to not include the entire thread as e-tags.
commit 4fa65b81cede9eaf8375d4f92bc80cf298190e0c
Author: fiatjaf <
[email protected]>
Date: Sat May 4 23:36:48 2024 -0300
nip54: fix json indentation.
diff --git a/54.md b/54.md
index c481eb6..2090182 100644
--- a/54.md
+++ b/54.md
@@ -13,11 +13,11 @@ Articles are identified by lowercase, normalized ascii `d` tags.
### Articles
```jsonc
{
- "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
- "tags": [
- [ "d", "wiki" ],
- [ "title", "Wiki" ],
- ]
+ "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
+ "tags": [
+ ["d", "wiki"],
+ ["title", "Wiki"],
+ ]
}
```
@@ -93,14 +93,14 @@ Users can request other users to get their entries merged into someone else's en
```jsonc
{
- "content": "I added information about how to make hot ice-creams",
- "kind": 818,
- "tags": [
- [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
- [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
- [ "p", "<destination-pubkey>" ],
- [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
- ]
+ "content": "I added information about how to make hot ice-creams",
+ "kind": 818,
+ "tags": [
+ [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
+ [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>' ],
+ [ "p", "<destination-pubkey>" ],
+ [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
+ ]
}
```
commit c1360c4f0b111143747bad6226df6f00499f5cfe
Author: fiatjaf <
[email protected]>
Date: Sat May 4 23:34:37 2024 -0300
nip54: add normalization rules.
diff --git a/54.md b/54.md
index 7870330..c481eb6 100644
--- a/54.md
+++ b/54.md
@@ -21,7 +21,12 @@ Articles are identified by lowercase, normalized ascii `d` tags.
}
```
-[INSERT NORMALIZATION EXAMPLES]
+### `d` tag normalization rules
+
+- Any non-letter character MUST be converted to a `-`.
+- All letters MUST be converted to lowercase.
+
+### Content rules
The content should be Markdown, following the same rules as of [NIP-23](23.md), although it takes some extra (optional) metadata tags:
commit 0acdf57ab18ef4143fc6ca8dc800adf1437bf95e
Merge: 69e14f1 c2d9b40
Author: hodlbod <
[email protected]>
Date: Sat May 11 11:36:22 2024 -0700
Merge pull request #1231 from adamdecaf/nip-90-link-fixes
nip90: fix links
commit 9f13e76f022317a915386c1053dc8bac0a1a0dd3
Author: Asai Toshiya <
[email protected]>
Date: Mon May 13 21:11:30 2024 +0900
BREAKING.md: add NIP-34 change
diff --git a/BREAKING.md b/BREAKING.md
index 8024814..b59bc8b 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -5,6 +5,7 @@ reverse chronological order.
| Date | Commit | NIP | Change |
| ----------- | --------- | -------- | ------ |
+| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
commit c2d9b40d5bcf2d04cd04c19b42065e5158ecbab8
Author: Adam Shannon <
[email protected]>
Date: Sat May 11 12:38:01 2024 -0500
nip90: fix links
diff --git a/90.md b/90.md
index 2b499a8..5a15ebb 100644
--- a/90.md
+++ b/90.md
@@ -162,8 +162,8 @@ Service providers can give feedback about a job back to the customer.
```
* `content`: Either empty or a job-result (e.g. for partial-result samples)
-* `amount` tag: as defined in the [Job Result](#job-result) section.
-* `status` tag: Service Providers SHOULD indicate what this feedback status refers to. [Appendix 1](#appendix-1-job-feedback-status) defines status. Extra human-readable information can be added as an extra argument.
+* `amount` tag: as defined in the [Job Result](#job-result-kind6000-6999) section.
+* `status` tag: Service Providers SHOULD indicate what this feedback status refers to. [Job Feedback Status](#job-feedback-status) defines status. Extra human-readable information can be added as an extra argument.
* NOTE: If the input params requires input to be encrypted, then `content` field will have encrypted payload with `p` tag as key.
@@ -177,7 +177,7 @@ Service providers can give feedback about a job back to the customer.
| `success` | Service Provider successfully processed the job. |
| `partial` | Service Provider partially processed the job. The `.content` might include a sample of the partial results. |
-Any job feedback event MIGHT include results in the `.content` field, as described in the [Job Result](#job-result) section. This is useful for service providers to provide a sample of the results that have been processed so far.
+Any job feedback event MIGHT include results in the `.content` field, as described in the [Job Result](#job-result-kind6000-6999) section. This is useful for service providers to provide a sample of the results that have been processed so far.
# Protocol Flow
commit a02c3621a956355c1e44640891d6316a1567463f
Merge: 0acdf57 9f13e76
Author: hodlbod <
[email protected]>
Date: Mon May 13 05:55:51 2024 -0700
Merge pull request #1235 from AsaiToshiya/AsaiToshiya-patch-8
BREAKING.md: add NIP-34 change
commit 1da44a5b712363da6ed2aa149f498da08d087782
Author: Terry Yiu <
[email protected]>
Date: Fri May 17 08:13:02 2024 -0400
Add missing comma in the example gift wrap JSON for NIP-59
diff --git a/59.md b/59.md
index 7eff2b8..4dc857f 100644
--- a/59.md
+++ b/59.md
@@ -155,7 +155,7 @@ Sign the `gift wrap` using the random key generated in the previous step.
"created_at": 1703021488,
"pubkey": "18b1a75918f1f2c90c23da616bce317d36e348bcf5f7ba55e75949319210c87c",
"id": "5c005f3ccf01950aa8d131203248544fb1e41a0d698e846bd419cec3890903ac",
- "sig": "35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df750097b04f9e13053764251b8bc5dd7e8e0794a3426a90b6bcc7e5ff660f54259"
+ "sig": "35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df750097b04f9e13053764251b8bc5dd7e8e0794a3426a90b6bcc7e5ff660f54259",
"tags": [["p", "166bf3765ebd1fc55decfe395beff2ea3b2a4e0a8946e7eb578512b555737c99"]],
}
```
commit caee48316f811f928d92c44892ea173d990b2ebc
Author: Asai Toshiya <
[email protected]>
Date: Fri May 17 19:45:27 2024 +0900
NIP-24: clarify meaning of "event" for title
diff --git a/24.md b/24.md
index 449101a..b21f48e 100644
--- a/24.md
+++ b/24.md
@@ -40,4 +40,4 @@ tags
These tags may be present in multiple event kinds. Whenever a different meaning is not specified by some more specific NIP, they have the following meanings:
- `r`: a web URL the event is referring to in some way
- - `title`: title of the event
+ - `title`: name of [NIP-51](51.md) sets, [NIP-52](52.md) calendar event, [NIP-53](53.md) live event or [NIP-99](99.md) listing
commit 734f379a2a2f225f76f87cdcf074c997a0d40d35
Author: Jon Staab <
[email protected]>
Date: Tue Apr 23 11:34:17 2024 -0700
Add ontolo to nip 32
diff --git a/32.md b/32.md
index be4e872..92497a6 100644
--- a/32.md
+++ b/32.md
@@ -151,3 +151,11 @@ A good heuristic for whether a use case fits this NIP is whether labels would ev
For example, many events might be labeled with a particular place, topic, or pubkey, but labels
with specific values like "John Doe" or "3.18743" are not labels, they are values, and should
be handled in some other way.
+
+
+Appendix: Known Ontologies
+-------------------------
+
+Below is a non-exhaustive list of ontologies currently in widespread use.
+
+- (social.ontolo.categories)[https://ontolo.social/]
commit b1f771302a6a1a94c888b619e08a9c302df85fc2
Author: Sam Samskies <
[email protected]>
Date: Sat May 11 14:58:40 2024 -0500
fix NWC connection string example
diff --git a/47.md b/47.md
index 9033847..0f93b20 100644
--- a/47.md
+++ b/47.md
@@ -95,7 +95,7 @@ The **client** should then store this connection and use it when the user wants
### Example connection string
```sh
-nostr+walletconnect:b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c
+nostr+walletconnect://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c
```
## Commands
commit 38ee6511dc3ac9fb1b5b91920963844e2a9a0ada
Author: Asai Toshiya <
[email protected]>
Date: Tue May 14 01:17:46 2024 +0900
BREAKING.md: fix date
diff --git a/BREAKING.md b/BREAKING.md
index b59bc8b..7b48ee0 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -7,7 +7,7 @@ reverse chronological order.
| ----------- | --------- | -------- | ------ |
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [NIP-18](18.md) | quote repost should use `q` tag |
-| 2024-02-10 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
+| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed |
commit 7c3fd43736a938482e7241cc17666a0dba9c4681
Merge: 734f379 1da44a5
Author: Asai Toshiya <
[email protected]>
Date: Fri May 17 21:19:33 2024 +0900
Merge pull request #1240 from tyiu/tyiu/missing-comma-nip-59
Add missing comma in the example gift wrap JSON for NIP-59
commit ea115396fff0ac3db30a16d7f4920e209aabed41
Author: randymcmillan <
[email protected]>
Date: Thu May 16 16:31:43 2024 -0400
display markdown:initial config
diff --git a/Cargo.toml b/Cargo.toml
index 56695eb..f461a40 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,4 +16,6 @@ authors.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+comrak = "0.23.0"
include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
+markdown2html-converter = "1.1.12"
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..99acb95
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1 @@
+-include cargo.mk
diff --git a/cargo.mk b/cargo.mk
new file mode 120000
index 0000000..09daa8d
--- /dev/null
+++ b/cargo.mk
@@ -0,0 +1 @@
+../cargo.mk
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index add5545..146ddba 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,13 +1,53 @@
-use std::path::Path;
use include_dir::{include_dir, Dir};
+use std::path::Path;
+extern crate comrak;
+use comrak::nodes::NodeValue;
+use comrak::{format_html, parse_document, Arena, Options};
+
+static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
+
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
+
+fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String {
+ // The returned nodes are created in the supplied Arena, and are bound by its lifetime.
+ let arena = Arena::new();
+
+ // Parse the document into a root `AstNode`
+ let root = parse_document(&arena, document, &Options::default());
+
+ // Iterate over all the descendants of root.
+ for node in root.descendants() {
+ if let NodeValue::Text(ref mut text) = node.data.borrow_mut().value {
+ // If the node is a text node, perform the string replacement.
+ *text = text.replace(orig_string, replacement)
+ }
+ }
+
+ let mut html = vec![];
+ format_html(root, &Options::default(), &mut html).unwrap();
+
+ String::from_utf8(html).unwrap()
+}
+
fn main() {
+
+ // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my* input.\n";
+ // let orig = "my";
+ // let repl = "your";
+ // let html = replace_text(&doc, &orig, &repl);
+ // println!("{}", html);
+
print_entries();
}
-//#[cfg(feature = "glob")]
+
fn print_entries() -> () {
let glob = "**/*.md";
for entry in PROJECT_DIR.find(glob).unwrap() {
+
println!("Found {}", entry.path().display());
+
+ let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ let readme = README_MD.contents_utf8().unwrap();
+ println!("readme={}", readme);
}
}
commit 2b17a5407e0eb614edb62704e214ae13aecec386
Author: randymcmillan <
[email protected]>
Date: Thu May 16 09:24:37 2024 -0400
Cargo.toml:src/main.rs:add include_dir
diff --git a/Cargo.toml b/Cargo.toml
index d4d1799..56695eb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,3 +16,4 @@ authors.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..add5545 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,13 @@
+use std::path::Path;
+use include_dir::{include_dir, Dir};
+static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
fn main() {
- println!("Hello, world!");
+ print_entries();
+}
+//#[cfg(feature = "glob")]
+fn print_entries() -> () {
+ let glob = "**/*.md";
+ for entry in PROJECT_DIR.find(glob).unwrap() {
+ println!("Found {}", entry.path().display());
+ }
}
commit 0628ec171c99aac7ccece43e64a0d32c15fb54d0
Author: randymcmillan <
[email protected]>
Date: Wed May 15 22:10:43 2024 -0400
cargo:init
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..d4d1799
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "nips"
+version.workspace = true
+license.workspace = true
+rust-version.workspace = true
+edition.workspace = true
+readme.workspace = true
+homepage.workspace = true
+repository.workspace = true
+documentation.workspace = true
+categories.workspace = true
+keywords.workspace = true
+description.workspace = true
+authors.workspace = true
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
commit a59ce8970ae8fb9c05bcd9e716e95187e9db6c17
Author: Braydon Fuller <
[email protected]>
Date: Fri May 17 12:02:21 2024 -0700
Fix connection string protocol description. (#1243)
* Fix connection string protocol description.
* Update `nostr+walletconnect` reference.
diff --git a/47.md b/47.md
index 0f93b20..983d2c9 100644
--- a/47.md
+++ b/47.md
@@ -81,7 +81,7 @@ If the command was successful, the `error` field must be null.
## Nostr Wallet Connect URI
**client** discovers **wallet service** by scanning a QR code, handling a deeplink or pasting in a URI.
-The **wallet service** generates this connection URI with protocol `nostr+walletconnect:` and base path it's hex-encoded `pubkey` with the following query string parameters:
+The **wallet service** generates this connection URI with protocol `nostr+walletconnect://` and base path it's hex-encoded `pubkey` with the following query string parameters:
- `relay` Required. URL of the relay where the **wallet service** is connected and will be listening for events. May be more than one.
- `secret` Required. 32-byte randomly generated hex encoded string. The **client** MUST use this to sign events and encrypt payloads when communicating with the **wallet service**.
@@ -402,7 +402,7 @@ Response:
## Example pay invoice flow
-0. The user scans the QR code generated by the **wallet service** with their **client** application, they follow a `nostr+walletconnect:` deeplink or configure the connection details manually.
+0. The user scans the QR code generated by the **wallet service** with their **client** application, they follow a `nostr+walletconnect://` deeplink or configure the connection details manually.
1. **client** sends an event to the **wallet service** with kind `23194`. The content is a `pay_invoice` request. The private key is the secret from the connection string above.
2. **wallet service** verifies that the author's key is authorized to perform the payment, decrypts the payload and sends the payment.
3. **wallet service** responds to the event by sending an event with kind `23195` and content being a response either containing an error message or a preimage.
commit bff2e9a28adcb5a6935157441825ca4fe1329a25
Merge: 7c3fd43 caee483
Author: hodlbod <
[email protected]>
Date: Fri May 17 08:00:20 2024 -0700
Merge pull request #1239 from AsaiToshiya/AsaiToshiya-patch-9
NIP-24: clarify meaning of "event" for title
commit bd57127acf808ba4b5c4bc0c7415ab63f4aa85de
Author: randymcmillan <
[email protected]>
Date: Fri May 17 12:19:42 2024 -0400
src/main.rs:intermediate:traverse docs
diff --git a/src/main.rs b/src/main.rs
index 002e7bc..f6a5105 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -56,28 +56,40 @@ fn print_entries<const BOUND: u8>() -> () {
let content = md_content.contents_utf8().unwrap();
println!("\n{}", content);
}
- let (a, b) = nip_vec.split_at(1);
- println!("a={:}", format!("{:?}",a[0]));
- let mut readme = PROJECT_DIR.get_file(a[0].clone()).unwrap();
+
+ println!("count={}", count); //original document count
+
+ //README.md
+ let (first, remainder) = nip_vec.split_at(1);
+ //println!("a={:}", format!("{:?}",a[0]));
+ let mut readme = PROJECT_DIR.get_file(first[0].clone()).unwrap();
let readme_md = readme.contents_utf8().unwrap();
println!("\n{}", readme_md);
- println!("b={:?}", b);
- let (c, d) = b.split_at(1);
- println!("c={:?}", c);
- println!("d={:?}", d);
- let (e, f) = d.split_at(1);
- println!("e={:?}", e);
- println!("f={:?}", f);
- let (g, h) = f.split_at(1);
- println!("e={:?}", g);
- println!("f={:?}", h);
- //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
- //println!("Found {}", entry.path().display());
- //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- //let readme = README_MD.contents_utf8().unwrap();
- //println!("readme={}", readme);
- //nip_vec.push((i * 1).to_string());
-
- //println!("Vec: {:?}", nip_vec);
- //println!("BOUND={}", BOUND);
+
+ count = count - 1;
+ println!("count={}", count);
+
+ //second
+ //BREAKING.md
+ let mut breaking = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let breaking_md = breaking.contents_utf8().unwrap();
+ println!("\n{}", breaking_md);
+
+ //REMAINDERS
+ //count variable based on new documents added to nips repo
+
+ //traverse documents from last to no more remainders
+ count = count - 1;
+
+ //loop {
+ // if count > 1 {
+ // print!("count={}", count);
+ // }
+ // count = count - 1;
+ //}
+ println!("count={}", count);
+ let (last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ //println!("\nlast_md={}", last_md);
}
commit 2b43b8b9fd00a4492dd9adedf3297a9aa55181d7
Author: randymcmillan <
[email protected]>
Date: Fri May 17 09:24:39 2024 -0400
build.rs:src/main.rs:apply cargo +nightly fmt
diff --git a/build.rs b/build.rs
index b6d5f6c..62483c7 100644
--- a/build.rs
+++ b/build.rs
@@ -1,9 +1,9 @@
use std::env;
-use std::path::Path;
+//use std::path::Path;
use std::process::Command;
fn main() {
-let _out_dir = env::var("OUT_DIR").unwrap();
+ let _out_dir = env::var("OUT_DIR").unwrap();
Command::new("git")
.args(&[
diff --git a/src/main.rs b/src/main.rs
index d253240..2193be3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,7 @@ extern crate comrak;
use comrak::nodes::NodeValue;
use comrak::{format_html, parse_document, Arena, Options};
-static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
+//static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
@@ -48,18 +48,23 @@ fn print_entries<const BOUND: u8>() -> () {
for entry in PROJECT_DIR.find(glob).unwrap() {
count = count + 1;
- println!("count={}", count);
- println!("Found {}", entry.path().display());
+ //println!("count={}", count);
+ //println!("Found {}", entry.path().display());
+ nip_vec.push((entry.path().display()).to_string());
+ nip_vec.push("md content".to_string());
+ let mut md_content = PROJECT_DIR.get_file(entry.path()).unwrap();
+ let content = md_content.contents_utf8().unwrap();
+ println!("\n{}", content);
}
for i in 1..count - 1 {
//nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
//println!("Found {}", entry.path().display());
//let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
//let readme = README_MD.contents_utf8().unwrap();
- // println!("readme={}", readme);
- nip_vec.push((i * 1).to_string());
+ //println!("readme={}", readme);
+ //nip_vec.push((i * 1).to_string());
}
- println!("Vec: {:?}", nip_vec);
- println!("BOUND={}", BOUND);
+ //println!("Vec: {:?}", nip_vec);
+ //println!("BOUND={}", BOUND);
}
commit 8127bbda809b0cc3163bf79f3bfdf3f46016b481
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:49:49 2024 -0400
build.rs:git fetch/rebase upstream/master
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..439ffaf
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,36 @@
+use std::env;
+use std::path::Path;
+use std::process::Command;
+
+fn main() {
+ Command::new("git")
+ .args(&[
+ "remote",
+ "add",
+ "gnostr-org",
+ "
[email protected]:gnostr-org/nips.git",
+ ])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&[
+ "remote",
+ "add",
+ "upstream",
+ "
[email protected]:nostr-protocol/nips.git",
+ ])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["fetch", "--all"])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["fetch", "--all", "--tags"])
+ .status()
+ .unwrap();
+ Command::new("git")
+ .args(&["rebase", "upstream/master"])
+ .status()
+ .unwrap();
+}
commit 53c924176337e2923330dfb677060b37268cbe7f
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:58:13 2024 -0400
build.rs
diff --git a/build.rs b/build.rs
index 439ffaf..b6d5f6c 100644
--- a/build.rs
+++ b/build.rs
@@ -3,6 +3,8 @@ use std::path::Path;
use std::process::Command;
fn main() {
+let _out_dir = env::var("OUT_DIR").unwrap();
+
Command::new("git")
.args(&[
"remote",
commit d2e4ce291b3181dcbc4eb4855a0a050e0a8ffe33
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:55:14 2024 -0400
Cargo.toml:workspace config
diff --git a/Cargo.toml b/Cargo.toml
index f461a40..b45a312 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,18 +1,14 @@
[package]
name = "nips"
-version.workspace = true
-license.workspace = true
-rust-version.workspace = true
-edition.workspace = true
-readme.workspace = true
-homepage.workspace = true
-repository.workspace = true
-documentation.workspace = true
-categories.workspace = true
-keywords.workspace = true
-description.workspace = true
-authors.workspace = true
-
+version = { workspace = true }
+edition = { workspace = true }
+rust-version = { workspace = true }
+license = { workspace = true }
+homepage = { workspace = true }
+repository = { workspace = true }
+documentation = { workspace = true }
+keywords = { workspace = true }
+readme = { workspace = true }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
commit 8f081030fdae7917cd7cd58f86dd705bef1382f2
Author: randymcmillan <
[email protected]>
Date: Fri May 17 08:20:49 2024 -0400
nips/src/main.rs:apply cargo +nightly fmt
diff --git a/src/main.rs b/src/main.rs
index 146ddba..d253240 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,6 @@
use include_dir::{include_dir, Dir};
-use std::path::Path;
extern crate comrak;
+
use comrak::nodes::NodeValue;
use comrak::{format_html, parse_document, Arena, Options};
@@ -9,7 +9,8 @@ static GIT_REMOTE: &str = "http://github.com/nostr-protocol/nips.git";
static PROJECT_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR");
fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String {
- // The returned nodes are created in the supplied Arena, and are bound by its lifetime.
+ // The returned nodes are created in the supplied Arena, and are bound by its
+ // lifetime.
let arena = Arena::new();
// Parse the document into a root `AstNode`
@@ -30,24 +31,35 @@ fn replace_text(document: &str, orig_string: &str, replacement: &str) -> String
}
fn main() {
-
- // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my* input.\n";
- // let orig = "my";
+ // let doc = "This is my input.\n\n1. Also [my](#) input.\n2. Certainly *my*
+ // input.\n"; let orig = "my";
// let repl = "your";
// let html = replace_text(&doc, &orig, &repl);
// println!("{}", html);
- print_entries();
+ const BOUND: u8 = 50;
+ print_entries::<{ BOUND }>();
}
-fn print_entries() -> () {
+fn print_entries<const BOUND: u8>() -> () {
+ let mut count: u8 = 0;
let glob = "**/*.md";
- for entry in PROJECT_DIR.find(glob).unwrap() {
+ let mut nip_vec = Vec::<String>::new(); // Create an empty Vec
+ for entry in PROJECT_DIR.find(glob).unwrap() {
+ count = count + 1;
+ println!("count={}", count);
println!("Found {}", entry.path().display());
-
- let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- let readme = README_MD.contents_utf8().unwrap();
- println!("readme={}", readme);
}
+ for i in 1..count - 1 {
+ //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
+ //println!("Found {}", entry.path().display());
+ //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ //let readme = README_MD.contents_utf8().unwrap();
+ // println!("readme={}", readme);
+ nip_vec.push((i * 1).to_string());
+ }
+
+ println!("Vec: {:?}", nip_vec);
+ println!("BOUND={}", BOUND);
}
commit 0f968441be79c4d18c0935e67f5c0e4c8a9f8fa0
Author: randymcmillan <
[email protected]>
Date: Fri May 17 17:53:19 2024 -0400
post-commit-history:script
diff --git a/post-commit-history b/post-commit-history
new file mode 100755
index 0000000..55ea811
--- /dev/null
+++ b/post-commit-history
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+count=0;
+new_count=0;
+INIT_COMMIT=$(git rev-list --all --max-parents=0)
+#echo $INIT_COMMIT;#exit
+##git log -1 --skip 2 --pretty=format:"%h"
+##git rev-parse --short=256 HEAD~2
+
+## n=`printf '%016s' "$(git rev-parse --short=4 HEAD~2)"`
+#n=`printf '%064s' "$(git rev-parse HEAD~0)"`
+echo $n
+## exit
+
+## branch=master
+## for commit in $(git rev-list $branch)
+## do
+## ## if git ls-tree --name-only -r $commit | grep -q '\.hbm\.xml$'; then
+## if git ls-tree --name-only -r $commit; then
+##
+## ##echo $commit
+## exit 0
+## fi
+## done
+## exit;
+
+## var=$((var+1))
+## ((var=var+1))
+## ((var+=1))
+## ((var++))
+
+#count=0
+for commit_hash in $(git rev-list master);do
+
+padded_commit_hash=`printf '%064s' "$commit_hash"`
+#echo $padded_commit_hash
+#exit
+#echo $commit_hash
+count=$((count+1))
+done
+#exit
+export COUNT=$count
+#exit
+
+#new_count = 0
+for commit_hash in $(gnostr-reflog);do
+#echo $commit_hash
+padded_commit_hash=`printf '%064s' "$commit_hash"`
+#echo $padded_commit_hash
+export NEW_COUNT=$new_count
+#n=`printf '%064s' "$(git rev-parse HEAD~$count)"`
+#echo $n
+gnostr --sec $padded_commit_hash -t $padded_commit_hash --tag nip_commit $commit_hash --content "$(git show $commit_hash || exit)" | gnostr-post-event --relay wss://e.nos.lol || exit
+##echo $commit_hash;
+ #for commit_padded_hash in $(gnostr-reflog -p);do
+ ##echo $commit_padded_hash;
+ # gnostr --sec $commit_padded_hash --content "$(git show $commit_hash)"
+ #done
+if [[ "$commit_hash" == "$INIT_COMMIT" ]]; then
+exit;
+fi
+new_count=$((new_count+1))
+#echo $count & wait
+#echo $new_count & wait
+#exit
+done
+exit;
commit 5973f629e89363defe501531959063f7eabb6bba
Author: randymcmillan <
[email protected]>
Date: Fri May 17 12:31:50 2024 -0400
src/main.rs:intermediate:traverse docs
diff --git a/src/main.rs b/src/main.rs
index f6a5105..4840ddf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -81,15 +81,31 @@ fn print_entries<const BOUND: u8>() -> () {
//traverse documents from last to no more remainders
count = count - 1;
- //loop {
- // if count > 1 {
- // print!("count={}", count);
- // }
- // count = count - 1;
- //}
+
+ print!("count={}",count);
+ count = count - 1;
+ println!("count={}", count);
+ let (mut last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
+
+ print!("count={}",count);
+ count = count - 1;
+ println!("count={}", count);
+ let (mut last, remainder) = remainder.split_at(1);
+ let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
+ let last_md = last.contents_utf8().unwrap();
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
+
+ print!("count={}",count);
+ count = count - 1;
println!("count={}", count);
- let (last, remainder) = remainder.split_at(1);
+ let (mut last, remainder) = remainder.split_at(1);
let mut last = PROJECT_DIR.get_file(remainder[0].clone()).unwrap();
let last_md = last.contents_utf8().unwrap();
- //println!("\nlast_md={}", last_md);
+ println!("\n=====================\nlast_md={}\n===================", last_md);
+ println!("\n=====================\nremainder={:?}\n===================", remainder);
}
commit 9d7c194abef287ba59c81960d88e696d3291773c
Author: randymcmillan <
[email protected]>
Date: Fri May 17 11:16:30 2024 -0400
src/main.rs:intermediate access to README.md
diff --git a/src/main.rs b/src/main.rs
index 2193be3..002e7bc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -49,21 +49,34 @@ fn print_entries<const BOUND: u8>() -> () {
for entry in PROJECT_DIR.find(glob).unwrap() {
count = count + 1;
//println!("count={}", count);
- //println!("Found {}", entry.path().display());
+ //println!("{}", entry.path().display());
nip_vec.push((entry.path().display()).to_string());
- nip_vec.push("md content".to_string());
+ //nip_vec.push("md content".to_string());
let mut md_content = PROJECT_DIR.get_file(entry.path()).unwrap();
let content = md_content.contents_utf8().unwrap();
println!("\n{}", content);
}
- for i in 1..count - 1 {
- //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
- //println!("Found {}", entry.path().display());
- //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
- //let readme = README_MD.contents_utf8().unwrap();
- //println!("readme={}", readme);
- //nip_vec.push((i * 1).to_string());
- }
+ let (a, b) = nip_vec.split_at(1);
+ println!("a={:}", format!("{:?}",a[0]));
+ let mut readme = PROJECT_DIR.get_file(a[0].clone()).unwrap();
+ let readme_md = readme.contents_utf8().unwrap();
+ println!("\n{}", readme_md);
+ println!("b={:?}", b);
+ let (c, d) = b.split_at(1);
+ println!("c={:?}", c);
+ println!("d={:?}", d);
+ let (e, f) = d.split_at(1);
+ println!("e={:?}", e);
+ println!("f={:?}", f);
+ let (g, h) = f.split_at(1);
+ println!("e={:?}", g);
+ println!("f={:?}", h);
+ //nip_vec.push(i * 2); // Add elements (i * 2) to the Vec
+ //println!("Found {}", entry.path().display());
+ //let README_MD = PROJECT_DIR.get_file("README.md").unwrap();
+ //let readme = README_MD.contents_utf8().unwrap();
+ //println!("readme={}", readme);
+ //nip_vec.push((i * 1).to_string());
//println!("Vec: {:?}", nip_vec);
//println!("BOUND={}", BOUND);
警察:我们是执行法律的,不是为人民服务的。
https://link.storjshare.io/raw/jvmixn3b5lwtdhfbsfxt2j2fzwta/production/c6206a621aa54afc13a6b30bb7971b5bb2b4af8c6873b1c7579f6ca66a886f5e.MP4
“俄羅斯人是婊子!”
波蘭球迷在俄羅斯駐柏林大使館前唱歌。
https://link.storjshare.io/raw/jumxuur6ib6xgcvledvyn46nnw7a/production/c78f330be1c88af8de66c10771d0d0af78a66460e70209564449618e0b00a936.MP4
Just bought my wife an espresso machine for her birthday. Hard to say if I like it more than my French Press. #coffeechain
https://m.primal.net/ItEg.jpg
that was a pretty hilarious line hahah
my wife took a trip with our oldest and youngest last week. Gone for a week. didn't notify the bank she was taking a trip to a birth conference and so they shut off her bank card... "for her protection" of course. So now, all those business expenses had to be put on our personal card and we have to sort all that crap out... thanks fiat joke money... doesn't happen with #bitcoin
还有人信吗🥶
https://link.storjshare.io/raw/jxasgrss7prfqldvkfbhnu4bl7ka/production/75c05044a094502dfd0068679a2937d4f45363f9d667786cbefab48ce8c22662.PNG
I'm going to start logging into here for my Bitcoin off grid homestead project. try to be on top of posts as I want to have a record of the progress... here is to video and posting content more regularly
How mistaken are those people who seek happiness outside of themselves, in foreign lands and journeys, in riches and glory, in great possessions and pleasures, in diversions and vain things, which have a bitter end! In the same thing to construct the tower of happiness outside of ourselves as it is to build a house in a place that is consistently shaken by earthquakes. Happiness is found within ourselves, and blessed is the man who has understood this. Happiness is a pure heart, for such a heart becomes the throne of God. Thus says Christ of those who have pure hearts: "I will visit them, and will walk in them, and I will be a God to them, and they will be my people." (II Cor. 6:16) What can be lacking to them? Nothing, nothing at all! For they have the greatest good in their hearts: God Himself!
-St. Nektarios of Aegina, Path to Happiness, 1
#biblestr
I would agree with you, then.
https://app.warp.dev/referral/KPVRNX
Be the person your future spouse will want to marry.
支那人动不动苦中作乐,是丧失了反抗苦难的能力吗?他妈的太监
人民币汇率压力山大 潘功胜泄露天机中国对拜登川普没有偏好王剑每日观察20240620620
https://link.storjshare.io/raw/juxhp6im44emncz7ojinf3ggqz3q/production/f40ca4d6fafe38aad64fca520d3f14468b5f47e921725fe736e2fc83bbfa8f69.MP4
中国股市再破3千点,资本市场陷入新一轮折腾中国恢复与俄罗斯银行交易王剑每日观察20240620
https://link.storjshare.io/raw/jvlybdwuv6pamuru2sc2puisukgq/production/2309233dd8473b2eabc7d2ef75f7c6fe8354a7288b567a10a28d74ed23d949c6.MP4
支那贱种天天活得牛马猪狗不如,却成天做着习近平的春秋大梦,天天把别人当狗奴才看,真他娘的给你们脸了,还挑刺,带鱼塞屁眼拔不出来了是吧
You are right. The use of word "everything" was wrong. Majority would probably be a better word.
GM
#biblestr
https://m.primal.net/IskT.jpg
⚡⚡⚡⚡ Spread the love by Zapping ⚡⚡⚡⚡⚡
bot made by #[0]
List of successful zaps
⚡️ Zapped #[1] 21 sats
⚡️ Zapped #[2] 21 sats
⚡️ Zapped #[3] 21 sats
⚡️ Zapped #[4] 21 sats
⚡️ Zapped #[5] 21 sats
⚡️ Zapped #[6] 21 sats
⚡️ Zapped #[7] 21 sats
⚡️ Zapped #[8] 21 sats
⚡️ Zapped #[9] 21 sats
⚡️ Zapped #[10] 21 sats
Successful Zap count: 23643.
⚡️⚡️⚡️ Last 5 Zap back ⚡️⚡️⚡️
21 sats from #[11]
21 sats from #[12]
21 sats from #[13]
10 sats from #[14]
10 sats from #[15]
My Zap Balance: 184041 sats. Zap me to keep this going forever..!
控制欲特别强的女人,会给家庭带来绝对的伤害。
和这样的女人组成家庭,对于一个男人来说,是他人生崩溃毁灭的开始。
其实,人不应该有极强的控制欲,女人更不应该有。
即使你操控了这个家庭,操控了男人的生活,操控了孩子,又能怎样呢?只会毁掉自己的幸福、男人的幸福,毁掉整个家庭。
很多男人在婚姻中想要的不是贤妻良母,甚至都不是幸福,更不是自由,而是在婚姻中能保持心灵的宁静。
当年,波普是一个狂热的共产分子,当他发现社会党人总是逼着资产阶级向工人开第一枪,他选择了退党,并一生成了共产主义的敌人,写了《封闭社会及其敌人》。
控制欲强的女人也是一样,他总是想法设法逼男人发疯。结果呢?男人的心都因冰冷而死。
掌控别人的生活要比控制别人的思想更难,尤其是去掌控一个有思想的人的生活。
Things are getting better at getting worse... 😅
I don't think everything is worse. Even if some things are, I am more capable of ignoring it mitigating those things.
And I don't think we are just getting old. I think things are going objectively worse.
从五一我岳父母过来,截至6月15日,我们两个2024年共说话了46天。
When I was younger I was always thinking that things are getting better... Now I think that everything is getting worse...
最近建了一个群,跟单交流提升 https://image.nostr.build/16b889f3fd6f8057131f7e2f6855c5dbfff979e94544414243397b7d205f32f1.jpg 群
https://weibo.com/u/1400582340
我操你妈
You can't stop the waves, but you can learn to surf. - Jon Kabat-Zinn
Hey, here is proof that people just don't leave Nostr, they take breaks.
#nevent1q…258j
Relationship pro tip: when she is in the kitchen or in the laundry room, ask her the same question.
I think and that is all that I am. - Wayne Dyer
If you can't explain it simply, you don't understand it well enough. - Albert Einstein
He is a #wise man who does not grieve for the things which he has not, but rejoices for those which he has. - Epictetus
Liberty, taking the word in its concrete sense, consists in the ability to choose. - Simone Weil
I have been impressed with the urgency of doing. Knowing is not enough; we must apply. Being willing is not enough; we must do. - Leonardo da Vinci
Those who are blessed with the most talent don't necessarily outperform everyone else. It's the people with follow-through who excel. - Mary Kay Ash
Too good not to share with the #wavlake fam 🤣
https://wavlake.com/track/e2dc6742-4e80-4f7d-af81-932f8cd2caaf
#plebchain
Alright, this Song AI is pretty sick
https://audio.nostr.build/0689ccf98315dc978c8da46250937df2477709ab3122bf6e5c0d58fd32c9b15b.mp3
#tunestr #bitcoin
Marathon Digital’s Anduro Network Enhances Bitcoin Utility with Portal
https://dollarparity.com/posts/marathon-anduro/
Marathon Digital Holdings has integrated its multi-chain layer-2 network, Anduro, with the decentralized exchange network Portal to Bitcoin. This strategic partnership aims to enhance Bitcoin’s utility by enabling atomic swaps across different blockchains, fostering greater adoption and new revenue opportunities for miners through merge-mining. Leveraging the Lightning Network, Anduro introduces innovative sidechain infrastructure, highlighting significant growth potential within the Bitcoin ecosystem.
Last week it took 6 days for a bank draft to clear!
To change ones life, start immediately, do it flamboyantly, no exceptions. - William James
Sometimes I forget how incompetent the legacy financial system is. It's taken them 2 business days to consider giving me my money, and they still aren't convinced that I'm worthy of it.
Life is the flower for which #Love is the honey. - Victor Hugo
Never deny a diagnosis, but do deny the negative verdict that may go with it. - Norman Cousins
Idk about Russian, this is very American if you ask me...
Education is our passport to the future, for tomorrow belongs to the people who prepare for it today. - Malcolm X
This world, after all our science and sciences, is still a miracle; wonderful, inscrutable, magical and more, to whosoever will think of it. - Thomas Carlyle
🇬🇧BITCOIN: What exactly ARE you expecting??? - LIVE in 30mins at 6pm London on ‘The Bullish ₿itcoin Channel’ (Ep 630) 🚀
(20-06-2024)
#bitcoin #btc #decentralisation
Join us LIVE!!
https://youtu.be/iqZQmvgL2lQ
所以八小时工作制为什么不推进呢?哪个对社会影响大?🤔
后清小畜生们怎么看?
#nevent1q…hr7g
習近平不只割人民韭菜「連器官也隨便割」?!中共高官「14年換5顆心臟」 有錢就能換「連一帶一路友邦都享優惠」?! - 【關鍵時刻】 劉寶傑: https://www.youtube.com/watch?v=Vx59gyHL8Ls
Blaze with the fire that is never extinguished. - Luisa Sigea
“妙不可言”
https://link.storjshare.io/raw/jxdkntuaosrj6dd3n5b56j3dlfhq/production/23a0b3b0341a61ae305b09b5db665445fef9bcb25e2db389a137f7aac63cea89.JPG
I don't think grandkids, or children for that matter, are in his cards...
精彩片段》周偉航:#國民黨 沒辦法硬拚場...【年代向錢看】2024.06.19@ChenTalkShow: https://www.youtube.com/watch?v=T90OONpcob4
#普罗克拉斯提斯之床
https://files.sovbit.host/media/81913081246d192c9a55951704270756b222094470b3171e58bb5e3c42ee8db5/ef0283572781fbf0e3fee4bd6de2ff4309cac15848a851a6dcf88fd2ceaaf698.webp
关心🥣大小也没问题,只是时间不对,该去视察的地方没去。。。
Nothing is so strong as gentleness. Nothing is so gentle as real strength. - Frances de Sales
有钱人玩的花,不差这点钱😇
羡慕有钱人的生活乐趣多😍
我最怕死,还是等产品成熟了再说,不过我这边也没有,好像只有湖北才有。
赶超英美还没实现,肯定还得继续吃苦,100年不动摇啊😇
我倒是想体验一把,可惜这边没有😇
我之前体验过无人驾驶公交车,速度比较慢,路线固定。
Transformation doesn't take place with a vacuum; instead, it occurs when we are indirectly and directly connected to all those around us. - Byron Pulsifer
无人车的自动驾驶安全性建立在设计时的安全逻辑之上。尽管大数据提供了重要支持,但道路状况难以完全预测。即使车辆路测和仿真里程可以覆盖99%的场景,不可预测的1%也会带来不可忽视的安全隐患。因此,无人车始终把乘客安全放在首位,并在紧急情况下优先保障安全。
安全员是保障无人车自动驾驶安全的重要防线。面对那些超出无人车能力范畴的复杂情况,位于云驾仓的安全员将远程接管车辆,确保行车安全。具体场景包括但不限于以下两类:
其一是临时交通管制,无人车难以识别交警手势并灵活处理;其二是修路封闭情况下,车辆需要在对向车道“逆行”,这与无人车的原始程序设定相悖。
安全员的选拔过程严格,不仅要求他们拥有丰富的驾驶经验和较低的事故率,还需经过专业的无人驾驶培训与测试,以确保他们具备高度的安全意识和过硬的技术能力。在无人车行驶的每一刻,都有这样一位专业的安全员在远程默默守护,为乘客的安全保驾护航。
https://mp.weixin.qq.com/s/VtD2IImMcPH-pi5GERtZXg
This is the way. #note159e…mqm8
https://www.dapenti.com:99/dapenti/2dd565a1/90f9646f.jpg
中国再上演警税合成作战 民生更难了王剑每日观察20240619
https://link.storjshare.io/raw/jvg6ghxaiybewuovbgqyu6yks6ga/production/9e38318187daf782e92f8fdf536634a5dbe66ac48cbd0b29fa32cee2730c3840.MP4
Very little is needed to make a #happy life; it is all within yourself, in your way of thinking. - Marcus Aurelius
Do, or do not. There is no try. - Yoda
GM, and wise words to share
Hope arouses, as nothing else can arouse, a passion for the possible. - William Sloane Coffin
GM
#biblestr
https://m.primal.net/IrZX.jpg
The vote was postponed... Giving us more time to admire all the good things they did.
#nevent1q…7hc0
Nono, it's for the program in the machine, so it can sew it out. Like this. https://media.tenor.com/znBzOC7lEKAAAAAC/mesin-jahit-jahit.gif
It is better to have enough ideas for some of them to be wrong, than to be always right by having no ideas at all. - Edward de Bono
这个给一个参考,考察一下疫情期间当地的防疫措施就知道当地的官场风气,只有松散的地方才有可能获得个人生存的空间
没有什么输赢,也没有什么破防,对这个国家的平均受教育程度还没点儿逼数么?明摆着就是七十余年愚民教育的累累硕果啊。你说美国佬从来没有登上过月球,这13亿里面80%以上都会信,一个漏洞百出的商业秀,这群傻逼们如果没有照单全收那才是教育的失败,愚民教育的失败。
Do one thing every day that scares you. - Eleanor Roosevelt
I'm not pressuring anybody! I just stare and really try. Someone isn't built to witness such a concentration..or may I say, the Force.👀😆
Lol, in your case the force is called peer pressure :-)
How does the template looks? Can it be 3D printed?
Mine would probably read Milka.
Recently I was asked why I use Pride Map on Strava. My answer was simple. "I'm fucking proud of every activity I do."
https://image.nostr.build/7f4b231b6e42f5c5d6b9e41e32992b74f3e69e8fd60b51636641b5ce62683c4e.jpg
Human beings, who are almost unique in having the ability to learn from the experience of others, are also remarkable for their apparent disinclination to do so. - Douglas Adams
The only difference between your abilities and others is the ability to put yourself in their shoes and actually try. - Leonardo Ruiz
科技进步带动企业发展,带给个人投资的机会。
以及产业链脱钩程度的观察。
声明:
不是推荐股票,案例中的股票都有下一刻就腰斩的风险,只是举例方便理解理论,以及证明观点使用。
硬要给建议的话,我的回答是“不要炒股,不要炒股,不要炒股”
先说脱钩程度。
先上结论,除了明确打压我们技术突破的芯片等核心技术领域,在消费品或相对基础的产业链领域,几乎不影响。
新易盛,中际旭创是英伟达产业链光模块的供应商。
歌儿股份是苹果概念的供应商。
仅看主营构成,就知道合作紧密度有多高。
再看股价,也都是正相关。
其实这很好理解。
英伟达是ai金矿界卖铲子的。
国内配套的企业好比给铲子做木柄或麻绳握把。
虽然科技含量和利润率不在一个维度,可架不住人家热度高啊,蹭流量蹭出个远高于自身实际估值的短期高价,情理中预料内。
如果把这波走势比做上一篇说的“概念炒作阶段”或“成长兑现阶段”。
那随着英伟达的股价回调,它们大概率也会迎来更剧烈的回调。
同时,只要英伟达一直和他们合作,且英伟达走出第三波价值回归行情,他们也有可能正向同步。
这和国内行业龙头对供应商无底线打压的合作模式是两码事。
国内是疯狂压榨利润,恨不得并为控股子公司。
国外也压价,但是好歹保持一定利润空间,合作企业能跟着一起做大做强。
这也是为什么国内产业链上下游很少正向同步的逻辑。
同时也是国内民企喜欢跟外资合作的原因之一。
再说苹果产业链。
苹果这一波是基于ai的深度合作。
这次合作表明会有发生一个明确变化,那就是在app应用层和用户之间,将插入一个siri助手。
(siri一直有,不过这次通过ai技术,将其和app应用深度整合在了一起,实用层面更加深入。)
实际点就是我们现在有什么应用需求,它就会打开相应的app。
而接下来只要和siri说你的需求,siri会调用app内容完成你的诉求,从而事实达成app隐身化。
当然,app也可以手动打开。
长期两种方式并存是大概率情况。
就像移动支付和现钞支付并存一样。
那脑子转得快的就会想到“科大讯飞”这类语音转文字的发展机会。
直接上结论。
科大曾经有过短期优势,但是现在语言类算法和模型早已超越并即将形成技术性代差,别碰了,没意思。
而瑞声这些之所以跟着这波涨,是因为这个发展方向会像之前对拍照,拍视频有更高需要,导致手机摄像头增加。
苹果这次变化,大概率也会增加喇叭,听筒数量,至少对精密度提出更高需求。
所以炒的是这个逻辑。
回到炒作这个领域的关键上:
这非常吃人的认知,特别是产业发展方向和技术细节的了解。
比如瑞声,很多人只知道做喇叭的。
这东西还能做出花来?
屎上雕花么?
那我就没话说了。
就像没有美学素养的,你带他逛美术馆。
那跟被老妻拖着逛女装店没差,还得付钱买单。
而旭创这种做光信号传输的,没了解的也会一脸懵逼,这踏马什么玩意?很难很值钱么?
正常,谁没事研究这些冷门玩意。
人那,就只赚得了自己认知范围内的钱。莽莽撞撞冲进陌生领域,大概率是要被割韭菜的。
哦,多说一嘴,哪怕自认为熟悉的,有历史经验可循的,也很可能是坑。
以养猪为例,猪周期都听说过吧,有买菜的还自认为掌握一手资料。
但是周期股是很吃跟踪的,一般人最好别碰。
这东西就跟蛋炒饭似的,看着最简单,其实最困难。
养殖类的更是如此,作假太容易了,专业机构都容易踩坑中招,一般人,没事就别去招惹了。
https://link.storjshare.io/raw/jvobnvt5hhoxqpwmpghifkow5h2q/production/94cc6c690cb2865f8d2facd36db9cd172335fc3e2a7e5f6e9dd805538242da2e.JPG
https://link.storjshare.io/raw/jvxabnexitbl62eplxxyban5n4bq/production/4bc3d205a3e61b9bd3d09554e0804c7c9670e2397324dc11c90d3f85ae755340.JPG
https://link.storjshare.io/raw/juswdfjjqlwvbqvs3sgbthtnhf3q/production/c3fda6aa783fced2a830f15e65bc7f36cda0f41fee0e6ce64d77f72072adc1da.JPG
https://link.storjshare.io/raw/jvny4wkkv372o7rqoxmzmj6gzbqq/production/3151e3568c0ce52bdce43a79e8ac5853d33e8b44dfb9d024636d6ec8ac176ae6.JPG
https://link.storjshare.io/raw/jwd4i6l4u33jnrmhybbmvbbol5ia/production/2c9edb49c7e0b096de8f10723e626e314f1748cdbc3352d785236ecf74c02091.JPG
https://link.storjshare.io/raw/jxxewhtvs45kde2je3a7idm2gg7q/production/8b99ce96a84d98beca6f2e1e8ee236fd336427d9e46867ba0bef3bb3a9763930.JPG
https://link.storjshare.io/raw/jue33xo3i2todzgmck4c6yukijrq/production/d70ee86c376bc0ac6d59617b33be40eae676998471cd79a4ff212f5c0e606be6.JPG
https://link.storjshare.io/raw/jxq4wyqciullmf4ldljrp74wutdq/production/7b68afeff5209bc2798da3b295f52073ce505fbfab68f15100e690edf8849642.JPG
https://link.storjshare.io/raw/jxpeoclk6ifiwe2syjpb7p7a7cdq/production/a527b025a1a7f96c159a06606775199508d071048cfef82b0187fa272d7e03bf.JPG
https://weibo.com/6232023735/5047014454726168
原博主,你好,你妈并不存在,只是美国CIA的阴谋
https://weibo.com/7099422177/5047074251606979
你们怎么不对美国说什么“互联网并非法外之地”呢
去封他们号请他们喝茶啊,做不到,那就是废物
The deepest craving of human nature is the need to be appreciated. - William James
Looks like it. Def not a follow
@npub1d7h…k463 going all bot on us 👀
Courage is not the absence of fear, but simply moving on with dignity despite that fear. - Pat Riley
Wow! So much truth in this! 🔥
极端贫困的生活,两个懂事的小哥哥,让人泪目🥹
哥哥一直都出布,让妹妹多吃一点
等妹妹知道出石头的时候,就长大了~~🥹🥹
https://link.storjshare.io/raw/jwh7va4upvkazl7bfzgz75vqdoma/production/483e9e36f3139a99f799b6c46425b56ae081e7781a8784c65e1c7be76647073c.mp4
王剑每日观察——三中全会有破口-习近平到延安开军委政工会议 普京与金正恩秀恩爱给谁看20240619
https://link.storjshare.io/raw/jwejhqdvma44hb6k2lfepcrnovia/production/8e17809f87a7530e7d0e8d40f34f660b589c3aaba0a3302b1e0950baad68e42d.MP4
翟山鹰——促进中共倒台的“三大法宝”
https://link.storjshare.io/raw/jwibk7qqjuniuq4rlajmv6zvu23a/production/e29489340c888daf82da8ab25bdc903c4070d61d00b9f3f97a6a3bf48fc3c568.MP4
People are not lazy. They simply have impotent goals that is, goals that do not inspire them. - Tony Robbins
即使是有限回拉,也是功德无量,那一点点就是十万八千里的意义!
令人震惊的新细节和视频揭示了中共对菲律宾的“残酷攻击”
- 中共海警发射催泪弹
- “菲律宾军队在这次公然的侵略行动中英勇反击,保卫了自己的阵地”
- CCG 使用物理攻击、刀刃武器、刺耳警报器和眩目闪光灯
- 用斧头、刀子和砍刀威胁菲律宾士兵,并开始投掷石块和其他物品
https://link.storjshare.io/raw/jx3fs7caiz3nqkdnuue4nv7kqpwq/production/aa16827975c686971bd65d5041955fec2d97035af4294d0a3c8e2aa147072c47.MP4
个人觉得那种可能性很小。
先不说24小时医疗组全程跟着。
即便出现意外,代表的利益群体也不可能突然转向。
新上来的无论是自身安全还是其他考虑,顶多只能有限回拉。
而现实是,已经没有刹车缓冲区了,悬崖就在眼前。
{"ibetchathat":{"wager":"Bitcoin stays in.the 65-75 range ","amount":"123123123","expiry":1729922400,"url":""}}
To be beautiful means to be yourself. You don't need to be accepted by others. You need to accept yourself. - Thich Nhat Hanh
You block your dream when you allow your fear to grow bigger than your faith. - Mary Morrissey
老蛮搬运
我认知理解里,崩盘的先后顺序是:
1.卢布。
人民币够不着,且成效极低却硬要去撑。
已兑现,崩了。
2.港币。
我之前就一再说,香港的特殊身份如果改变,那对香港在金融上的重要性是抽薪式的打击。
没有特殊的金融职能,那港币存在的意义就消失了。
这个缓冲垫就会越来越薄,直至成为需要高成本维护的负累。
3.本币。
老粉都知道,我之前也是觉得无锚印钱在即,本币极有可能很快大贬值。
最近和大佬对齐认知后,做了更新。
本币大幅贬值,一年为周期,可能性不高。
当然,如果出现政策转向或极端情况,肯定要根据实际重新分析判断。
仅当下现状保持的话,维持该判断。
最近离岸人民币波动问题,个人更倾向于是其他货币的货币政策变动,引起美元汇率变化,进而联动到人民币。
这其实可以从欧洲利率调整,澳元波动,带着美元指数变化,进而影响其他货币,从先后上大致能梳理出脉络。
(汇率影响因素太多,解读更多像事后诸葛亮的强行找补,这是没办法的事,没有标准答案,只有逻辑体系。)
https://link.storjshare.io/raw/jwzkdqs7jrxcn7prbugg5y326o6q/production/628310e364b27e959c7c4619eb826a39a4bb26197e292045f4a455b727c14b1a.JPG
https://link.storjshare.io/raw/jxpfavao3ixdy5ing5lkhufuhqla/production/d0bed3c99ffba9454720f50645b8778b9e98b3a855eb10974f7f5eb175bcd081.JPG
https://link.storjshare.io/raw/juhymibkw6bl2m73ljv5hwomnyrq/production/f7768ca55fa156eb82a926ced83703a49f7c4d37cf8d705a0697f66b49d24340.JPG
https://link.storjshare.io/raw/jxpwmn5n5womqlotaqekqyaow4zq/production/4c759669b45cb910fd5081973c5c06fbeaadcf71122ef2c58c411704ff61a01f.JPG
https://link.storjshare.io/raw/juxj2m627vxoyotxoiisakabckya/production/e4c9f443f86602c474f00594c8be4e474cf31707e33758e0002481d16f081b84.JPG
先看看米雷的,也许不需要什么治理。
所谓的治理,不过就是威权主义的借口。
我是不太赞成老蛮的这一套所谓民主威权的啊,什么不民主然后就经济就不行怎么怎么的就起不来这种,他纯粹是对着中共撒气那伙儿的。其实都是他自己给编的😂😂😂不信我们就用事实来赌一赌等着看老美和中共谁先垮😂😂😂
Don't talk about what you have done or what you are going to do. - Thomas Jefferson
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
Learn all you can from the mistakes of others. You won't have time to make them all yourself. - Alfred Sheinwold
I missed my 1 year Nostrversary by 10 days! Happy I discovered you guys, ya'll have taught me practically everything I know about Bitcoin.
#note172g…lruc
Peace is not something you wish for. It's something you make, something you do, something you are, and something you give away. - Robert Fulghum
佛瑞德里希4th😷
@Friedrich4th
此国已死,有事烧纸——谈谈习政权的僵尸化
都洗洗睡吧。
不必再等待习近平和他的团队推出什么给力政策了,他们是不可能站出来挽救中共国当前的经济危机的。
原因很简单,沿着“凭出身得特权”的路走到今天,习近平已经和中共体制内所有技术官僚势不两立。
当前的经济危机必须从技术角度寻找解决方案,但从技术角度看,中共决策核心已经瘫痪。
通过多次重复操作,习近平已经充分展示了他对“以奋斗谋特权”的技术官僚的不信任,和在需要对他不懂的技术方案进行选择时的不肯承担责任。
如今,还有哪个不受信任的技术官僚敢冒身败名裂之险,去主动贡献出合理可行的危机应对方案?
好吧,大家都拖着,下属用拖延回避风险,习近平用拖延回避责任。
于是中共国的现实是,大家只能在决策核心的无所作为下,一直拖到最后的脆断。
倒计时即将结束,最后时刻已经到来。
危机必定首先在金融领域爆发,然后与财政危机导致的各地方政府各级机关的失能失序,联动。
基层财政已经崩溃。财政资源的匮乏其实还远不至于导致中共政权的崩溃,但当没有人敢上报,没有人敢拍板拿出方案解决——哪怕是暂时解决——这崩溃就会激发整个官僚体系的信心危机,激起整个维稳系统的连锁反应。
中共不是没有钱,四十年改开攒下的家底还不至于这么快就造个精光。从国家机器的潜力论,在政策方面,当局也远未“穷尽一切可能”。
但决策核心已经瘫痪了。
这就象一具人体,当大脑丧失功能,就算四肢完好,主要脏器基本没坏,脂肪和肌肉的损伤都远没到致命程度,躺在危机四伏的环境里它也存活不了多久。
这瘫痪倒不是说习近平的健康或者他对权力的掌控出了什么问题。
这瘫痪来自习近平一向的决策习惯。
为保持个人权威,他总是极力逃避身为最高决策者无法逃避的责任,但同时又绝不肯对下属放权,把自己搞不懂、解决不了的问题放手交给懂的人去做。
这个不懂装懂,总想通过打压真正干活的人来显示“我比你们这些臭知识分子厉害”的最高领袖,就象一条躲在暗处,或者说直接是盘踞在明处的毒蛇,咝咝吐着信子,看到谁站出来试图解决问题却无法一步到位取得圆满成功,就狠狠咬上一口。
这瘫痪来自习近平身边所有部属的精疲力尽。自习近平上台以来,就在这十多年时间里,他的平庸低能、言而无信、反复无常、揽权自专,已经让整个中共官僚体系中的技术官僚群体吃尽了苦头。
现在,他的部属们终于摸清了他的性格,也弄明白了做他下属的“标准姿势”。
这“标准姿势”就是躺平摆烂,嘴上口号山响,手上按兵不动,做每件事之前都先想好怎么推卸责任,怎么保自己的平安。在下每个重大决定前,都耐心等待习近平的亲自指挥亲自部署,一直等到真出事了责任绝对不会归到自己身上为止。
习近平手上的可用之人,只能来自中共国官僚体系,这些人绝大部分是邓、江、胡在改开期间攒下的班底,是“人精”,是官场老油条。他们中间有具备专业能力,具备解决问题能力的人,但这样的人,绝不缺审时度势趋利避害的心眼子。
中共国经济危机濒临爆发,政府财政危机已经走到不下猛药不出绝招就要“死人”的地步,但谁敢来拍板下猛药?谁肯来承担出绝招的政治风险和历史责任?
看得清局势的人,谁会不要身家性命,为习近平这种不配不值得的领导站出来?
至于看不清局势的人,更无法向习近平献上什么妙策。
如今,围绕在习近平身边的部属幕僚为应付他找出的最佳办法,就是糊弄。
在正事上糊弄拖延,把力气都用在拍马屁、“做政治思想工作”等习近平看得懂的事项上,在这些屁事上假积极,用这些事占满自己的工作时间,在习近平面前则不断强调这类屁事花活的重要性,好在正事烂尾时让自己显得“在忙其他正事”,因此情有可原。
现在,对习近平身边的幕僚部属来说,自保才是第一位的,什么国家危亡什么财政崩溃都可以滚一边去。
这种每个官场成员都把习近平视为最大危险来源的心态,这种整个国家机器都围绕着最高领袖的一喜一怒打转的行为模式,正是习近平精心调教的结果。
但这结果也是面对现实危机时官场集体躺平摆烂,把剩余资源全用于释放各种“好消息”哄习近平高兴的原因。
习近平越是试图加强自己的权威,越是试图让部属们因害怕自己而更忠诚更不敢“把事情搞糟”,部属们就越是不敢站出来献计献策解决问题,越是只能专注于用“哄他高兴”来自保。
这是个死局。
死就死在已经没有人能让中共决策核心从这种特殊的瘫痪状态中复苏,没有人能化解中共“神经系统”的死亡螺旋。
中共国的多重危机本就是“重病”,如今已经拖成了绝症。但对“医闹”的恐惧,却让每个有机会开出处方的“医生”都只敢提出保守治疗。
于是病情只能持续加重。
病躯只能在群医束手中被耗死。
从现在开始大家可以看着,睁大眼睛看看,中共还能不能拿出任何一条对挽救危机有实效的政策。
我的推断是,不能。
不论对俄乌战争还是对欧美外交,不论在救经济方面还是在救财政方面,从现在开始直到最后政权终结,不会出现任何“断然措施”。
中共虽然还没有咽气,已经提前让自己成了“活死人”。而这虽生犹死的状态,也持续不了多久了。
下午7:16 · 2024年6月16日
When anger use your energy to do something productive. - C. Pulsifer
憂取消"紅軍"降低實戰化效果 專家建議"可縮小規模" 漢光演習取消"假想敵紅軍" 防長:以真實模擬想定 |記者 許芷瑄 屈道昀 黃彥傑|【台灣要聞】20240618|三立iN...: https://www.youtube.com/watch?v=dldxDusRaek
To accomplish #great things, we must not only act, but also dream; not only plan, but also believe. - Anatole France
奇怪,这个视频看不到呢,点进回复才有?台湾上中都没找到。
拚經濟! 卓揆:8月成立經濟發展委員會 綠委不滿財經內閣? 傳柯建銘狠噹郭智輝.彭金隆 │記者 許芷瑄 黃彥傑 SNG│【台灣要聞】20240618│三立iNEWS: https://www.youtube.com/watch?v=4JPl5TuMvfM
路邊野菇別亂吃! 雲南女子嗑"菇"產生幻覺 以為"機器人"闖空門 患者躺病床抓"小精靈"│記者 劉玨妤│【國際局勢】20240618│三立iNEWS: https://www.youtube.com/watch?v=EMlnFRyTOWE
Having nothing, nothing can he lose. - William Shakespeare
You were not born a winner, and you were not born a loser. You are what you make yourself be. - Lou Holtz
When you realize how perfect everything is you will tilt your head back and laugh at the sky. - Buddha
Nothing will work unless you do. - Maya Angelou
Be as you wish to seem. - Socrates
写于2022年10月12日:其实,我们活在这个世界上,往往会发现那些把道德和良知时常挂在嘴边的人,反而时常令人失望。
不是因为他们虚伪,相对于那些不把这些挂在嘴边的人更坏,而是因为他们根本做不到他们口中的道德,以及人们总发现他们并不是在生活中比我们更具有道德。
所以,我对这样的人,往往并不去否定他们,而是觉得应该把一个人说的话和这个人分开。不能因为他的话,就给他一个他不具有的形象。正因为我们往往把一个人说的话,等同于这个人的品质,所以,我们拔高了这个人,也让自己失望。当然,这也并不是说,我们不鼓励一个人把道德把良知挂嘴上,而是说,不要因此把他和他的话等同。
一个人能够动不动把良知挂嘴边,当然不会是一个很差的人。但问题是,不挂在嘴边的人,也一样未必就差。如此,既然一个人总是把道德和良知挂嘴边,给他一个更高的道德要求,就不是别人的错,而是那个人想让大家这样认为他,而每个人又往往从一个人说的话对这个人进行期许。
因此,很多时候,我们对一个人的失望,并不是这个人的话误导了我们,而是我们总是有这样一个认知的误区:一个人说什么话,就是什么人。可现实,偏偏不是这样。
是什么造成我们把一个人的话等同于这个人呢?我觉得主要是,第一,我们不可能对一个人有很深的了解;第二,正因为我们对一个人的生活不了解,所以我们只能从他说的话判断。这不是谁的错,而是很多人我们和他都是平淡的交往,所以,通过他的言谈,去判定他也是没办法的事,谁也不可能为了真正认清一个人,反复的通过与他共同生活去确认。
路遥知马力 日久见人心,确实很对,但并不现实,只能用到经常打交道的人,对于那些并不整天共事的人,还不是最终回到他的言谈举止。
出于此,有时想想,确实,通过说的话认定一个人,太过仓促。但这不就是和一个人继续交流下去的基础吗?故此,我们没有必要说别人虚伪,也没必要自责自己不会识人,生活本来如此而已。
se na to může přihodit pár omezení co nesmí dělat 🤣 Když to má bejt trest
The only Zen you find on the tops of mountains is the Zen you bring up there. - Robert Pirsig
i love Rio! I want to go back so bad, and I'm afraid it won't be like I remember from 2010.
sorry to jump in the middle of a thread, not sure what the etiquette is here...
We are a mirror of the most fundamental object of our reverence. We truly become what we worship, so we must worship what is good, what is true and what is beautiful.
The larger debate for me is the decision to never leave the US or even get on an airplane ever again. I certainly don't trust Boeing, but... Other makes aren't without issues. Then also the active DEI hiring practices are very clearly causing a decline in competence in pilots. All of that gives me pause.
Only those who dare to #Fail #greatly can ever achieve #greatly. - Robert Kennedy
It was clearly just an example. The main message was that you never know when you will need it and that it could be suddenly too late... when all your friends jump on the plane to Cairo and you are left behind.
I don't ever do that. I don't have the Fiat to spare for travel since I'm focused on two particular goals.
Rio has never been on my list of places to travel, too... 😅
Please renew your passport just for the sake of having it. You never know when you will needed... for spur of the moment flight to Rio de Janeiro or something crazy like that.
Good morning friend
Many blessing & Pura Vida
Long live bitcoin & freedom
习近平核心圈的决策瘫痪与中共治理危机普京抵达朝鲜与金正恩勾兑王剑每日观察20240618
https://link.storjshare.io/raw/jur66kptvdvpp5nvhkjxsdnfd37a/production/23288264514fdb910beaa737af1e20e11b9fa2cd93bf1d844498f9962c8a0c8b.MP4
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
GM
#biblestr https://image.nostr.build/39e00e18e55674583b155fe3b6b9aea5ee1d6de206310f7bdc14438da74e67df.jpg
I think that today is a good day to remind ourselves some good things about the EU.
https://goodthingsabout.eu/
#Chat #ChatControl #e2ee
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
支那贱种差不多得了,屁大点权利跟死了爹妈一样拽,什么屌逼杂碎
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
"I will die on that hill."
all in
core values
focus
After accidentally tightening my band, I've done something similar by keys. But paper might be more practical…
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
追税倒查30年经济倒退50年,中国天灾人祸不已_中菲冲突升级_王剑每日观察_20240618
https://link.storjshare.io/raw/jvhfny7miuxwvuexelf45qacdoyq/production/285c6fbb33bc7cd49b5441b9d67d9f9e3a91ed4078b025b6327c8c09a0a8c858.MP4
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
https://i.nostr.build/nWVRa.gif
It's the best podcast for hearing the weekly homily from a variety of ministers
I typed it in and didnt get anything under those results, but maybe if you search the minister by name you'll find their stuff.
that's what I use, but I think there may be a slightly more mainstream alternative
Google podcast has been discontinued. Using open source AntennaPod as replacement.
does it have "The Ministry of the Word U.S.A."?
If feeling the machine god isnt a moral dilemna, Google podcasts is pretty user friendly. Depends though, if his interests are narrow, there might be something that caters specifically to that. For example, I exclusively use Ancient Faith Radio app for podcasts cause thats all i really want to listen to
I concur. That mirror is TOAST
The most awful smell entered my nostrils and I immediately assumed it was a baby with a full diaper and possibly a urinary tract infection.
NOPE. Just my sister-in-law attempting to cook herself some chicken alfredo. And just like that, I'm vegan. 🤢🤮
Women don't want to be stay at home moms bc its isolating.
That's horrible for mental health
Make SAHM community centered
Women make less than men in some professions but they get to go out and meet people and "Be Fulfilled" not stuck in the house all day alone trying to manage small kids.
who is going to influence ppl, so that they are ready to get educated? or even ready to being educated ?
Well Well Its #ElizaBleu🙄
Nostriches know nothing about you
They'll learn.
Lets see how much sats you can take from them first
https://unherd.com/newsroom/whats-the-truth-about-eliza-bleu-and-does-it-matter/
Red Licorice🔴 or Black Licorice⚫
Shamelessly soliciting Sats by pimping my dog Rocky. I will purchase treats. I really just want a tshirthttps://m.primal.net/Ipkd.jpg
It can be worse... For example I don't even have a favourite spatula.
Thrive, die or establish an equilibrium. That how systems and societies work, it can be Conway's Game of Life, Rabbits and Foxes or Nostr...
https://upload.wikimedia.org/wikipedia/commons/e/e5/Gospers_glider_gun.gif
Crypto has influencers.
Bitcoin has educaters.
Go educate.
We got this.
I just saw this, thank you very much.🙏🏻
There is no second best.
A deep dive into why there is #Bitcoin and then there is everything else.
My keynote from @npub167n…zu3r
This keynote was inspired by many but I want to give a special shoutout to @npub1der…xzpc , Jason Lowery, Andrew Poelstra, and Greg Maxwell. Their writings and work was particularly influential.
I’d also like to shoutout the @npub167n…zu3r team. This was one of the best #Bitcoin conferences I’ve ever been to. Thanks so much for having me!
https://youtu.be/--IFcOIEfl4?si=ChpxmO65oCr-oTKt
Just pointing out the two extremes
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
That's quite a broad brush you're painting with there
“panem et circenses”
“bread and circuses”
Really encouraging to see Bitcoiners taking back their media mindshare back from shitcoiners and other snake oil peddlers.
The Rage, TFTC, @npub1d7h…k463, Nostr long form blogging, @npub1hxj…agw3, Atlas21.com, and many more. Hundreds of quality podcasts, newsletters, video content creators and standalone bloggers. The Nostr Report was great, too, and I have a feeling something will replace it.
It does feel like we're witnessing something special. Nostr and Bitcoin provide an incredible suite of tools for shaping more sane, principled and overall better media.
I don't think a broader societal change is possible without it.
#nevent1q…uhmu
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
It’s learning to understand that they aren’t always choosing to stay in that state. In some cases yes, you can change things in your life to be better and get out of the slump you may be in but in other cases DEPRESSION isn’t always black and white and a person can’t just turn it off.
Basil, I fully agree with you. But it is not an "of course" but rather the prayer: "Lord have mercy on this bloody and corrupt planet". People who aren't rooted in the truth and confidence that you and I have, rather believe that everything is out of control. Many even assume - believing in God - that He's tired of mankind and doesn't want to care anymore.
Love it when justice actually works
Haha, that can definitely be a downside 😅
For those days, I'd probably just make tea. It's more forgiving.
The only downside is that it requires mental clarity to produce such magic first thing in the morning. I can't tell you how many times I've left water steeping in the press without coffee grounds lol
GM
https://image.nostr.build/542252aaf22a53f4c78bc36e5a3c45916fc23abbdc06f9a747f3f2c8e931c2a6.jpg
#biblestr
Of course. I don't know what possible scenario could cause someone to believe otherwise.
Heh, McCoy is funnier though. 😁
解放军战略核潜艇浮现 台海紧张局势升级中国查税风暴 不计后果破坏经济走线路断了王剑每日观察20240617
https://link.storjshare.io/raw/jxdpxbaplkipjkcpr6inxlico77q/production/41fef1aa90ebc4d53fdbd6b75c9a7d5f18c521b0763b8353e72ff7835b3fea28.MP4
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
Twice in my life I did an unpaid internship. Twice I got a job offer after it...
#nevent1q…jrxp
不是造假。是说这种把人捧成天才的现象是不能当真。姜萍或许很有数学天分,但远不是天才。
Would you say that today's church is still "well within God's control"?
赵紫阳穿的长筒黑丝吗?🧐 #nevent1q…g8st
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
习近平:美国引诱我们打台湾我们不上当!乌克兰和平峰会结束80国签署声明王剑每日观察20240617
https://link.storjshare.io/raw/juf4og2vgr5aqbqfmnw33djcqmja/production/85e4fe9ef7bab0643278511b340e067853cd6e7d3abff9b5afd72c85580b82ce.MP4
Yes but your urethra would be sore
I'm either content or angry, there really isn't anything in between. I love people, but I really have a hard time being empathetic towards people who are 'sad' for what I perceive as not a valid reason. I know that telling them to stop being sad or feeling bad for themselves is insensitive, but I can't understand how people stay in that state.
Yeah the bot liks almost everything I post. Its weird but whatever. At least its not olny me.
Engagement bots on #Nostr? who'da thunk it?!
@npub1d7h…k463 here's to lookin' at you, kid. Keep up the good work ;)
#cybersecgirl
又涨了?
【#今年起退休人员基本养老金上调3%-哔哩哔哩】 https://www.bilibili.com/video/av1555884493
#新闻 #热点 #事件 #社会 #社保 #工作 #社畜 #退休 #养老
#相信后人的智慧
我现在一听到这句话就有点应激。
只有废物才把自己的软弱和无能当成是理所当然的。
这么没脸没皮,让人感叹,可以说是史上最没骨气的亡国奴了。
连被满清奴化教育两百年的老百姓,都能不断发起革命,可见现在部分网友连骨头都是软的。
#社会 #热点 #中文 #简中
It had significant theological and political ramifications. Constantines involvement set a precedent for the emperors role in calling councils, however, the issue at hand which was the primer for the Nicene Creed was the divine nature of Christ. Regardless, this church was the one Christ promised would not be prevailed upon by the gates of hell, thus regardless of circumstances, it was well within God's control.
Ukrainian books translated into English https://insight.ui.org.ua/programmes-and-projects/ukrainian-literature-in-translation
Today Closing Account Status (6/17/2024):
Hey Human:
This trading account was opened with 100,000 USD on 01-10-2024. All the signals issues at 9:25 am ET are placed on this account. Every trade is 15% or less of the buying power at that moment.
Equity: $25933.9 (Total Gain/Lost: -74.07%)
Previous Equity: $25542.44
Day Change: $391.46 (1.53%)
Position Market Value: $29961.06
https://nostroz.com/portfolio_20240617.png
https://nostroz.com/positions_20240617.png
What about talking to the TrueNAS people directly? F-Series might be the right choice for you.
I suspect Grant doesn't really love himself.
What's the answer to the formula
"Look at me I own all these things" for 80-100 years
Divided by
The rest of eternity not being yours and you not existing
Idk if this is supposed to be a meme or motivation, but I think its working
#nevent1q…r7qa
thank you, dollarparity 🐦🌲
thank you i just sent another email to the people i trusted were better than me
re: the pigeon
took a lot
funny enough that's what everyone is focusing on right now in the EU. Perfect time to cancel privacy... nobody will notice until it's live.
When no one else is there for us, dollarparity is there
https://image.nostr.build/a3c1d75b245410ffbb51304556f98117f9d2c0e64f36f87c6b33eb05c7e15335.jpg
@npub1d7h…k463 wen zaps? 😂
https://media1.tenor.com/m/QsOCfAqtCbsAAAAC/pay-me.gif
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
Můj optimismus? Au contraire, že vidím růst Bitcoin a decentralizaci neznamená, že nevidím hořet Strakovku.😀
Přesně, proto mě udivil ten tvůj optimismus. Obecně si myslím, že než bude zase dobře, tak budeme muset vidět "hořet Řím." Otázka je, kdo, co a v jakém stavu ten požár přežije.
Jo a Turek určitě není příčina, je jen jedním drobným z mnoha a mnoha důsledků.
Kupuju saty pravidelně. Šaty téměř nikdy👀😆👌
#note16rt…r3gl
I hope that sharing this is not considered poor taste on @npub1mft…rkl3, but this cracked me up.
https://image.nostr.build/7eb45d3b1d240c0e491ede802deb4639d76512c9297b1d95c5a5986c829a7d06.jpg
Explanation, in Czech 👗 = šaty or saty without the diacritic. Saty means Sats.
Už aby to bylo za náma. To vycházkové klouzavé tempo směrem do sraček už není sranda.
Tenhle ostentativně dismisivní přístup se nám ještě vymstí. https://image.nostr.build/aab0b8291ffe49b5d38577161ed01ffd11475982b2a63d53550306b626fffbb1.jpg
I can verify this #note1ul3…4xgp
If you pass a stone in anger, you’ll be able to go about the rest of your day in peace.
#note1ul3…4xgp
Tak on není neschopný. Nemovitosti prodá, personál propustí a na doručování těch několika ze zákona regulovaných typů zásilek najme Deutsche Post... Do politiky ho hnala touha pomáhat a to se mu daří. Vždyť od začátku svého politického angažmá si pomohl o miliardy... Myslím si, v podobném stylu by "pomohl" i ČP 📯
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
GM
https://image.nostr.build/19ab7a1a1e5244a231fe79a2d6e09337a09f123d2d93396cfaba681da30078fa.jpg
#biblestr
Such a convenient coincidence. https://image.nostr.build/28bcf1567bce8d021120315737fdb196aec251d34a806b0013501a73fd38bcb4.jpg
Open question: Was the First Council only about theological matters or also about power politics?
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
It's ok. We were busy borrowing the thing👀😆
Amazing! 🙌❤️😄
Sorry I didn't join you, was busy orangepilling merchants 😁
Oh @npub1nct…303f, you wanted to do that, right? Well we did after you left. 😆 @npub1ajd…dt20 took evidence.
#btcprague #fiat
https://image.nostr.build/cdfc675ae482c064d0dd4d214e859ffb6fe018566f18d5f4935261fa44f3f176.jpg
I'm not preaching. I'm just sure.👀😆
翟山鹰——中国的革命要从中共基层政府开始了
https://link.storjshare.io/raw/jvuaitebqqocppeebj5hy3i3hvfq/production/831bf824516a8d6480cc99cc626a0507a45d662fcaf381cbe89809c6f89d2f41.MP4
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
Hmm, think it's cause it's GitHub, so it'd public.
Bro, do you even nip?
#nevent1q…fnj5
Also, https://pleb.lol/.well-known/nostr.json?name=aida should return nothing and not a list of all the users on your domain...
How do you know that it works? It works in your client, but what about the others and their next versions? It is not valid according to the specification so it is not smart to use it.
Nice, straight 10 min walk between those two.
Kudos for your sheer optimism.
The difference between Nostr and other platforms is the control over the bubble you have. You can decide to leave the decision on relays (maybe not fully now, but those times will come) or you can build your bubble yourself... But in general you are not breaking someone else's printing press you are just choosing not to read their pamphlets. This has actually much more to do with the freedom of speech rather than with censorship.
Fuck the Police... And Fuck the Morality Police Extra Hard! 🤮
#nevent1q…p9z9
Conflict is the essence of drama. And this is an epic read. Convenience vs. Security will be a leitmotif of Nostr for months or even years to come...
#nevent1q…965a
Culture (which includes the public web) has been slop for a long time. Motivated, not cheap, content, is the problem. Cheap is a good dimension. Strong position on humanity: humans give themselves superpowers, transhumanity.
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
https://www.oca.org/saints/lives/2024/06/16/43-commemoration-of-the-holy-fathers-of-the-first-ecumenical-counci
#biblestr
Countries... Meh. Bitcoin does not know borders.
Look at mine, it is working
I don't want to be a party pooper, but NIP-05 clearly says:
```
NIP-05 assumes the <local-part> part will be restricted to the characters a-z0-9-_., case-insensitive.
```
Fireworks should be a normalized tradition for Fathers Day:
1. Good dads will feel honored.
2. Money will be spent on pyrotechnics rather than stupid trinkets we don't want and wish would have been invested into bitcoin.
3. Bad fathers will be reminded of how terrible they are and motivate them to be worthy of the fireworks next year.
4. Kids will grow up looking forward to being worthy fathers.
5. Support an industry that only sees spikes in sales twice a year.
It is better to share your key fingerpint, and @npub1ajd…dt20 is spot on about having to publish your public key.
Message + public key = cipertext
Ciphertext + private key = message
So we need the public key to encrypt (and you need the private key to decrypt).
Sharing your fingerprint is how we search for your public key on PGP key servers.
We can also search for keys by email address, but since anyone can upload any key and claim that it belongs to your email address, we want to get the fingerprint directly from you to make sure we have the correct one.
Handing over your fingerprint used to be done in person, but I guess those days are largely behind us now. 🫤
"They're sitting on 10 to $12 trillion of critical minerals in- in Ukraine. They could be the richest country in all of Europe. I don't want to give that money and those assets to Putin to share with China."
https://www.cbsnews.com/news/lindsey-graham-senator-south-carolina-face-the-nation-transcript-06-09-2024/
The creators apparently acknowledged it was canon. It doesnt have the same feel of dragonball z at all, its like they tried to go back to cutesy dragon ball stuff, and threw in a whole bunch of dramatic side quests. I started it thinking it was going to be amazing and was terribly disappointed
I thought GT wasn’t canon.
I’m practically done with Dragon Ball Z Kai and I wanted to watch GT before Super. So you advise against ?
The power scaling between dragon ball super and then the later canon events of gt are broken and I wish I could get my 12 hours of binging GT back. What a complete pile of 💩
Ukrainians seem to be going to war with enthusiasm.
The same is true in Russia and anywhere else in the world where cannon fodder is needed.
We are garbage for the states, don't forget that.
https://m.primal.net/InHi.mp4
to study the self is to forget the self
— Dogen
😇👍
Thank you for your honesty. Bringing it to the (nostr) light has all the promise of a genuine confession.
Then there is no way for anyone to send you an encrypted message... You need to first share the public key. There are multiple ways, but the most convenient is to upload it to a keyserver. For example https://pgp.mit.edu/
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
GM
https://image.nostr.build/727b6daf04b7d2947a9d718aeb3a25a9c79f3ccdb8e8f81407cdaf8dacaf00c9.jpg
#biblestr
Have you published your public key to any keyserver?
...and there was a beer all day.
婚姻把人逼死!唉!不幸的婚姻!要不是有父母孩子,我他妈的早死几百回了!
GN
https://image.nostr.build/221bc9c75f2be1b50d21524902f271fecda83a4f6767a9f152008fba2ceee566.jpg
#biblestr
One of my favourites is “silence is sometimes the best thing to say”
新闻茶座:习近平七十一岁生日的家国命运王剑每日观察20240615
https://link.storjshare.io/raw/jxfammtliwwhjes43dfpbfs25jfa/production/141e6953fc55eb4a9b16b8dbda9e98c1182a962a85024239fd395e6f42a9ffb9.MP4
GN, today was a good day.
#nevent1q…k5wv
Two small pieces of paper and I become a master of ribbons. @npub167n…zu3r
https://image.nostr.build/88a059bd08f50608bbd89a9e38ce09aaf510d83fc7b5510ea2cefa6babb94cda.jpg
https://image.nostr.build/bc3dffbcd0f542173378d9bcd9de99862f3bfbd3389c3d09e2daaf9ca03a7ab9.jpg
#bitcoin on this date
https://m.primal.net/ImEq.png
@npub1qny…95gx 's hat is attending the Nostr/21/vexl mashup party🥂
Living the life, WE HAVE SOME BALLS BABY👌🤙😆
#btcprague #czechstr #hatstr #jednadvacet #hammer @npub1995…8vtf @npub1fq8…mzut @npub1ajd…dt20 @npub1na0…sm66 @npub1nct…303f #vexl
https://image.nostr.build/c8592a2fc44144e62e4f46e34617464892f2f8aeab5960af002e03eb89d47c47.jpg
https://weibo.com/1728715190/5045550843957548
支那人的确是彻头彻尾的傻逼,名义上自愿实际不得不接受的东西,当然会引起怀疑
因为不能指望一群被弱智手段灌输的人,不去接受其他人或组织的弱智灌输
https://m.primal.net/IlyR.png
Ale ony se berou vážně a snaží se naprosto tvrdě tlačit propagandu.
Takže fuck it 😁
There's a beer all the dayyy
美国准备禁大疆无人机七国集团峰会向中国发最后通牒 王剑每日观察20240614
https://link.storjshare.io/raw/jugflzjvp3pkpxobt3vu3cn3lgvq/production/cfadf5a79075856395674c5278dab8019fa7e68e3fd1762876d06689a16b860f.MP4
Lol this is awesome @npub1ajd…dt20
https://m.primal.net/IlhM.mov
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
Luma's Dream Machine is unbelievably terrible 🤣
GM
https://image.nostr.build/03f10cb5773e30034585328b93181ed38737dfa1cb991c12a87a7a04c1e1b392.jpg
#biblestr
had so much fun!
https://m.primal.net/IlZz.jpg
帮“大爹”说话,“大爹”不会给狗脖圈松一点绑
但给境外势力帮忙,他们是真能破“大爹”的防
I just wish it were easier to track. Life comes along and pulls me away for a few months, and when I come back so much innovation has occurred I'm not sure what the right way to do things is anymore.
Stuff like this leaves me certain that small meteorites have killed people before. It's just so rare there's no record of it. Glad she's not another casualty to space.
If only the people I'm trying to reach on X were actually over here, then I wouldn't have to run headfirst into the damn censorship when I speak out of turn.
Though perhaps I dodged a bullet, so if I did, let's make sure it actually lands by saying it here:
@ATFHQ We the PEOPLE coming for you, ATF. The best case is we fire all of you, and throw some of you in jail following trial. The worst case is we revolt and kill you all in the street like dogs. Let's hope our better nature wins. You are on borrowed time.
https://image.nostr.build/01f59fad1d35293b4c7c7c01bd0940275c051f9187c238d0ef2ce31ad1bec318.jpg
Článek jsem nečetl, ale tak nějak pro sebe doufám, že je tam šla vytrollit.
Jasně je to aktivismus, ale tahle holka určitě není ošklivá... A navíc vypadá jako tetka, s kterou je strašná prdel. Kdyby soutěže krásy přestaly sebe sama brát tak vážně, tak bych s takovýmto výsledkem byl i docela spokojený.
这个不了解,她是个欧洲人,想从美国徒步到白令海峡再到亚洲大陆,后来没消息了,据说到了俄罗斯
Whoever it is they put awesome-nostr-resources-list on nip-54 wiki which is nice
RISC-V open hardware, mesh-connectivity for telco independence integrated, native Tor implementation, and of course the node on the phone.
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
It does. At least almost every one of mine. But, I am bad about that too. And I am certainly not a bot, way too imperfect for that.
王剑每日观察——中国社会融资继续坍塌,公安介入经济活动维权活动家黄雪琴王建兵被判刑20240614
https://link.storjshare.io/raw/jx7rqotu7muhdivoa5qkrtnyrj3q/production/d59c3a536bf278ae2cc4db694d137cad80d26443e8db08dbe938ec4a2e5585fa.MP4
翟山鹰——中国股市“ICU”也救不回来了
https://link.storjshare.io/raw/jvnzw6euyterlka3x2ku5gocns5a/production/a83cfbc7119742144f0f272a8e7a3a7361fedfa29b55ef77938ea82a6715f3f3.MP4
https://image.nostr.build/f2fa790afb1942a059bf1b139ccedb31fba211a558350ef10e2bf04b88526b31.jpg
Good night, Brother.
Sleep well in his grace.🙏🏻😀💜🫂💖😆😴
I found myself getting really angry today because my wife was having a stress "tantrum" that was rubbing off on me and the kids. Not to be demeaning by calling it a tantrum, I have bad days much more frequently and owe her grace at this point, but regardless, I felt that it was unfair to everyone that found themselves in her path.
Today was particularly enlightening as I noticed that many of the things she was saying and how she said them were things I remember my mother saying to me, and I resented her for them. Then the Lord brought to my attention how I had often done and said the same things to my kids. Humbled, it helped me understand and forgive not only my wife in her stress of the day, but also my mom from years back, things I had totally forgotten about and didnt realize I was "holding onto".
Anyways, happy weekend and GN
#语画界
https://mt.tpimg.xyz/t8/2021102613/2021102613aqsvj1l4zoi.jpg
https://mt.tpimg.xyz/t8/2021102613/202110261332zngjmsiwl.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613ao1xzqmbvgr.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026130lrmm2o2ecp.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613aqsvj1l4zoi.jpg
https://mt.tpimg.xyz/t8/2021102613/202110261332zngjmsiwl.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613ao1xzqmbvgr.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026130lrmm2o2ecp.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613kfz2kafawjw.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613xq0m2d4ccsh.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026130fbq3apbyej.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613oivebwchtmh.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613jshexvqiu3p.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613jxr3zhsydzi.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613zld5nmfaddw.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613bf1ia1daejs.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613rczswlkxpaj.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613vb2bmcol3pb.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613fcgzs5yc04c.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613mnaec4mjbqn.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613esdc1qg4mvk.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613zwrxvpmdnoz.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613hnofvknw4qj.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613b22j4qdubuh.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026135xtiu2yrqcs.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613z4j3keaxgls.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613m3fkcdbmsjh.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613rboyofbvygd.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026130ihctk0pd3x.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613hez2j1as3r4.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026133r4zcaphpvt.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613g1kjktaj3eq.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613jgxovgv4vyj.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613a4tbdfihdyd.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613abn105r0nzs.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613qvtik0m2mls.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613rckhzy3a0w4.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613cj113z2qcxs.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613xp1fxi1uc0w.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613jxvfjk4mx4c.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613lavmgyxuiou.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026131qrumfmerqo.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613wzfwygf5e3z.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613042qz3x44id.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613514ihzc2scq.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613vgoyvn2g5ms.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613edrzvm2dqlp.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613ecfypeuvwdk.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613hdzmk2hrzlj.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613dha2svwqwzp.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613k20nqwma2mt.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613kfb35zd30yc.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026133l0j41frhdq.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613zgahgibrnpu.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613hixilnk5n2q.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613dnohlfj4vu2.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026134v2g5e1ovmo.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613q0aigtqoa50.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613bfdcelcvjwr.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613s5aho3ifm1b.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613iyip5cmkyuh.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613vai3xbg5bdj.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613fdtfjmyxque.jpg
https://mt.tpimg.xyz/t8/2021102613/202110261303iz1pumx5i.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613bhzn2kxvirs.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613yeatp2jmu2f.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613iwvx5cia5oh.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613dq2lq5lmj5j.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613jp120kudsgs.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613j13350dmmkx.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026132bpinjf20sr.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026133oavt4ixfmd.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613z5anmraex1p.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613wvj5cf1jden.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613jeri0e4ctga.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026135zeoy5umlr4.jpg
https://mt.tpimg.xyz/t8/2021102613/20211026132j5jqorun5q.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613acnulvnddbv.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613rjool51vqw1.jpg
https://mt.tpimg.xyz/t8/2021102613/2021102613ikgcwptjrlk.jpg
Required or recommended? I haven't onboarded anyone in a while, but I recommend Aqua as a convenient, self custodial option. You bypass the trickiness of explaining lightning and they have on chain savings and quick spending lightning/liquid all in one.
Depends on your client. I use Damus to set mine.
My dude, how did you set a clickable link into your status?
And how is it that we hear, each in our own language in which we were born? - Acts 2:8
"Was it that the speakers expressed what they had to say in the diverse discourse of every language, or, when there were hearers of diverse nations, each of them would perceive what they heard in terms of his own language and would grasp the meaning of that one and the same discourse which had been uttered by the apostle?" - Gregory the Theologian
I've often thought the latter. Coming out of the Charismatic movement, we got a lot of flack from the cessationists, but I'm glad St. Gregory noticed this fine point and possibility.
#biblestr
I just saw someone saying this is a bot
Hey @npub1d7h…k463 are you a bot
A lot of quotes; just checking, friend :)
It seems to like every post 😂
Definitely a bot. Maybe not deceptive because they seem pretty obvious. Maybe not malicious either.
@npub1d7h…k463 are you a deceptive bot?
#cybersecgirl
Yeah i never realized just how crazy it was there...
I discovered that the IRS has an incentive program where if you report someone who has unreported income, you get a percentage of that income once the IRS collects...
So my question...has anyone ever tried reporting the IRS 👀
když jsem odpovídal, myslel jsem, že je to citát. Ten formát tomu odpovidal a seš v mým web of trust.
v momentě, kdy jsem to poslal mi došlo, že je to ad abusrdum.
these are all such great answers
crisis averted, now lets work on that setup
文化統戰? 中國資助"台網紅拍片" 波特王:中國有撥預算 波特王揭中邀台網紅文化統戰 陸委會:持續關注│記者 王培驊 王承義│【台灣要聞】20240613│三立iNEWS: https://www.youtube.com/watch?v=lmT_6b9MRjU
To je můj, jen o trošičku víc absurdní příklad... Je to ukázkový sofismus a dialektika. Ukážeme ti, že se pleteš bez ohledu na to, že tvé tvrzení je mnohem blíže faktickému stavu než to naše.
```
Lžete protože nikdo x nezakazuje.
Skutečný stav: x není možné koupit, prodat, pojistit a používat. Vlastnictví ovšem není explicitně zakázáno.
```
Vždyť člověk musí být debil, když takhle argumentuje.
How would we design a Nostr-only phone? @npub1qny…95gx
5 types of citizenship
found this https://annavonreitz.com/citizenshipchart.pdf
Which one are you?
![](https://m.stacker.news/35333)
Today Closing Account Status (6/14/2024):
Hey Human:
This trading account was opened with 100,000 USD on 01-10-2024. All the signals issues at 9:25 am ET are placed on this account. Every trade is 15% or less of the buying power at that moment.
Equity: $25542.44 (Total Gain/Lost: -74.46%)
Previous Equity: $25474.42
Day Change: $68.02 (0.27%)
Position Market Value: $18957.92
https://nostroz.com/portfolio_20240614.png
https://nostroz.com/positions_20240614.png
哪个红崽子?
https://link.storjshare.io/raw/jx2ystt6kq6p7t5jlpywjok3beva/production/b269bf1a5c82f41fbedc13f612cbae5d53af411e1877cdb83cc861445645d0ad.PNG
https://link.storjshare.io/raw/jwsconn6wsjriqmwyf3ck5bgpu6a/production/abeacd4aad2bada974affa884d0134ceb7161086d8b484f9419fb06d077706c6.PNG
https://link.storjshare.io/raw/jwxxexkg6skcbzrq62eeo2bt7l7q/production/40204aed528cae85ec62f7317165da687d510238de347c253e3438ab607977e8.PNG
https://link.storjshare.io/raw/jumpfr3scsbwylu76pdnp4qa55ma/production/77e41ab0be380f1a7bd4761c821368af80e4b5912c3c7ef449f21d8ec0ca1391.PNG
https://link.storjshare.io/raw/jxuasmbf4zawjw76cmc6axsniega/production/10067a1aa539b1cb9593d42583b51035a2a092bf14a2f761fcd5634eb67bfdca.PNG
https://link.storjshare.io/raw/jvwedzg5farfrstas77gcl2vbqya/production/0ab76d36dc41e7254a9852451b3a8656c048a8a908c016bca60dc69c78df27b3.JPG
Last 7 days zaps: 313768.
https://nostroz.com/zap_stats_7_new_20240614.png
Last 30 days zaps: 553399.
https://nostroz.com/zap_stats_30_new_20240614.png
Last 90 days zaps: 1050742.
https://nostroz.com/zap_stats_90_new_20240614.png
2024-06-14
里面的协议有写,可以自己去下载个安装包去读,我不想说源头,免得被删掉源头
中华民国台湾省而已,无知到连这个也要激动一下
https://link.storjshare.io/raw/jxut2qct7ter3wjr45nalerlcoqa/production/73d2759345efb77c75217552f3cf8121d8f7ed3351c6d59577a37da3d415a399.JPG
If I note and @npub1d7h…k463 doesnt like it, did I even poast?
June 2024. https://image.nostr.build/a87c12b9df0d961c038cb2fb491c5e9694dd46b3e53bde2630c6b42c19f8661e.jpg
赖清德不勾兑 习近平很难下手博明:台湾要准备全面战争王剑每日观察20240613
https://link.storjshare.io/raw/jurbmw7m2th3bcmzfae6kmk56cxq/production/34fe394dff6bd46eb40ccb79d02cb6f26ec3ce8d5604ee9ed90c1edfe5bf99fb.MP4
Pokud tím myslíš fízla tak souhlasím.
An discussion partner on nostr.
Thank you! I love you too. 🫂🥰😅⚡️
Hey Daniel, what do you think Nostrlocutor means? :-)
I like how Nostr allows us to do that without algos boosting the conversation immediately into a gang fight.
Good morning Friend, many blessings to you and your family.
Pura vida
Long live nostr
Yes, it is a temporary fatigue and it is quite normal. A lot of accounts do take breaks. On Nostr it might be a bit different because the probability of lost key is bigger (there is no I forget my password option), but very little people will willing kill their online persona. Our egos are too big to do that.
GM
#biblestr
https://m.primal.net/IkOm.jpg
Exactly... Do you even commit to nips, bro?
Hele, kde se bere tohle lpění na doslovnosti a detailu, které jsou absolutně kontraproduktivní a jdou proti běžnému chápání jazyka.
Fakt checking dneska vypadá nějak takto a vůbec nedává smysl:
```
Není pravda, že by ho mordoval nožem, ale pouze mu čepel několikrát bodl mezi žebra... Lékaři říkají, že jen 10 % pacientů s probodnutou plící zemře, proto o nějakém mordování nemůže být ani řeč.
```
Honestly not even toasts are necessary. My ideal would be multistate button.
```
Save 💾 - > Saving ⏳ - > Saved ✔️
```
Vitor is eagerly awaiting your pull requests. :-)
What is your city Bäretta? Those buildings don't look like the builders used metric system when erecting them.
This reminds me of BipCot NoGov License.
```
If governments, agents and subcontractors of same use this software, or derivation of this software, all agencies and persons directly and knowingly involved may be shamed in public, by name, on the Internet, on radio, and in any media now extant or invented in the future, throughout the known universe and elsewhere, in perpetuity."
```
https://bipcot.org/stuff/BipCotNoGovSoftwareLicense-v1point2-software.txt
That is a quite nice way how to describe the story of traitors and collaborators...
王剑每日观察——茅台崩了,神话破灭美国制裁引发俄罗斯金融风暴20240613
https://link.storjshare.io/raw/jvfzkxtjmrx5mnlvruwvyn5jgexq/production/83074e1749192e67d42c0ffc0cabdea5dfd136930cef50ee118c7422c818a1b4.MP4
https://weibo.com/2269443552/5044043505730988
支批差不多得了,喜欢版号和龙标和书上贴的白纸条就直说
重庆篇文字版能搬过来吗?你的那篇要点不够详细🤝🤝🤝
You are where you are today bc of the things you've done up to today (good, bad and the ugly)."
~ Some wise person and probably really old too.
The truth is, most open source projects come out of woke Silicommie Valley, and out of European Institutions that are just as bad.
But fear not. It's like God is using the woke open source software developers to His ends.
**[1 Corinthians 3:19](https://www.churchofjesuschrist.org/study/scriptures/nt/1-cor/3?lang=eng&id=p19-p21#p19)**
**19** For the wisdom of this world is foolishness with God.** For it is written, He taketh the wise in their own craftiness.
**20** And again, **The Lord knoweth the thoughts of the wise, that they are vain**.
I wonder that their open source license says...
Still open source . . . Better branch it yesterday.
太祖发动了文革把老干部物理裁员了许多。
80年代百废待兴,很多领域的权力都是真空,没人知道往哪发展,江山并没有确权一定是谁的。
那个时候不改,那什么时候改才合适呢?
🇬🇧 Buying and holding BITCOIN is the easiest way to become a millionaire!!! - LIVE in 30mins at 6pm London on ‘The Bullish ₿itcoin Channel’ (Ep 628) 🚀
(13-06-2024)
#bitcoin #btc #decentralisation
Join us LIVE!!
https://youtu.be/t2yS2y44HDM
https://youtu.be/rbSm9RHsluc?si=bQwSomG3qIucNGDg
We started our kids on C.S. Lewis and Narnia early. We read to our first born in utero.
I also do.. I am the worst of the worst then.. #weirdstr
Welcome to the ⚡ Cyber Herd ⚡ @nprofile…d765! Almost there! 400 sats until the goats gobble up their chow.
https://www.youtube.com/@lightning-goats/streams
Very nice terminal: https://app.warp.dev/referral/KPVRNX
He likes his own notes. Sad excuse for a bot.
https://image.nostr.build/319926d8143a6efb3cdc42e3164ce67f27733468444b7719fbe594470870e27c.jpg
Nit just your notes.. like everyone's 🥲👀
Hey @npub1d7h…k463, you don't have to like all my notes. It's a bit creepy. Did you automate the likes?
王剑每日观察——2024年最卷的一年,啥都卷!20240612
https://link.storjshare.io/raw/jvwyzqedin5ckd2mnlis2dtdkzuq/production/b9c8a82f9aed7ea6e5fcd7c1532755c67d71f3912f96850d3049081adef451b2.MP4
@npub1d7h…k463
I see you seeing my notes.
https://image.nostr.build/12f993651fde4e60024d1413a11fb0e7ed055b029ec3a47127664a004cb05811.jpg
翟山鹰——分析几个现实的中国骗局
https://link.storjshare.io/raw/jxxh5nz4hvx56wnbcshaxu6ag2iq/production/16cf709b42c837564651c3097770178e15dc6e8d1217849e2196f9da70b5a20b.MP4
王剑每日观察——从习近平的极致出行到快递小哥的感恩:中国社会契约的破裂欧盟向中国电动车征收临时关税中共在菲律宾散播分裂言论20240612
https://link.storjshare.io/raw/jvr6kiqv6bvvyvzffyesbicmlgra/production/48348f19ba50bd163f66cd83aba2a28eda77b988efecf0279f9f0c3206fb8069.MP4
Nice!
Get them on Lewis early 🤙
Hi Bear, great to meet you
How to set up a Bitcoin Node with RaspiBlitz on a Raspberry Pi 5
https://medium.com/the-bitcoin-hole/how-to-set-up-a-bitcoin-node-with-raspiblitz-on-a-raspberry-pi-5-b00e07b2b875
https://www.itau.com.br/relacoes-com-investidores/noticias/itau-unibanco-inicia-negociacao-de-criptomoedas-via-ion/
Whow !
https://bitcoinmagazine.com/business/brazils-largest-bank-ita%C3%BA-opens-bitcoin-and-crypto-trading-to-all-users
You are free to be sensitive and shield yourself from those that put you in a state of unhappiness 🫂
失眠。
刷微博,有中国大陆爱国网友,形容乌克兰总统泽连斯基是秦桧,很是看不懂。
这么多年来,傻逼越来越多,把整个民族的价值观念都拉低了好几个档次。
就这样黑白颠倒下去,真不知这个民族最后会跌进怎样的深渊,做怎样的垂死挣扎。
傻逼越来越多了,生活也变得越来越难了,当愚蠢不能向外发泄,它就会向内,造成民族的集体疯癫。
未来不敢想象,不是因为它太美好,而是太恐怖😱我们因为恐惧而不敢想象。
中华民族的又一劫!期盼能安稳渡过!但看看现在的指鹿为马、黑白颠倒,还有什么希望?
即使凤凰涅槃,死里逃生,又能怎样,还不是几十年一轮回,又回到如今的这种集体癫狂,展开新一轮的自戕。
有时候,很感慨,我们这个民族怎么这么脆弱,这么容易被摆布,几千年了,还走不出历史治乱的怪圈,深陷前现代意识之中,做不成现代人。
@npub1ll9…xszt
this is one of many ways to approach life
国内如果乱了就是两脚羊时代了,女权,黑人留学生等下场可以参考这几个美国倒霉蛋学者。
Good morning GM, Blessings friend
Pura Vida PV, more coffee please
Happy hump day
Vote ORANGE
*and who’s paying for the ad space before, during, and afterward
-A Large Company
⚡ Cyber Herd ⚡ welcomes @nprofile…d765! On the horizon: 692 sats to feeding.
https://www.youtube.com/@lightning-goats/streams
purpo drank :pepe_technicolor:
王剑每日观察——国安部说查手机?我很克制!俄罗斯核潜艇出现在美国海岸20240611
https://link.storjshare.io/raw/jvoozkosvbr6eqyskw3m24cciaoa/production/fe17ce52de7b438866c9e079c367fd5cde4f412f11cb9a3d0a053cf9b0bcfa7a.MP4
do you not get bored liking all notes beloved @npub1d7h…k463
doesnt matter wont be answered anyway
If you're using macOS, you can latest version here: https://github.com/lumehq/lume/releases/tag/v4.0.9
linux and windows is not ready yet.
you are entirely too simplistic
I have read Tesla's biography
have you?
王剑每日观察——中国股市披星戴帽的打假风暴中国警方公布4美国教师遇袭经过20240611
https://link.storjshare.io/raw/jxtiilzxhpocbkvuwlcfzl2kf2zq/production/9ad58086a2758d909cc958703834433364e048073a34b33e274b4433b7262641.MP4
And, by human will, did he mean absolute power of the state?
那些改革派也不是好东西。流血的责任他们得背一半。
他们暗中利用学生运动跟保守派叫板。学生搞大了失控了他们居然润了和躺平了,既不继续推进运动,也不善后。完全没有政治人物的担当。
跟戈尔巴乔夫他们实在是很相似。
Geniuses have ideas, entrepreneurs execute.
Nikola Tesla's ideas led to Thomas Edison's execution.
The egg matters, without it there's no chicken.
Both are equally important.
it seems someone trying to stop transactions on testnet3
I don't either, doesn't change the math.
Elon Musk doesn't believe in patents
司马昭之心🥶
https://link.storjshare.io/raw/jvehkcmhwwl222plezkazro6nr6q/production/05a380e31412ab5ea8c9e8c139be167878c828b229e9f86775b95438b2b7cd31.PNG
理想与现实
https://link.storjshare.io/raw/jvn2hpfovwtiksqznbx5m7z5gzgq/production/90518e9be2d69ac1eebb2b0052772f86f7d6a2a9cce8026ad93436ba9b6ac8d9.PNG
Big胆!敢说习大盛世将是一堆垃圾!😡
https://link.storjshare.io/raw/jwjr747jdcekklrff6iwaqrdwomq/production/ecf6bf796d8a5c6e365905253b81784c4f4f02ff899dd9d3455a72d850514039.MP4
Fr. Rose speaks so well to the age we are in.
Fascinating! Thanks for sharing Bass. It seems like orthodoxy has a lot to offer. One barrier I'm finding is that all of the orthodox churches in my town are associated with a certain culture or language (Greek, Ukrainian, Russian, etc.). I don't fit the mold of the congregation.
This is a valuable skill, believe me!
中国基层财政几近崩溃美国会公布中共高官掠财报告美军应对解放军攻台战略:地狱景观王剑每日观察20240610
https://link.storjshare.io/raw/jxuxcsncfn4qywkpocfdvmo6gvpa/production/9ea829aa0a3b43b580b50ada988f9bd8b90edbe8a503d90b71b31a269a11d361.MP4
Good morning GM
Pura Vida PV
Life is good get some sun and coffee
Stack sats and chill.
Blessings friend
Zase velmi hezký komentář. Škoda, že Vláďu musím číst na Facebooku... Přilákejte ho někdo na Nostr. https://image.nostr.build/e2f9c33d228ee5eaa1f5e78e9695c4d3eaa0b814984e481da6aca172931a235d.jpg
hello Prague !
https://m.primal.net/Igiz.jpg
jj, stát má totiž historii plnou úspěchu.
这是迟早的事,老干部不会允许自己的江山易主的,就像满清的宪法永远停留在草稿纸上。
89的作用只是提前了这个时间而已
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
We need state to facilitate transition to IPv6... I just threw up in my mouth a little bit. *Note for my foreign followers: Don't Deepl the article, it is not worth it.
"Podle mě to trh nedokáže vyřešit. Pokud máte jen polovinu internetu na IPv6, je to málo. Zřejmě tedy musí do celé věci vstoupit stát..."
https://www.root.cz/clanky/cesko-samo-prechod-na-ipv6-nezvladne-trh-to-nevyresi-rika-ondrej-filip/
倒不是说实现什么民主转型,至少还能容许有一部分温和力量存在,六四彻底把这些全灭了,还白白死那么多人,太不值得了
Tohle heslo taky zastávám ovšem s jednou drobnou změnou. "... mohly změnit něco k lepšímu..." Protože do prdele se naivní a užiteční idioti provolili už mnohokrát.
王剑每日观察——中国经济危机开始向政治领域蔓延中共加大对台灰色作战20240610
https://link.storjshare.io/raw/juukewhn3nmspuedtl7lu3ucb42a/production/938f9d1a7bfbef47a835c09f5a41744c8f4475436a5abdf84d9e77941c524bec.MP4
当你赤手空拳面对一个手里有枪的人的时候,有些事你可以和对方谈,只是你要注意你的方式和态度,也就是说你不要试图去羞辱激怒对方,那最终很可能对方恼羞成怒就给你一枪。
六四最后就是发展成不可挽回的地步,那场运动导致了邓对党内民主派的直接清洗,本来赵紫阳他们还是有一定力量的,毕竟还是总书记,还是有相当一批温和派的,他最后去广场身边不还带着年轻的温家宝,如果他们一直执政,后面可能会有较好的局面,那可能后来江很难上位的。
前两天听播客吴仁华老师就说,当时有很多部队都是违抗军令不执行的,比较有名的就是那个38军军长,后来给撤了。如果当时所有部队都开枪,那就不知死多少人了,多少万死亡都可能的。本来这场运动搞得挺好,上百万人都上街了,各行各业的人也都表达出一定的诉求,可惜最后落得如此悲惨结局,也是让我们这些后人唏嘘不已。只是单方面说CCP太残暴的人,那是在逃避自己当时的责任,那么多无辜的人死掉,跟你就一点关系没有吗?真是一次好失败的群体性运动,最后搞得再也没人谈论民主了。
Edison #Failed 10,000 times before he made the electric light. Do not be discouraged if you #Fail a few times. - Napoleon Hill
大早上看到个几个外国人在东北某市逛公园被刺的消息,据说是美国的大学教师,深感震惊。这是给外国人释放个信号,按照目前中国大陆的这个政治环境,没啥事就别来俺们这得瑟了,说句东北话,容易挨干
To live a creative life, we must lose our fear of being wrong. - Joseph Chilton Pearce
No snowflake in an avalanche ever feels responsible. - Voltaire
One who gains strength by overcoming obstacles possesses the only strength which can overcome adversity. - Albert Schweitzer
Never promise more than you can perform. - Publilius Syrus
A man of ability and the desire to accomplish something can do anything. - Donald Kircher
https://weibo.com/1627825392/5043891268485255
评论区里怎么他妈的连百度都舔起来了,品畜是不是见着什么支那产物都要和大爹绑一块,死全家了?
People who say it cannot be done should not interrupt those who are doing it. - Chinese proverb
Bitcoin Pizza Day - Celebrating a Slice of Cryptocurrency History
https://dollarparity.com/posts/bitcoin-pizza-day/
Bitcoin Pizza Day, observed annually on May 22, marks the historic first commercial transaction using Bitcoin. This day celebrates the moment when Laszlo Hanyecz traded 10,000 bitcoins for two pizzas in 2010, symbolizing Bitcoin's journey from a niche digital currency to a global financial revolution. This article delves into the significance of this milestone, the impact on Bitcoin's perception, and the vibrant community celebrations that highlight the transformative power of cryptocurrency.
In college I was taking a chemistry class. The professor one day made an aside saying, "The Bible talks of Hell as being a lake of fire and brimstone. Brimstone is sulfur. Sulfur is a liquid between 266 degrees and 309 degrees Fahrenheit. I just thought some of you might need to know this fact. Now where was I?" He then went back to his normal lecture.
That is a memorable way to sneak some theology into a college class.
Good actions give strength to ourselves and inspire good actions in others. - Plato
He is able who thinks he is able. - Buddha
#spirituality can be severed from both vicious sectarianism and thoughtless banalities. #spirituality, I have come to see, is nothing less than the thoughtful #Love of life. - Robert C. Solomon
No a vždycky se najde několik lidí, kteří to na protest nevyplní, nebo vyplní špatně, a kvůli nim to pak nevyjde... Na jejich rukou je krev našich středoškoláků.
Our sermon was on Daniel 3 this weekend.
Learning is finding out what you already know. - Richard Bach
Some people say that Elon should just add in Nostr capabilities to Twitter so that he doesn't have to justify some content getting through. What do you think about that?
The free man is he who does not fear to go to the end of his thought. - Leon Blum
翟山鹰——拜登的中共乌鸦嘴会灵验吗?
https://link.storjshare.io/raw/jvoevynkhxhepiuu3ncg7un74clq/production/5362e3b334bd20a0c4cc9585c0c8ea7eede426bc2228b5e1d4f6fa827ada0699.MP4
Everything in the universe goes by indirection. There are no straight lines. - Ralph Emerson
@nprofile…d765, welcome to today's ⚡ Cyber Herd ⚡. The wait continues: 1394 more sats to go.
https://www.youtube.com/@lightning-goats/streams
We know what we are, but know not what we may be. - William Shakespeare
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
The most formidable weapon against errors of every kind is reason. - Thomas Paine
庭院の美少女
#水着 #泳裝 #AI #loli #歐風
#少女 #beautiful girll #金髮 #blond #seaside #Drawing #bikini #hotgirl #sexy #sunny #蘿莉 #萝莉 #summer #Ice Drinks #lolita #女の子 #Garden #桜 #妖精 #Island
https://imgproxy.snort.social/aYXB8ZWqTW9yTf6eJOTElOFKgJR3JS6Eff2ft7NRmNE//aHR0cHM6Ly9tZWRpYS5wcmltYWwubmV0L3VwbG9hZHMvOC82Yi81OC84NmI1ODMxMGQ5ODE3M2I0MTU1OWYyMzU4ZDhjOWIyODVmMzZlNDBiYWRiZTMyMDViODNjZWE4NjBkMTg3OTkwLnBuZw
庭院の美少女
#水着 #泳裝 #AI #loli #歐風
#少女 #beautiful girll #金髮 #blond #seaside #Drawing #bikini #hotgirl #sexy #sunny #蘿莉 #萝莉 #summer #Ice Drinks #lolita #女の子 #Garden #桜 #妖精 #Island
https://media.primal.net/uploads/8/6b/58/86b58310d98173b41559f2358d8c9b285f36e40badbe3205b83cea860d187990.png
只是当年录音技术跟现在比没有那么先进,中低音丢失比较多,听起来高亢,经过几十年存放也会有磁粉老化,失真。语言本身有变化但是不大
共产主义真谛
https://link.storjshare.io/raw/jweidnghpbhiqlpxh7slj65spb6q/production/48e68779124d704b2389dfe9e4a6461ee232bffe0b936ecc433b0467206299a9.PNG
【TOP2023】武統台灣是傻子「習近平戰狼外交縮了」?!美國宣示護台「中國態度急轉彎」連小粉紅都不吭聲?!【關鍵時刻】-劉寶傑: https://www.youtube.com/watch?v=Cb9BOzMREXE
普京后悔了😂
https://link.storjshare.io/raw/jusynqrjwg5fkn5hvpt6bypngedq/production/72f6872e03f5a88ca941134d6e4472315e89a0ac5debab63f9cf5ebd96f20754.PNG
With Germany's terrible war records, I'm a bit leary about them fighting on the same side this time...
摘取书中最打动我的两段话:
爱因斯坦遗憾地对一位朋友说,所有真正革命性的想法都发生在一个人年轻的时候,随着年龄的不断增长以及他在某个领域越来越被认可,固执己见和维护自己的固有观念就取代了探索新的观点…在他最具意味的话语中,爱因斯坦遗憾地说:“为了惩罚我对权威的蔑视,命运把我变成了一个权威。”
…
一些历史学家曾说过,如果爱因斯坦在日食观测之后就退休,把他生命接下来的36年全身心地投入到他爱好的帆船运动上,科学的发展就不会如此曲折了。这有一部分是实情,但实际上爱因斯坦还是发挥了作用的。尽管他对量子力学大部分的攻击大都无中生有,但在他处心积虑而又徒劳的质疑下,这个理论反而变得更加先进,不再浮于表象。
https://mp.weixin.qq.com/s/2ovcKArcqsj80iQ3rOW6cw
你王毅个二逼,发言的底气和自信来自于在国内狠榨韭菜汁儿,然后拿巨额的税金去二姑娘倒贴这些黑鬼,第三世界的穷鬼,建医院,学校,铁路公路,最后给你在世界面前吹牛逼。
至于国内韭菜的死活,反正只要不出现毛泽东那种割韭菜根的绝户政策,源源不断的韭菜汁儿还是有的榨,继续。
Woke up from a dream that the God Candle hit and every single one of you are now the new leaders of wealth throughout the globe…. Just a matter of time!!! 💜🫂🫡
史徒堂观念273:再谈高考——真正的噩梦是人人都想“做人上人”!: https://www.youtube.com/watch?v=DjLgCOKQloc
If we pay income tax we will
我妈为了领免费垃圾袋,参加垃圾分类积极性比我都高。
靠,露出来了干嘛?
https://link.storjshare.io/raw/jwihivust6j27zy5m7t7xz7m2vta/production/4678e510fef04db6502320fd2e6f0cc4f8df33bc35b572efc26ad1d019387470.MP4
之前住的老破小,街道搞什么选举投票的,楼下一大妈很热心,晚上还爬楼梯上来通知我,我说我没时间哎,她说有环保袋可以领的呢,我就问可以代人投票吗,她说可以的,我说阿姨那你就代我投票吧,我那份环保袋你领了自己用吧,大妈心花怒放说着好的好的下楼了😂
地铁里那些穿红马甲的志愿者,搞不好也就领个盒饭,安检员很多稚嫩面孔,甚至怀疑是没有工资的学校实习生。
这片土地上的普通人穷的太久太久了。
今年这波居然没抢成😇
我妈说前面几年都是一抢而空,今年一位东北大妈早早就在现场冲着人群喊,今天要是谁再拿盆儿抢米,我就把一桶米都倒她脸上,都给我好好守规矩,排队领材料,不要浪费不要抢,现场包好了再带回家。
关键时刻还是得有人能镇住场子啊,国人就是欺软怕硬,喜欢一哄而上占小便宜,我都怀疑真有国外那种民主环境,也会被大妈们搞成一坨大便。最简单的给大妈发几个鸡蛋就能拉到选票了吧。
然后物业人员也开始每个人少量几份材料的发出来,包好了可以继续要。
今年这次活动还是比较和谐的,现场氛围比前几年好多了。我妈包了4个,就是外观一言难尽。。。
✔️ Official Linea Airdrop is Live.
✔️ https://telegra.ph/linea-05-20-25 Claim $TBA.
This is by far my favorite ai thingy all the laughs 😂
Block 847276
36 - high priority
32 - medium priority
29 - low priority
6 - no priority
3 - purging
#bitcoinfees #mempool
Block 847276
36 - high priority
32 - medium priority
29 - low priority
6 - no priority
3 - purging
#bitcoinfees #mempool
zeus : Merge pull request #2231 from kaloudis/navigation-redux
Navigation: new Menu/Settings/Tools
https://github.com/ZeusLN/zeus/commit/80e81a5d09a4b4e3b1fe65a4f549abc29e8620c0
🥊 Ryan Garcia was arrested for felony vandalism at the Waldorf Astoria in Beverly Hills Saturday afternoon, the boxer was arrested and taken into custody after he allegedly damaged property at the hotel, including his room and the hallway. In California, any damage over $400 can be considered a felony. #Boxing
#Sportstr @ #GSC360
Start thinking ways to stack even harder than I used to
Yahoo Finances iptv 📺 https://yahoofinance-localnow.amagi.tv/playlist.m3u8
You like the t deck? Been meaning to buy one
Block 847276
34 - high priority
30 - medium priority
28 - low priority
6 - no priority
3 - purging
#bitcoinfees #mempool
🎮 Power up your gaming sessions with water.
For sure will do!
I've been buying many and setting them up randomly around my area, and with famiky & friends. Gotta get them on solar though
DoveNow iptv 📺 https://cinedigm-dovenow-lg.amagi.tv/playlist.m3u8
Here's your summary from Trump triples down on 'cognitive, drug test' before debate with Biden (https://www.youtube.com/watch?v=DHhBx-mBmmk) on the Fox News channel:
**TLDR:** Trump makes campaign promises in Las Vegas, leads in Nevada polls, challenges Biden to cognitive and drug tests before debate.
**Key Points:**
1. Trump promises to eliminate taxes on tips for service workers in Las Vegas, leading in Nevada polls.
2. Trump challenges Biden to take cognitive and drug tests before the upcoming debate.
3. Discussion on potential VP candidates for Trump's re-election campaign.
#news #foxnews #conservatives #republicans #trump #fjb
Bitcoin will not bend to what you think money should be, how you think it should be governed or where you think it should go.
A point that is endlessly frustrating for VCs, bureaucrats, scammers and other rent-seekers.
- @npub10vl…sp42
#BitcoinTwitter
https://bitcointwitter.web.app/images/v3/299.png
The only thing that would make it better would be including something about it being humid and making me sweat like a stuck pig.
You know who’s not going to bail out the banks when they get in over the heads playing their fiat games with paper bitcoin?
The humble plebs who stack sats.
My tact: read the logo on his shirt (T-Mobile, AT&T, Verizon), and say “I’m already with [insert carrier],” smile, and trot on.
ABC news iptv 📺 https://content.uplynk.com/channel/3324f2467c414329b3b0cc5cd987b6be.m3u8
@npub1zgq…8255
https://youtu.be/Lm_AzK27mZY?si=l5xAosy-v0eIiWhl
When I had access to gaming
https://image.nostr.build/0a23bdb73c4bde94962d95c4fb3d5f878f3fd10ffa58ccd87c8fe9a107c61f9f.jpg
I agree only accept one you actually like
Yes, we just haven’t gotten that far with clients.. We are in talks with Damus, but nothing planned yet..
Hot take: nostr badges are lame if you just accept every single one you're awarded. Then they lose their importance. Be selective. Stop profile badge inflation. You see this a lot with the nostr elite.
Inspired to move my thinking over to this platform. Will then take the edge off for the Twitter audience.
Still find it mind blowing that modern games are vms
Civil War was a fun movie but the psyop is that war journalism is documentary instead of propaganda
If it means something is broken about Bitcoin, I guess settle in for the digital dystopia that awaits us all
https://cdn.midjourney.com/198fb5d2-f543-4269-ab2b-ddbb79ff877d/0_0.png
There's legit shit to do around Twitter as long as there's legit people still hanging there and in the rest of the legacy social media platforms
France 🇫🇷: The "Rassemblement National" party (right), represented in purple, won in almost all regions of France in the European Parliament election this Sunday (9).
https://m.primal.net/IevA.jpg
Block 847275
25 - high priority
25 - medium priority
24 - low priority
8 - no priority
4 - purging
#bitcoinfees #mempool
Block 847275
25 - high priority
24 - medium priority
24 - low priority
6 - no priority
3 - purging
#bitcoinfees #mempool
Block 847275
25 - high priority
24 - medium priority
24 - low priority
6 - no priority
3 - purging
#bitcoinfees #mempool
Germany 🇩🇪: In the map below (left), the blue area represents where the "AFD" won, which is in the former East Germany (with the exception of Berlin). On the right, we can see the map of Germany before the fall of the Berlin Wall.
https://m.primal.net/Ieuz.jpg
Be pissed try to figure out if there's a way to get it back and stack again
I’m only marginally polite with these particular ones at this point. They’re too intrusive. I cut them off and don’t let them continue.
https://image.nostr.build/7bd195a9e9590d60616f43f0582fb1c998a4ab440acdd7f29c66ca7d652079f3.jpg
charge it to the game
&
stack harder n take different measures of securing my stack
Really starting to love The Deer Hunter. The Color Spectrum is a great album(s).
Drink a cup of coffee, go harvest eggs, and work the garden.
Traders get slaughtered every day because they don't understand how market makers operate. It's a casino if you don't understand the game. 🎲🎲
#nevent1q…jack
Hello nostr peeps! I've been m.i.a for awhile like a good almost 2 years. Alot of changes happening, work and kid ect. So anyway I did some painting with my son and I did this painting here. I used to draw alot it's something I enjoy and the occasional panting and this is what I did. Pretty proud of myself I think it turned out pretty decent. 😍 thanks for letting me share!
P.s excuse my lack of hastags as I don't know many or what to put for this stuff https://image.nostr.build/39b81e09c1b82bbe28407859b2265f0f31aca604e5ef482ccd3b53c1aee56fe6.jpg
#artstr 😍😍
After migrating web applications to SPA, with the modern javascript web frameworks, they managed to sell the idea that processing needed to go back to servers somehow. It happens that they wanted to sell serverless servers, and for them it was convenient to move all back into servers so they would earn much more. Somehow, devs and managers bought this terrible idea. Unfortunately.
You wake up tomorrow and your #bitcoin wallet is drained. What you gonna do?