Replying to Avatar hodlbod

This is the most nuanced take I've seen on this subject yet.

First of all, yes, I agree github is not ideal and we should move NIPs elsewhere. But so far no one has stepped up to build a viable replacement, so for now we have to deal with the two-tier system through culture, by encouraging devs not to worry about things not getting merged. I personally have 10+ unmerged open PRs which are in varying levels of implementation in my stuff. Having them unmerged is 1. an invitation to collaborate, and 2. a signal that they're not adopted widely.

As far as lexicons go, when I was designing my own protocol that was the direction I was taking things. I'm still sympathetic to the idea, except for what you pointed out about control over the lexicon. Numeric identifiers are much better, because they're neutral — *if* we can get into a good habit of publicly signaling their use and adoption. That's not trivial of course, and points back to my first paragraph.

As far as specificity, the terseness and ambiguity is (I think) one of nostr's strengths. I could be wrong about this, because it basically goes against all the conventional wisdom of specification writing, so we'll see if it works out in practice. But specifying the minimum interoperability surface area allows there to be more flexibility in how a given data format can be used. This can lead to inconsistent UX, which is a problem but something devs are motivated to work through because it aligns with their interests, or it can lead to innovative new ideas. In either case though, it forces devs to be more conservative about how they treat events, encouraging defensive coding (in case of deliberately malformed events as an attack) and wider interoperability. This is an adaptive approach rather than a validate-and-throw-away approach.

I think your argument is by far the strongest for what we have now (neutral labelling, flexibility, wide berth, better of a petri dish for new ideas...). The biggest issue for me is that this more ambiguous approach pushes too much of the cognitive load over to users. Many of these benefits accrue to the devs directly and to the users in a roundabout way. Better the opposite I think, have the benefits accrue to the users directly and to the devs in a roundabout way.

Also while I agree devs are motivated to work through the inconsistent UX, it becomes hard to channel that motivation to concrete action. You have 3 clients doing it one way, 3 clients doing it another way, and 3 clients yet another way. All 9 are hearing complaints from users and feeling motivated to work things out, but work things out how? Often it becomes a very tense and drawn-out game of paper scissors rock.

I think a lot of this falls into the class of problems for which no later decision can make up for the absence of an earlier decision. And lexicons do force those decisions much earlier.

Reply to this note

Please Login to reply.

Discussion

Great write up sir!

I think we can get the best of both on Nostr. Withe the **onNostr** being the important part.

The central repo on GitHub = :110percent: the issue. As soon as you take that of the picture and imagine a Nostr spec on Nostr, there's opportunity to introduce the best of what lexicons bring.

I'm personally leaning towards:

1️⃣ Wikis as the best way to publish specs

2️⃣ App Releases as a potentially more suited place to reference which specs your app is built on

That way I can:

- have my detailed Kind 9 Chat message "lexicon"

- document it in a wiki that doesn't need to be merged necessarily (yet still becomes more valuable, the more it is referenced/zapped/replied/accepted in communities/....)

- reference it transparently at the app-level without having to stipulate in each message what spec is being used (which comes with privacy issues etc...)

How would you do lexicons btw, in a way that's backwards compatible? nostr:npub1hyxredcavc6ruqgsf4wf4hmakpwnvefmzaspl7dja6a2sxlx0q3sxwtqnx

Over there the protocol simply mandates both backwards and forwards compatibility. But often times the thing to is to reference another lexicon, or to create a sub schema.

So let's say in a lexicon called:

com.example.post

I have an author field, and for that field I want to reference the profile definition in another lexicon called com.example.user, I pop in:

"author": {"type": "ref", "ref": "com.example.user#/defs/profile"}

And that references:

"profile": {

"type": "object",

"properties": {

"handle": {"type": "string"},

"displayName": {"type": "string", "maxLength": 256},

"avatar": {"type": "string", "format": "uri", "nullable": true}

}

Then it's all just lego blocks and you can worry about them block by block.

But even if you have a breaking change and you come up with a new lexicon for it, all the other apps using the old lexicon will continue to use it, it can't be deleted, so you've not broken anything on their end.

Lo, they think they're messy :winkwithtongue:

> 2️⃣ App Releases as a potentially more suited place to reference which specs your app is built on

Makes a lot of sense to me. Without that real-world context you can be forced into a kind of lowest-common-denominator-of-possibilities outlook.

True story!

Will pitch the idea to nostr:npub1wf4pufsucer5va8g9p0rj5dnhvfeh6d8w0g6eayaep5dhps6rsgs43dgh9 , but it's not priority now.

Step one = Getting the communities running where we can collab on these NIPs in the first place.

For sure. If you get it up I'm happy to test sending join events with some throwaway nostr:npubs. This here web UI seems like it'd make testing pretty easy for a small test group.

https://nostrtool.com/