Avatar
Matt Lorentz
d0a1ffb8761b974cec4a3be8cbcb2e96a7090dcf465ffeac839aa4ca20c9a59e
Technologist, solarpunk, gamer, backpacker, passionate about using the internet to push more power to more people.

I read over the “Why Bitcoin Needs a Rebrand” article in the new Bread zine from nostr:npub1cashappn03s3cl2ljsdntv0v28e2um5lgx4vjctqjt23pcwzjhsqmtdg5l. There’s definitely some truth to it but it didn’t bring out the thing that often puts me off the most about “Bitcoiners” - the extreme individualism.

I like Bitcoin and I’m obviously passionate about decentralized tech. But I think there is a dark side of “freedom tech” where some people lining up under the banner of “freedom” are looking for freedom from responsibility, not freedom from tyranny. I’ve seen this in the hate we’ve gotten at Nos.social for building decentralized moderation features. Nostr users blast us for building tools that give our users the *freedom* to listen to who they want. For these people freedom of speech isn’t about freedom to speak subversively to those in power, it’s about freedom from consequences, and anything else is “censorship”. It’s about freedom to harm others in settings where they don’t feel at risk themselves.

I’ve grown up in America on rugged individualism, but the trajectory of my worldview over the past few years is moving decidedly towards communalism. I want to see the same shift in Bitcoin. Where are the Bitcoin mutual aid tools? Social key backup? Cooperative financial institutions? This is a big part of what excites me about Nostr tech: it’s social, it’s based on relationships and trust, so it’s a great foundation for building these types of convivial tools. I want the new Bitcoiner to be into potlucks, farmer’s markets, and family.

Replying to Avatar daniele

An user just informed me that he burned his nesc: he opened Iris.to to test it, pressed "Sign Up" and filled in the only input in the form, which actually asked for the *name*. So his nsec has been scattered and leaked to all the default relays... .

Of course, the error is quite silly because the top text, "What should we call you?", is clear. But it is understable if you are overthinking and are used to seeing the nsec login as the first input. In fact I already saw in the past days a couple of profiles with an nsec*** name, and now I probably know why.

This led me to reflect on a simple UI best practice that can mitigate this sort of problem: filtering.

- If you are developing an app, check and filter the inputs, preferably client-side: if the user pastes a nsec in a non logical place (name, bio, pubkey field, etc.) reject it. When composing a note, it could make sense to ask for confirmation, highlighting the risks. The same confirmation procedure should work well for hex keys.

- If you are developing a frontend toolkit, you can probably help to automate the previous point by offering different input/textarea types with built-in validation.

Side thought: it is easy to confuse "Sign Up" and "Sign In". "Login" and "Create account" seem like a more distinctive and effective labeling. The mentioned user began to fail in this first step, thinking he was logging in, when he was instead going through a registration process.

Let's make Nostr easier and safer.

/cc nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49

#nostrdesign

Maybe he’s a good candidate to test Pablos key migration NIP.

Replying to Avatar 🌬⚡️Agron

Thank you 💜⚡️🫂

BilligsterUser

nostr:npub14a93ehrzfgd73uclhans95xcwdqsselevat42cqa30q73nacfnussnlgen

Pablo nostr:npub1l2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqutajft

Cameri nostr:npub1qqqqqqyz0la2jjl752yv8h7wgs3v098mh9nztd4nr6gynaef6uqqt0n47m

Mike Dilger nostr:npub1acg6thl5psv62405rljzkj8spesceyfz2c32udakc2ak0dmvfeyse9p35c

Will nostr:npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s

Fiat Jaf nostr:npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6

Kieran

nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49

Calle

nostr:npub12rv5lskctqxxs2c8rf2zlzc7xx3qpvzs3w4etgemauy9thegr43sf485vg

Vitor

nostr:npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z

Hodlbod

nostr:npub1jlrs53pkdfjnts29kveljul2sm0actt6n8dxrrzqcersttvcuv3qdjynqn

Koala Sat

nostr:npub1v3tgrwwsv7c6xckyhm5dmluc05jxd4yeqhpxew87chn0kua0tjzqc6yvjh

Martti Malmi

nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk

Henry

nostr:npub1xv6axulxcx6mce5mfvfzpsy89r4gee3zuknulm45cqqpmyw7680q5pxea6

Ben

nostr:npub10000000thpep7auj058803nqtymqlf3rw87lzhe6mkfeywnpxg5sjw7nql

Rock

nostr:npub1yauhh489aefdkzsewe5vj2u68elzxlsln7nn5yxr34e3c22vljdqkn7h9m

Roberto

nostr:npub1uapy44zhu5f0markfftt7m2z3gr2zwssq6h3lw8qlce0d5pjvhrs3q9pmv

Iefan

nostr:npub1cmmswlckn82se7f2jeftl6ll4szlc6zzh8hrjyyfm9vm3t2afr7svqlr6f

Semisol

nostr:npub12262qa4uhw7u8gdwlgmntqtv7aye8vdcmvszkqwgs0zchel6mz7s6cgrkj

RooSoft

nostr:npub1alyr7qwglvcfmukgse4cc7fyej9k7pvq4lw7r4hpdc4kzp7zsckqmy0qkx

Vivek

nostr:npub1ltx67888tz7lqnxlrg06x234vjnq349tcfyp52r0lstclp548mcqnuz40t

Brugeman

nostr:npub1xdtducdnjerex88gkg2qk2atsdlqsyxqaag4h05jmcpyspqt30wscmntxy

Miljan

nostr:npub16c0nh3dnadzqpm76uctf5hqhe2lny344zsmpm6feee9p5rdxaa9q586nvr

Zach Meyers

nostr:npub1zach44xjpc4yyhx6pgse2cj2pf98838kja03dv2e8ly8lfr094vqvm5dy5

Nostr Build

nostr:npub1nxy4qpqnld6kmpphjykvx2lqwvxmuxluddwjamm4nc29ds3elyzsm5avr7

Terry Yu

nostr:npub1yaul8k059377u9lsu67de7y637w4jtgeuwcmh5n7788l6xnlnrgs3tvjmf

Rockstar

nostr:npub1j8y6tcdfw3q3f3h794s6un0gyc5742s0k5h5s2yqj0r70cpklqeqjavrvg

Rabble

nostr:npub1wmr34t36fy03m8hvgl96zl3znndyzyaqhwmwdtshwmtkg03fetaqhjg240

Matt Lorentz

nostr:npub16zsllwrkrwt5emz2805vhjewj6nsjrw0ge0latyrn2jv5gxf5k0q5l92l7

Vivek

nostr:npub1ltx67888tz7lqnxlrg06x234vjnq349tcfyp52r0lstclp548mcqnuz40t

Stuart Bowman

nostr:npub1lunaq893u4hmtpvqxpk8hfmtkqmm7ggutdtnc4hyuux2skr4ttcqr827lj

Fishcake

nostr:npub137c5pd8gmhhe0njtsgwjgunc5xjr2vmzvglkgqs5sjeh972gqqxqjak37w

Jeff G

nostr:npub1zuuajd7u3sx8xu92yav9jwxpr839cs0kc3q6t56vd5u9q033xmhsk6c2uc

Karnage

nostr:npub1r0rs5q2gk0e3dk3nlc7gnu378ec6cnlenqp8a3cjhyzu6f8k5sgs4sq9ac

Tijl

nostr:npub1q7klm2w94hyq3qdm9ffzpahrrq0qcppmjrapzhz0rq6xgq3fdrnqr6atmj

Santos

nostr:npub1kkumsnghywv56pspxcrzyla4hy0em6yzpvzvlpydrhxvy0g9fuusyqgewf

Dread

nostr:npub1u0uch7uuh6m4vwsnnxpkqtjs7ctvkl4mqmpjjkuwudmn9rc9zgrqx6rrgt

nostr:nevent1qqszw66qvweena9haz8rrnxtsh9frxztgffnv4fltpq98sf4fvdputspz3mhxue69uhkummnw3ezummcw3ezuer9wcpzq5xeflpdskqvdq4swxj59793uvdzqzc9pzatjk3nhmcg2h0js8trqvzqqqqqqy37s6pz

You’re welcome. It’s a privilege to be one!

Replying to Avatar Chris Messina

nostr:npub1eu5yg8uclgwnqgvgxmt59kn674qmws0qsqdl4fdvx480cq7xraaq943nau similar to the NASCAR problem again though... how should one pick a client if they don't have one yet?

I like the way nostrapp.link randomizes the order of apps at least. https://nostrapp.link/#note18mw2n6knpurzscaw9uwewewe0kgzsztnck5p3f2q72sa0sacty2s9nqmhh

Replying to Avatar Chris Messina

nostr:npub1eu5yg8uclgwnqgvgxmt59kn674qmws0qsqdl4fdvx480cq7xraaq943nau similar to the NASCAR problem again though... how should one pick a client if they don't have one yet?

What does this have to do with Nascar?

Counterpoint: a website already exists at nostr.com, it is the top search result, people are going to be looking at it so it’s in everyone’s best interest to make it great. It doesn’t need to be overly official.

Replying to Avatar The Nostr Report

Happy Sunday #Nostr !

Here’s your #NostrTechWeekly newsletter brought to you by nostr:npub19mduaf5569jx9xz555jcx3v06mvktvtpu0zgk47n4lcpjsz43zzqhj6vzk written by nostr:npub1r3fwhjpx2njy87f9qxmapjn9neutwh7aeww95e03drkfg45cey4qgl7ex2

The #NostrTechWeekly is a weekly newsletter focused on the more technical happenings in the nostr-verse.

Let’s dive in!

## Recent Upgrades to Nostr (AKA [NIPs](https://nostr.com/the-protocol/nips))

#### 1) (Proposed) [NIP 93: Backwards compatible alt-urls](https://github.com/nostr-protocol/nips/pull/898/files?short_path=fd2cd15#diff-fd2cd155c91bd66e592a02a4f3a9e51dc6407a9303aa0b6503dd818e096d6748)

Links break, blogs get moved, domains get changed, and companies go out of business. These can all lead to situations where content on Nostr may get stale because links in notes are stale.

This proposal introduces a concept of alt urls for links in notes. When first publishing, that helps create multiple pathways in case one link is broken.

What’s really interesting is being able to correct broken links after a note is published. Since most Nostr events can’t be updated, users can instead submit a kind 4001 event referencing the original event and propose alt-urls. This could be done by the original author or good samaritan users helping keep Nostr content up to date!

Author: nostr:npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6

#### 2) (Proposed) [NIP 88: Recurring Subscriptions via Zaps](https://github.com/nostr-protocol/nips/pull/866/files?short_path=4acc993#diff-4acc99394b74a02b02b2f272bf8c388759d5530cf9bfdf98a2fdeb3f938097b7)

One of the most powerful things Nostr could provide to content creators is a better way to get paid with fewer middlemen and much lower fees. This proposal from nostr:npub1l2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqutajft uses Zaps as the foundation of a Patreon-style subscription for content creators.

Content creators can publish subscription tiers (and their prices) as a kind 37001 Nostr event. Then subscribers can publish a “subscribe” event indicating they want to enroll in one of the subscription tiers.

Users will then pay the subscription fee via Zaps, which can be verified by the content creator. Finally users can publish a “stop subscription” event to indicate they will stop paying and receiving benefits from the content creator.

To make this easy for all involved, there will likely need to be substantial client work to help content creators facilitate their subscription tiers, verify subscriber payment, and distribute paid content automatically so they can focus on the content creation itself. But this would be a tremendous improvement over Patreon just on lower fees alone.

#### 3) (Proposed) [Rewrite of NIP 46: Nostr Connect / Remote signing](https://github.com/nostr-protocol/nips/pull/831/files?short_path=2f86a4e#diff-2f86a4e0d293b96d9dc35407ffb27c3236297b1f754e26a222571297a605b66e )

Nostr Connect (not to be confused with the Nostr Connect Chrome extension mentioned later in this report) is an attempt to give users complete self-custody of their Nostr private keys, where they won’t need to enter the private key into any client, while still making day-to-day Nostr operations easy and convenient.

In this model there is a “remote signer” which may be a hardware device or a different app on a mobile device, and clients will work with the remote signer to perform operations where a private key is required (decrypting DMs, signing Nostr events, etc).

This rewrite of NIP 46 simplifies the protocol while taking into account real-world learning since the original introduction of the NIP. There is an explicit eye towards helping codify what nsecBunker has to offer. It is a huge improvement to security, privacy, and the ease of self custody.

Author: nostr:npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6

## Notable Projects

#### [Shipyard as a DVM](https://w3.do/uH5biqDl) 🚢

Shipyard is a project that gives more robust publishing tools to content creators (scheduling posts, reviewing and responding to mentions, etc). nostr:npub1l2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqutajft is working to make Shipyard a DVM so that clients can provide the “schedule post” functionality to users without having to build it into the client itself.

#### [Nostr Connect Chrome Extension](https://w3.do/wqL1mweD) 🔒

Every time I am asked to give my private key to a Nostr app, I cringe. For mobile apps I know there’s not much support for remote signing yet, but for web-based clients we should all be able to use a browser extension. Up until now they haven’t been the best design or nicest to use browser extensions. nostr:npub1zfss807aer0j26mwp2la0ume0jqde3823rmu97ra6sgyyg956e0s6xw445 changed all that!

This chrome extension is much better designed and it’s far easier to manage permissions that you’ve granted to various clients in the past. It quickly became my daily driver for web-based Nostr operations. Great work!

#### [140 Character Relay](https://w3.do/9qedXnUC) 🐦

The original Twitter restricted content to 140 characters, and that form factor facilitated a unique set of content creation. Whether it’s nostalgia or a desire to see if going back to 140 characters would help recreate the unique feel of early Twitter, we now have a relay that enforces all notes to be 140 characters max.

Author: nostr:npub1l2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqutajft

#### [TrueVote](https://w3.do/JUPp9LDG) ☑️

Using the combination of Nostr and OpenTimestamps (therefore Bitcoin as well) TrueVote creates a decentralized, verifiable voting system.

From what I can tell, folks can submit votes via a Nostr event (signed by your private key to verify it was you doing the voting), with timestamps verified by OpenTimestamps to ensure the vote happened when the Nostr event claims.

As outlined in [Nostr is Bitcoin’s Layer 3](https://www.youtube.com/watch?v=8oPdYu5hbVg) talk from NostrAsia, this application of Nostr highlights how Nostr seems to be the missing link for freedom tech. Bitcoin is great for payments and immutable history (for example: timestamp assertions) but it is missing the identity and coordination layer.

Nostr in the context of TrueVote unlocks the certainty of “one Nostr account, one vote” which can be incredibly powerful for many applications. As long as the person conducting the vote whitelists who can vote, this is cryptographically secure as well as transparent (votes can be conducted in public and verified by all).

Fascinating to see this in use.

Author(s): nostr:npub1u8um5vstlax9p60644zygvhc7w5mkzfyhwyvj453l3j7l9mrf5rspnc3c3

## Latest conversations: Custodial Solutions

With the recent news about Wallet of Satoshi pulling out of the US market, it’s important to keep the topic of custodial solutions top of mind.

Custodial solutions (for Bitcoin or for Nostr) offer immense benefits for ease of use and convenience, but they are susceptible to all kinds of interference that may leave users holding the bag.

#### Ideally we only need self-custody

Self-custody maximizes freedom: freedom from fraud and rug pulls, freedom from the whims of a regulatory environment, freedom from reliance on third parties that may just go out of business.

Ideally, everyone would self-custody all the important things: money, data, their home, their food, and their water. But doing so is incredibly expensive, time consuming, and requires expertise. Humanity is able to support a population of 8 billion people because of the specialization of labor. At some level we end up trusting others with important aspects of our lives.

Technological advances and engineering effort allow humanity to grow AND decentralize. Bitcoin is a breakthrough that makes it possible to decentralize money and enables self-custody of one’s life savings. Nostr is making it possible for people to self-custody their data and still have all the conveniences of modern digital life.

Whether they be used for Bitcoin, Nostr, or anything else, custodial solutions are the backup until we’ve engineered solutions good enough that the average person can easily self-custody.

![Rita deciding when to put her zaps in cold storage]()

#### How to spread freedom tech

The goal of building freedom tech should be to make freedom accessible to more people. If we build solutions that increase access to financial or communication freedom, then that’s progress. Just because that number isn’t 8 billion doesn’t mean it’s not progress.

Custodial solutions for things like Bitcoin and Nostr make freedom *more* accessible to more people. If given a choice between a million people using a custodial lightning wallet or not using Bitcoin at all, I’d argue you’d rather they use custodial solutions for the time being. We can always draw them towards self-custody later.

It remains a noble goal to get everyone to self-custody, but it requires work to build self-custodial solutions that work for average people.

#### Building easy self-custody takes work

There are ways to make products that are as easy to use as custodial solutions and still give the user complete control. They just take orders of magnitude more work to build.

Self-custodial lightning wallets like Phoenix, Breez, Blixt, and Mutiny Wallet are good examples. They have done a ton of the work to make a lightning node friendly to operate, which means that more people will have access to self-custodial lightning.

Before these solutions you’d have to run a Bitcoin full node, then set up your Lightning node, and manage channels with Thunderhub or RideTheLightning or other lightning management apps. It’s a lot of work! Far more people can now run self-custody lightning because of their work. It’s far easier so people are more likely to try it, and eventually adopt it deeply.

There’s still more work until someone non-technical in my family could use self-custodial lightning without needing help, but this is real progress for freedom tech.

#### Nostr: self-custody that’s great

Nostr is inherently more self-custodial than any existing social media. Your private keys control access to your data, you can move your data from one relay to another, you can download backups any time, and you can control what clients can do with your data.

Any use of Nostr is head and shoulders above existing social media. There are some folks offering more custodial or centralized services within the Nostr community (opt-in moderation, custody of keys, hosted relays, etc), and that’s ok, because those are the first step in building something average people can adopt.

Every single day there are Nostr devs putting in the work to make self-custody of your life on Nostr easier, so that more people have full access to the freedom that’s possible via Nostr. In the meantime, we may need to tolerate some more-centralized solutions to bootstrap the user growth and economic activity necessary to fund the next wave of improvements.

## Until next time 🫡

If you want to see something highlighted, if we missed anything, or if you’re building something we didn’t post about, let us know. DMs welcome at nostr:npub19mduaf5569jx9xz555jcx3v06mvktvtpu0zgk47n4lcpjsz43zzqhj6vzk

Stay Classy, Nostr.

Thanks for the great writeup Greg! These are so useful on weeks that I am heads down in development.

Replying to Avatar p2x

nostr:npub1wmr34t36fy03m8hvgl96zl3znndyzyaqhwmwdtshwmtkg03fetaqhjg240 was seen in PEI, Canada in a little town named Souris 😆

He’s got a coffee shop here too

Finally finished listening to this lecture on fructose and high fructose corn syrup. It took me a few sessions but I’m glad i took the time. I knew high fructose corn syrup wasn’t good for you but Dr. Lustig’s arguments that it is a toxin were very convincing. We don’t eat a lot of the stuff but I’ll definitey be working harder to completely remove it from my diet now. https://youtu.be/dBnniua6-oM?si=S-NDsbU1EDrnQip7

Oh yeah that seems like a huge flaw in 94. Maybe we should edit NIP-94 and let people just put all those tags like `blurhash` on kind 1 or any other event.

Also we really need an ID for finding media when all these files are no longer at their original locations. I don’t care if it’s sha256, torrent info hash, or something else.

nostr:npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s is the “imeta” tag Damus is using documented in a NIP somewhere? I can’t find it.

It's a little embarrassing, but Nos has never had paginated feeds. This means all the feeds you see are really only downloading the last 100 or so notes from relays and if you try to scroll farther than that you will have a bad time.

Well this week I'm finally fixing that, and I just scrolled back through all my Nostr notes, with good performance, and got all the way back to my first: note1v3k65t6a9kvsmjv0k59xe6x7vhthgxwwu6yaw9fujysht6zu49wss8tx8p

Feels like a big achievement! Nos was written as a demo for Nostrica, and everything we've added to it has been coded up hastily as an experiment/exploration. With our new funding from nostr:nprofile1qqsgydql3q4ka27d9wnlrmus4tvkrnc8ftc4h8h5fgyln54gl0a7dgspz9mhxue69uhkummnw3ezuamfdejj7qgcwaehxw309aex2mrp0yhxxatjwfjkuapwveukjtcpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszree88 and longer runway we can take the time to build something nice. It feels really good.

Replying to Avatar xiangcai

yes

Ok I think I see the issue. It should be fixed in the build 94, which should go out on Monday at the latest (hopefully earlier).

Replying to Avatar Rif'at Ahdi R

Thank you nostr:npub16zsllwrkrwt5emz2805vhjewj6nsjrw0ge0latyrn2jv5gxf5k0q5l92l7 for looking this.

>Is your relay adding content warning tags?

No it didn't. It will make new classification event tagging event id and pubkey of author (kind: 9978) with classification labels (Language, toxicity, etc). Actually, i want to change and migrate that into NIP-32 format instead of custom kind 9978 like now.

I think i really need to draw some flowchart later to explain but did not have time yet. I'm sorry hopefully this can explain a bit 😅

How it works:

1. nostr-filter-relay will run several softwares: atrifat/nostr-monitoring-tool, atrifat/nostr-filter, and hoytech/strfry relay in launch script at startup.

2. nostr-monitoring-tool is classification tool that fetch and subscribe notes (kind: 1) from various relays. It will process every notes (extraction of image url, text preprocessing) it seen and send it into external AI classification tool. Currently it will send processed notes content into NSFW Detector API instance (using atrifat/nsfw-detector-api), LibreTranslate instance, and Hate Speech Detector API instance (using atrifat/hate-speech-detector-api). All three API will give classification results (NSFW class, Language class, Toxic classification) that will be saved as custom kind 9978 in local strfry relay that has already been running. Data format shown in atrifat/nostr-monitoring-tool in github.

Basic Data flow:

source relays (notes) -> nostr-monitoring-tool (connect to external API for classification) -> local strfry

3. Now, using classification data (kind: 9978) saved in local strfry relay, atrifat/nostr-filter will act as proxy relay and intercept any REQ from nostr client and forward them into local strfry relay. Local strfry relay will respond as usual by giving events based on REQ back to nostr-filter. Before sending events back to nostr clients, nostr-filter will check events from strfry whether it has classification data (kind: 9978) or not. For example users set nostr-filter-relay parameters to only gives notes which has "English" language then nostr-filter will only gives those notes using classification data. Any non "English" notes will be skipped.

Basic Data flow:

nostr clients <-> nostr-filter (act like frontend proxy) <-> strfry

4. Nostr client will get filtered events (Real data from strfry are 2000 notes but filtered into 1500 "english" notes) and show that to users.

Very cool! I see the whole picture now. How did you get the content warning showing in Amethyst? Did that note just happen to already have a content warning on it? We are using a more robust ontology for content reports than what is defined in NIP-56. I’d be interested to hear your thoughts on it and whether or not it would be useful to you. https://github.com/rabble/nips/blob/724e05e762a634e501bdcf6cbefaa91f99b1903b/69.md

Here is what we publish when you report someone in Nos:

{

"content": "This content has been reported for Spam using NIP-69 vocabulary https://github.com/nostr-protocol/nips/pull/457",

"id": "03fdb75f9a8c927247cc4fc20abb419bb02932e615f056f67971e6cb8d073e09",

"tags": [

[

"L",

"MOD"

],

[

"l",

"MOD>SP",

"MOD"

],

[

"e",

"79123c0f6e54b330c8e1abba7ef5d6919ae493b072dcac7b603cada5f54bf4d3",

"spam"

]

],

"created_at": 1697565603,

"kind": 1984,

"sig": "5de629322692f102b85a8fc9921ce75b0f78fa3d4ff6f1d5cc69a777a75e6761b3448a689e1799d5d7e1f03aedad709910df03d2800e9801a8c9368841f46858",

"pubkey": "b1e4418e15a3660b5fa29e15e9e543427f2b3969617136be76072c7d674779a2"

}