Avatar
franzap
726a1e261cc6474674e8285e3951b3bb139be9a773d1acf49dc868db861a1c11
Building nostr:npub10r8xl2njyepcw2zwv3a6dyufj4e4ajx86hz6v4ehu4gnpupxxp7stjt2p8 and #purplestack | BA 🇦🇷

This is interesting. Timestamp as in local timestamp when that post-EOSE event arrived? Aren't there discrepancies/timezone issues between client and event signing times?

Nostr devs: Wouldn't it be very useful for caching if relays sent their timestamp next to events? How are you calculating since in REQs otherwise? #asknostr

He wrote several good posts over the last days

what was that RSS feed to nostr tool?

The Automattic vs WP Engine shitshow is another example of why nostr will win

Must read

nostr:note1eleqqfhcmgcd57x7g7s37jse7d7srumep4fgujhxu6a56saq3hyspcfhge

Yes. It's very cool. Just my opinion that DVM spec too contrived for a synchronous API with no payment. Maybe could have a simpler one for those cases

Replying to Avatar Niel Liesmons

Yeah, this is the kind of user deception I don't want to see in nostr:npub10r8xl2njyepcw2zwv3a6dyufj4e4ajx86hz6v4ehu4gnpupxxp7stjt2p8.

When a user publishes something for public use:

1️⃣ It needs to be clear that he's publishing something 🤷‍♂️

2️⃣ It needs to be very obviously public

Again, this is why I prefer to look at the public actions users already do anyway: replies, zaps, public bookmarking, etc...

Agreed.

I know it's not malicious on the part of any dev, but I've encountered several nostr apps prompting for signing multiple events of mysterious kinds.

Including events in a non-interactive context like loading a website an being asked for a signature.

Sign (or prompt to) events only when absolutely necessary. Be explicit about what's not obvious. Maybe we need work on UI/UX design around prompts?

nostr:note1tm93m6cvr2xpnafeschzsp7sgxurqszm0jzxrgar757eeuzanu0sqgv98e

It would be a concern for relay developers, not relay operators, in the rare case they decide to switch the underlying DB tech which should happen rarely if ever.

Agreed on 1 and 2!

Negation is the first basic thing that comes to mind. "Piping" filters would be another one.

Agree this is nuanced, delicate and comes with tradeoffs. This isn't an ask, I am trying to open this conversation.

People can call it however they like, but most relay usage is clients treating them as databases (it's not data reconciliation). And thus nostr has a query language (most call it request filters).

More flexible in what sense? I never suggested using SQL. What I'm saying is no matter which tech backs your relay, it already has a more powerful query language. Let's find some common denominator perhaps, and improve the filters so they allow more efficient querying without compromising decentralization.

The issue here is how easy it would be to swap a backend if any service is captured or down. I appreciate that at least with a DVM there should be a spec of the complex querying

Replying to Avatar franzap

"Relays should not be treated as databases" is silly and can kill nostr.

The relay query language was designed around a social notes client use-case. The "other stuff" that we love to talk about, as much as it's part of the nostr acronym, is an afterthought.

Other stuff clients do not work like social clients. They have way more specific requirements and hence need to use relays more like databases.

Since the query language is terribly limiting, this results in:

- Higher amount of requests

- More bandwidth

- More client-side processing

Do we want nostr to compete in terms of UX with other platforms/protocols or be forever lagging behind?

Worst of all, this leads developers to implementing hacks to perform queries (custom languages via NIP-50, for instance) which entirely defeats the point of a relay: to be easily swappable.

If we can't easily swap relays, nostr is dead.

The rationale for not treating relays as databases is based on the fallacy of simplicity. Since we want anyone (yes including your grandma) to create a relay we must make it as simple as possible – so we should not force implementation details such as requiring a database.

But guess what is the simplest way to build a relay? Using a database.

If we want nostr to succeed we must grow up, assume that relays will have a database backend, and reach consensus on a better query language that we're confident can be implemented in most engines (SQL, noSQL, graph, and so on).

Not perfection, not a highly complex language, but something that allows more flexibility than the archaic filters we have right now.

Not being able to execute more complex queries on relays tips the balance in favor of custom API servers.

Any service that values great UX (and no, we have awful UX on nostr so far) will end up choosing a custom server. This means users will lack the ability to manage servers like they do with relays, and therefore reduce user choice and decentralization.

Few.

nostr:nevent1qvzqqqqqqypzqun2rcnpe3j8ge6ws2z789gm8wcnn056wu734n6fmjrgmwrp58q3qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgawaehxw309ahx7um5wghx6at5d9h8jampd3kx2apwvdhk6tcqyrfamps30qqu0c7kmkvj43ngkmkzqvm777l7qfm8e3dms8pxy77qu9sqsnk

Do you mean people who use databases for their apps are not aiming for real usage? Why not?

Interop through a common format is exactly what is at stake when you have a query language so primitive that each client is forced to create its own.

The REQ specification is a query language, no words can hide this fact.

Replying to Avatar Vitor Pamplona

I think the main points that nostr:nprofile1qqsdulkdrc5hdf4dktl6taxmsxnasykghdnf32sqmnc7w6km2hhav3gppemhxue69uhkummn9ekx7mp0qywhwumn8ghj7mn0wd68ytfsxyhxymmvwshx7cnnv4e8vetj9uq3uamnwvaz7tmwdaehgu3dwp6kytnhv4kxcmmjv3jhytnwv46z7qmml2f somewhat missed is that there is no SQL for Nostr relays and there is, currently, no easy replication scheme to support load balancing, especially for geo-distributed semi-mirrored servers.

Relays ARE databases in the sense they store stuff, but if you need advanced querying capability OR if your events are too big (binary or text) or has too many tags (too many indexes), the relay operator might not be able to support it and might either reject it or become super slow.

The lack of a query language is a limit we are forcing on ourselves. The rest is pretty much solvable with the usual enterprise stack without changing the protocol.

By "the rest" you mean the "other stuff"? I certainly do not want to fall on the usual enterprise stack to make my other stuff client work

The relay operator is free to reject a request or charge for it

"Relays should not be treated as databases" is silly and can kill nostr.

The relay query language was designed around a social notes client use-case. The "other stuff" that we love to talk about, as much as it's part of the nostr acronym, is an afterthought.

Other stuff clients do not work like social clients. They have way more specific requirements and hence need to use relays more like databases.

Since the query language is terribly limiting, this results in:

- Higher amount of requests

- More bandwidth

- More client-side processing

Do we want nostr to compete in terms of UX with other platforms/protocols or be forever lagging behind?

Worst of all, this leads developers to implementing hacks to perform queries (custom languages via NIP-50, for instance) which entirely defeats the point of a relay: to be easily swappable.

If we can't easily swap relays, nostr is dead.

The rationale for not treating relays as databases is based on the fallacy of simplicity. Since we want anyone (yes including your grandma) to create a relay we must make it as simple as possible – so we should not force implementation details such as requiring a database.

But guess what is the simplest way to build a relay? Using a database.

If we want nostr to succeed we must grow up, assume that relays will have a database backend, and reach consensus on a better query language that we're confident can be implemented in most engines (SQL, noSQL, graph, and so on).

Not perfection, not a highly complex language, but something that allows more flexibility than the archaic filters we have right now.

Some things are right, others debatable and others plain wrong

While this is definitely needed, I have my doubts about cramping everything into one kind. Are we going to make that table huge?

For example, nostr:npub1gm7tuvr9atc6u7q3gevjfeyfyvmrlul4y67k7u7hcxztz67ceexs078rf6 wants to position himself as a reproduceable attestation service provider. He's drafted an event for this response which would be too complicated for inclusion here.

Same for WoT, it is a contentious topic and I'm not even sure what 0-100 means. The response would likely require more data than an integer. nostr:npub176p7sup477k5738qhxx0hk2n0cty2k5je5uvalzvkvwmw4tltmeqw7vgup

Something like the DVM NIP that uses sub-kinds might be more useful.

We'll start by having a predefined nostr apps list, way easier. In time, users will be able to define their own, which could work as a backup/restore mechanism like I mentioned. nostr:npub1dergggklka99wwrs92yz8wdjs952h2ux2ha2ed598ngwu9w7a6fsh9xzpc would be thrilled with this.

Replying to Avatar Vitor Pamplona

Hey nostr:nprofile1qqs8y6s7ycwvv36xwn5zsh3e2xemkyumaxnh85dv7jwus6xmscdpcygpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz8thwden5te0dehhxarj9ekh2arfdeuhwctvd3jhgtnrdakj7qghwaehxw309aex2mrp0yhxummnw3ezucnpdejz7qxvpy4, when are we going to get app bundles on zap.store?

I want a bundle with every single functional Nostr app for Android. I want to install all of them with a single click.

And, ideally, they are already logged in with my nsec somehow (Amber?).

Once we get non-interactive installs next milestone (end of year) then it would be possible.

Who would define this bundle?

For auto-logins, Amber would have to be installed and set up first.

nostr:npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5 How would you approach designing something like this?

Related: https://github.com/zapstore/zapstore/issues/20