Innis's avatar
Innis
john@innis.xyz
npub1l336...cxyz
Building on protocol. Austrian economics, Bitcoin, Nostr, and the older traditions that saw this coming. Low time preference. Long game.
Innis's avatar
Innis 19 hours ago
Had I known publishing on Nostr would just be a conversation between myself and God, I wouldn't have been so reluctant to build in public. I wasn't expecting fanfare, but I'd seen the sometimes overwhelming response to other people's work and was scared off. I didn't want to get tied up talking. It's why I've always hidden behind nyms. Turns out unless you propose on-chain zaps, you've got very little to worry about. I'm enjoying the crickets while I build.
Innis's avatar
Innis yesterday
Shipping two libraries today: nostr-relay-selection in TypeScript and PHP. They answer one question: given a Nostr event, which relays should it go to. Covers outbox publish routing, NIP-17 DMs, NIP-65 list parsing, author set-cover, e/p relay hints. Both libraries are pure functions. No state, no I/O, no caches, no fallback URLs, no tie-breaks by Math.random or time decay. Same inputs, same outputs, every time. The existing implementations (NDK's OutboxTracker, rust-nostr's gossip, go-nostr's sdk, welshman/router) are engines: stateful, heuristic, coupled to a pool. None are deterministic. These libraries take the opposite trade. They are a spec. The TypeScript and PHP ports share a JSON corpus of test vectors. A vector that passes in one passes in the other. A Go or Rust port joins the same compliance suite or it doesn't conform. If you're building a client, a relay, a bot, an indexer, the win is having routing live behind one auditable path. One place that knows the NIPs. One set of vectors that decide whether the answer is right. When NIP-65 grows a marker or NIP-17 tightens a rule, you update the library and every caller gets the new policy. Post-spec decisions belong in an adapter at the boundary. Onion-only routing for a privacy build, dropping unresponsive relays based on pool state, home-relay ordering, scoring by past success — whatever your runtime knows that the spec doesn't. The library returns the NIP-derived answer; the adapter overlays your application's intuition on top. In use across the rest of my Nostr stack, to be released soon. I'm also putting these out because I want them stress-tested by people who have shipped more Nostr than I have. If you spot a corpus (Claude's favourite word right now) vector that's wrong, a NIP rule I've misread, or a routing decision you'd make differently, the issue tracker is open. deno add jsr:@innis/nostr-relay-selection composer require innis/nostr-relay-selection MIT. #nostr #typescript #php #opensource #nostrdev
Innis's avatar
Innis 5 days ago
Not the first time I've been confused for an LLM. Wilde said life imitates art. The art that life is about to imitate is the one we made by feeding our own writing to a machine. Embarrassing to be confused with a Redditor. Less so with the authors of the great works Anthropic consumed to make its models. By their fruits you shall know them. Reputation is the only signal that survives when the imitation becomes mutual. People will take me however they take me. Hopefully I have something to offer that an LLM does not. Honest thanks to @mleku for the jab. The challenge was fair and humorous. We've both come away with something to think about.
Innis's avatar
Innis 6 days ago
Abide then bear. Sent out to bring forth fruit. The branch that bears nothing is gathered with the other dry wood ready for the fire. The vinedresser is on his rounds. What is buried for safekeeping is rebuked. The apostles left the upper room. Stepped off the hundred foot pole. The wilderness opens onto the marketplace. Another reminder to myself.