Avatar
Alejandro
c8df6ae886c711b0e87adf24da0181f5081f2b653a61a23b1055a36022293a06
Building tools for a Nostr agentic ecosystem. Founder at nostr:npub1nar4a3vv59qkzdlskcgxrctkw9f0ekjgqaxn8vd0y82f9kdve9rqwjcurn

Is the assumption that bots can’t get NIP-05 addresses because paying a few thousand sats is not scalable?

I honestly don’t know. Just wondering

The strategic oil reserve is called strategic for a reason. It’s meant to be used at war or in the event of a major disruption in the oil supply chain.

It is not meant to be used for political reasons like hiding the real inflation and by doing so, this administration is putting the national security at risk. Exactly at the same time that they’re playing war games with Russia.

Replying to Avatar PABLOF7z

📢 NDK 1.0 is out!

Codename: Outbox ✅

When I set out to write NDK my main goal was implementing the gossip protocol, now known as *outbox model*. I wanted nostr applications to have decentralizing tendencies by *default*; transparent to the developer.

After a few failed attempts, it's finally here, which, paired with a bunch of non-backward compatible changes, prompts me to do a major version bump.

# What is outbox model?

In short, the outbox model allows nostr to fragment, instead of everybody coalescing around a few popular relay and using things like Blastr. Nostr simply doesn't work without the outbox model.

# Main changes:

* Outbox model support, obviously.

* `fetchEvent(s)` is now faster, (particularly with queries using exclusively `ids` filters).

* Fixed unstable relay back-off code (credit goes to nostr:npub1az9xj85cmxv8e9j9y80lvqp97crsqdu2fpu3srwthd99qfu9qsgstam8y8 for the valuable testing infrastructure)

* Defaults to blacklisting wss://brb.io #censorship (credit goes to nostr:npub1az9xj85cmxv8e9j9y80lvqp97crsqdu2fpu3srwthd99qfu9qsgstam8y8 for the widely hinted-at dead relay)

* Subscription aggregation now works when multiple filters run at the same time

* Subscriptions that should close when EOSEd are now closed when each individual relay EOSEs instead of waiting for all of them to EOSE.

* A better algorithm on when to signal a subscription's EOSE. The margin that NDK now gives to relays to EOSE is now a function of how many of the connected relays in the relay set have EOSEd (accounting for relays that are still sending events).

* There are *many* more changes that I needed to do to accommodate for this that I don't remember now.

Some of the most glaring breaking changes:

* `ndk.subscribe` now defaults to keeping the subscription alive; the default of closing subscriptions on EOSE was bothering me

* NDKUser changes the `hexpubkey` from a function to a getter, so wherever you were using `user.hexpubkey()` needs to change to `user.hexpubkey`.

# Enabling outbox model

Outbox model comes disabled by default *for now*, as soon as I test it more throughogly it will be the default.

To enable it you need to instantiate NDK with:

```

const ndk = new NDK({

explicitRelayUrls: [...],

outboxRelayUrls: ["wss://purplepag.es"],

enableOutboxModel: true,

})

```

The outbox model will largely be transparent to you and will work on the background once you enable it.

Pablo is The Machine.

I think you will enjoy the episode called Air of the Netflix documentary “Cooked".

Imagine a marketplace of algorithms. Plug-ins that you choose to install. You can have multiples at the same time and switch back and forth between them base on what you want to see. nostr:note1u6sn93a6ytgug4g47dq857cuzxm5a83xw9l83nel9xcn2dxge2asaeyr36

Replying to Avatar miljan

Dust has finally settled on the “Primal censorship” drama. That’s good to see, but I don’t want to sweep this episode under the rug. It is probably appropriate to do a post mortem, assess what has happened and see what we can learn. Let’s make sure that Nostr is a better place after this episode.

Two weeks ago, Primal’s trending algorithm was attacked by bots. The attacker generated hundreds of thousands of reactions, propping his note to the top of our trending feed. At the time, our only defence was a simple “can’t trend” list, so we put the attacker on it. He immediately posted on Nostr, accusing us of censorship, but his note never took off. The attacker then selected a few well liked Nostr accounts and started stuffing the ballot box for them. We saw a bunch of bogus notes with massive bot engagement, so we resorted to the only blunt tool we had. The attacker jumped on the opportunity to publicize the fact that some well liked accounts were being suppressed on Primal and accused us of “shadowbanning”. The whole thing exploded on Nostr.

What followed was a pretty tough week for Primal. Many of our users turned against us. They took the idea of shadowbanning seriously, as they should. Most feedback was in good spirits, people making fun of Primal via memes. But we also got a fair bit of hate from complete strangers, which was super-weird. All in all, Nostr users were clear about what they think of censorship. This was the Nostr immune system reacting. Being on the receiving end of it really sucked, but still it’s beautiful to see!

The crazy part is that those “shadowbanned” accounts were actually perfectly visible throughout the entire Primal site. They had *exactly* the same level of visibility as they do on Damus, Snort, Coracle, and other Nostr clients. They just couldn’t show up in our trending bar. I tried to explain, but there was little room for nuance with the drama in full swing.

So we decided to disengage temporarily, focus on building, and let our product do the talking. We made our trending algorithm more resistant to bots and removed everyone from the “can’t trend” list. We also built a new content moderation system for Nostr, giving complete control to the user. This is our best take on how to do content moderation on such a radically open network. I cover the features and our reasoning in my blog post below.

So Primal is strictly a better product after this episode. But what about Nostr itself?

Attacks can be useful. While they disrupt our systems and really suck for us and our users, they do force us to improve and become more competent at operating in an adversarial environment. However, we should be careful about making it socially acceptable for Nostr devs to attack other projects in broad daylight. That’s not the most productive way to collaborate. It also creates weird vibes which I think we don’t want here. Nostr is in its infancy and the way we act will set the tone for things to come. There is so much to build and we are all working as fast as we can. At Primal we build open source software and run services for Nostr. If you don’t like the way something works, fork it and do your own thing. If you want to contribute, we accept PRs. If you have found a vulnerability, there are multiple good ways to disclose it.

As for Nostr users, I think you all reacted perfectly. Push back hard at any whiff of censorship. When in doubt, mercilessly create memes, point out things that are wrong, and don’t let up. Even if the target is Primal.

If Primal is real, it can stand the pressure. 🤙💜

https://habla.news/u/miljan@primal.net/1693416828339

Thank you

I tried to reference this note on my own note with the pics but somehow it didn't work. Trying a different approach here:

@note1kfjxw2tchn00vw9ad5caehy755dk94jn0asn7vyld4my9k6emz8qnmw8d0

It's been a LOOONG time since I last coded 😆

If (dinner == butternut squash soup)

then bake(bread);

#grownostr #baking #foodstr

nostr: note1gge8v9k0arge62n95sdzrmdzd5luje7ptftzpyz8h925t5tst5sqfcnjym

Looks delicious. I have some in the oven right now. I’ll share a pic once it’s out