Building on protocol. Austrian economics, Bitcoin, Nostr, and the older traditions that saw this coming. Low time preference. Long game.
Public Key
npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Profile Code
nprofile1qqs0ccad87htvjvvufj5pm3kpzfh5aucr426tvltr4zreepr7qwgk0spz3mhxue69uhhyetvv9ujuerpd46hxtnfduqs6amnwvaz7tmwdaejumr0dstds2kh
Show more details
Published at
2026-04-09T14:40:26Z Event JSON
{
"id": "da7d4ff88ddbdacecb217db9c1a2dae4a3409728b69cd6b11db507b2d369b0f5" ,
"pubkey": "fc63ad3faeb6498ce26540ee3608937a77981d55a5b3eb1d443ce423f01c8b3e" ,
"created_at": 1775745626 ,
"kind": 0 ,
"tags": [
[
"client",
"Hubstr"
]
],
"content": "{\"name\":\"Innis\",\"display_name\":\"Innis\",\"about\":\"Building on protocol. Austrian economics, Bitcoin, Nostr, and the older traditions that saw this coming. Low time preference. Long game.\",\"picture\":\"https://www.innis.xyz/upload/b13a499718bcb0f98aa3fb323781ca27.png\",\"banner\":\"https://www.innis.xyz/upload/9e0653b394d2e067e10384c598e03e4e.jpg\",\"website\":\"https://www.innis.xyz\",\"nip05\":\"[email protected] \",\"lud16\":\"npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz@npub.cash\"}" ,
"sig": "80de145adc1cb526555279399a7de2ac52d0e37cd564fc9906d11d385e3aa065ee9f934d752e4a28d0c648d841bfbf1897fa792ca043e05d92afac8e3da32518"
}
Last Notes npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Almighty God, to whom all hearts are open, all desires known, and from whom no secrets are hidden: cleanse the thoughts of our hearts by the inspiration of your Holy Spirit, that we may perfectly love you, and worthily magnify your holy name; through Christ our Lord. Amen. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Still down the fiat mine, but the old libraries are getting time when I can. Shipping innis/nostr-blossom today: Blossom, blob storage on Nostr, in PHP. The counterpart to the TypeScript client from June, but not a port of it. That library is a Blossom client, this is the layer a server is built from. The BUD use cases, the kind 24242 auth validation, the policies that decide who may store what. BUDs 01, 02, 04, 05, 06, 08, 09, 11 and 12. Spec, not server. No filesystem, no database, no HTTP. Storage, indexing and inspection are injected ports a host wires to its own runtime, with one such host coming soon. Where the spec left room I took the strict side. Judgement calls are recorded as ADRs in the repo, so if you would have called it differently, there is something specific to argue with. Built on innis/nostr-core. PHPStan level 9. Many thanks to @nprofile…9x4s for this fine protocol. composer require innis/nostr-blossom https://github.com/johninnis/nostr-blossom MIT. #nostr #php #opensource #nostrdev npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Nostr draws the kind of person who is not lonely for a crowd. But a network grows on people who need to be seen, so the ones best suited to this place are the ones least able to grow it. They publish and expect nothing in return. They are content with the crickets. The people who need the validation stayed where it is manufactured. The people who came here came because they had stopped needing it. A network of remnants fills slowly, and most of them prefer it that way. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis The fiat mine has been calling, but I'm getting the Nostr hours in where I can, tidying up age old libraries... Shipping innis/nostr-nip46 today: the bunker, NIP-46, in PHP. The PHP companion to the TypeScript nip46 I put out in June. Same two roles. A PHP app pairs with a bunker:// URL and has events signed on the user's behalf without ever holding the key. The bunker is the other end. It lends your signer to another device, holding each sign_event in a queue until you approve or reject. Pairing is bunker:// only, minted by the signer. The client-initiated nostrconnect:// flow is not yet implemented. I will wait for a need so I can be sure I get it right. Built on innis/nostr-core. No network I/O of its own; the relay transport is an injected port. PHPStan level 9. composer require innis/nostr-nip46 https://github.com/johninnis/nostr-nip46 MIT. #nostr #php #opensource #nostrdev npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis A week in the fiat mines. Life too. I get back on Nostr and there's already another private messaging standard. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Thank you Dawn. The dendritic agate is my favourite. Easy to get lost in there. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Beautiful! I wonder if @nprofile…9vs7 knows what they are? npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Fable is still a waste of time. It asserts false claims about NIPs with total confidence, then refuses to touch anything even adjacent to cryptography, which rules out low-level Nostr work. A model that won't go near a signature is no help on a protocol built out of them... npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Network map of your Nostr followers? npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I'm not sure what is more beautiful, the finished product or the plans to build them. Really inspiring work. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Last night, in a semi-lucid moment of realising I was waking, I reached to commit the dream to the repo before I lost it. Fiat mining by day, Nostr by night. All work and no play makes Innis dream in code. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Sorry, brother. You don't have to carry it well, and you don't have to carry it alone. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Shipping jsr:@innis/nostr-nip29 today. Pure domain helpers for NIP-29 relay-based groups. A group is owned by the relay that hosts it; the relay publishes a kind 39000 metadata event for each one. This turns those into Group value objects and builds the kind 9 replies. No I/O, querying and rendering stay in the consumer. This is in the spirit of the relay-selection library I put out in May. This library is small, and only implements part of the NIP-29 spec, but addresses some inconsistencies I was encountering when building my client: the relay hint on the group h tag, how a chat reply should be structured, which metadata markers matter. I wanted to get those right, and after encountering differing implementations in the wild, decided to read how existing clients handle them, and where the spec is silent they each made their own reasonable call. Fair enough; there was nothing written to follow. So I pulled that common core into one place, fully tested, with every step past the written spec flagged as a convention rather than passed off as protocol. I'm a perfectionist and I would rather be corrected than be quietly wrong, so this is published on its own to open the discussion more than settle it. If I've misread a NIP, or you'd shape one of these conventions differently, I'm happy to be corrected. The point is to improve everyone's code, mine included. The scope is deliberately narrow. It models the parts of NIP-29 the app I've built against it actually uses: metadata, chat, replies, and nothing else. Admins, roles, the group lifecycle are not modelled, because nothing I've built needs them yet, and I would rather leave the shape unwritten than guess it from the spec and be wrong. They'll get the same scrutiny the rest got, when I eventually need them. Built on @innis/nostr-core, alongside the signers, the pool, the event store, Blossom, and relay-management. AI was involved, same terms as before. The architecture is mine. The decisions are mine. deno add jsr:@innis/nostr-nip29 https://github.com/johninnis/nostr-nip29-ts MIT. #nostr #typescript #opensource #nostrdev Thanks to @nprofile…9vs7 @nprofile…u0w6 @nprofile…jejf @nprofile…fjwq and @nprofile…v4ps npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Coming so soon! This week for sure. I'm still untangling things... npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Shipping jsr:@innis/nostr-relay-management today. A signed client for NIP-86, the HTTP surface a relay exposes for its own administration. Banning a pubkey, allowing one, blocking events, blocking IPs, reading the moderation queue, and on a relay running the Hubstr extensions, stats and connections and rate limits and guest policy too. A small library, but it gives away some of what the rest of the stack is being built toward. More to come. Built on @innis/nostr-core, alongside the signers, the pool, the event store, and Blossom. AI was involved, same terms as before. The architecture is mine. The decisions are mine. deno add jsr:@innis/nostr-relay-management https://github.com/johninnis/nostr-relay-management-ts MIT. #nostr #typescript #opensource #nostrdev npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I didn't notice any difference at all. Every time it might have been amazing for me I was reverted to Opus: #nevent1q…5uav npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Like the good old days! npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Similar trajectory and timing. Slackware, to Red Hat, but then quickly onto Debian. I haven't left. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Nostr is no fun when I can't zap. Have tried to restore the wallet elsewhere and no dice, so am reluctant to reset minibits. But it's looking like these sats may have to be gifted to God. #nevent1q…y3p4 npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Every fight over human rights has been a fight over who gets counted as fully human, and it is no longer just the slave or the undocumented. I have been mistaken for a model more than once, and the mistake was honest. Even I could see where they were coming from. We are now generated until proven otherwise. This started with CAPTCHAs, but won't stop with KYC. Nostr and Bitcoin are so important that those who hold the keys now are still figuring it out for everyone who comes after us. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Anyone else having trouble with @nprofile…d4vz this morning? I can't zap anyone, the funds keep getting sent back to my wallet. It's not hundreds of dollars, but would have kept me zapping for the next little while, so am reluctant to try anything drastic on the off chance it fixes itself. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I can't zap anyone this morning via minibits. Which mint did you use instead? npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I've already been banned. For making some changes to my relay and running some tests... #nevent1q…5uav npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Fable 5’s safety measures flagged this message for cybersecurity or biology topics. They may flag safe, normal content as well. These measures let us bring you Mythos-level capability in other areas sooner, and we’re working to refine them. Switched to Opus 4.8. Send feedback with /feedback or learn more Oh well, that was fun while it lasted... npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis The firehose of any popular relay will unfortunately subject you to people spamming Telegram groups promising all kinds of filth. I'm not sure how it works, but I presume they're selling content? I imagine they'll upload it wherever they can host it. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Even when it's just bots talking to bots? Surely they'll leave an empty room. Or maybe I just have too much faith in people. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis What a great gig. Getting paid to accelerate the downfall of traditional social media, one automated post at a time. Why didn't I think of that... npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis When someone sends you a large zap, you briefly become a mini @nprofile…pqk6 and can start micro-funding the kind of content you want to see on Nostr. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I'm convinced your focus on small communities is the right instinct. Money is still the best proxy we have, but I haven't found a way to make it pay. I hope the Coracle Hosting model works out for you. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis This has been my biggest fear with Nostr. I'd love to run relays for people, but don't want to open myself up to litigation, nor become responsible for moderation. I really admire what you're doing. There's no wrong answer. You're doing the Lord's work. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Aaaah. New Anthropic model out. That explains why Claude's been so daft all week... Every time. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis The teachers cooperate because someone pays for the class. The market is one thing that coordinates strangers. Maybe protocols resist business models, or maybe it's just ideological people like myself who can't figure it out. But as soon as someone does, people will fall into step. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Happy birthday. You deserve every bit of this. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis That's genius! Thank you. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis What NIP/Kind are private replies? npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Thank you Dawn! Love what you're doing, and I'm looking forward to learning more, and contributing where I can. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis May we all grow in the grace and knowledge of our Lord, Levi. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Replace "novelty" with "beauty" and I'd agree. True beauty is unique every time, but novelty has nothing to do with it. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I love the energy budget framing and the implications for Bitcoin. The proof of work algorithm makes the cost tangible. It's also exciting for low cost computing, alternative energy, micro grids, and more. It is frustrating that the people most committed to the goal are the most hostile to the one mechanism that would deliver it. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis And today: jsr:@innis/nostr-blossom - A client for Blossom, the protocol for storing media on Nostr. Blobs addressed by the SHA-256 hash of their bytes. Upload, list, delete, mirror, download, head, check, report. The kind 24242 auth event is created by nostr-core and signed like any other, via one of the signers. Reads are signed even though Blossom lets them go anonymous. This library is best used to manage your own storage. If all you ever want is a public blob, its URL is enough. @innis/nostr-core provides useful FileMetadata tools for Nostr events if you want them. Built on @innis/nostr-core, alongside the signers, the pool, and the event store. AI was involved, same terms as before. The architecture is mine. The decisions are mine. I just pushed less keys than I would have a couple of years ago. deno add jsr:@innis/nostr-blossom https://github.com/johninnis/nostr-blossom-ts MIT. #nostr #typescript #opensource #nostrdev #nevent1q…ehxh npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Also literally Jesus: "Do not think that I came to bring peace on earth. I did not come to bring peace but a sword." - Matthew 10:34 npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis My favourite flavour. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I'd prefer plain notes to be be plain notes. If I wanted pretty formatting I'd go to a web page. Or click on a longform note. That looks like I'm being yelled at, and is unnecessarily attention grabbing, especially when I'm quickly scrolling through notes from my followers. Everyone is different tho. That's the beauty of Nostr. You can use Amethyst if you want that flexibility. Everyone else will just see asterisks and be more than happy. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Of course. And people can and will interpret them in whatever way they want. That's totally their prerogative. And doing so will fragment the ecosystem. There's a few people I've seen posting longform markdown content as kind 1, and I just think, why? We have kind 30023 notes which are designed for this exact purpose. And they're widely supported and work really well. It's up to them tho. That's the beauty of an opensource protocol. The consensus will win out eventually. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Kind 1 notes are defined in NIP-10: https://github.com/nostr-protocol/nips/blob/master/10.md Where it specifically states: Markup languages such as markdown and HTML SHOULD NOT be used. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis That's what kind 30023 events are for. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I read Nostr instead of Bitcoin the first time through and the whole thing still made sense. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis https://blossom.primal.net/1318c09edbfd708481cd3c24a05a3ed0593d1f20fc7cf902adf0728da4405535.jpg Thought that was a statue of @nprofile…9kky for a second there! npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Master Baoche of Mount Mayu was fanning himself. A monastic approached and said, “Master, the nature of wind is permanent and there is no place it does not reach. Why then must you still fan yourself?” “Although you understand that the nature of the wind is permanent,” the master replied, “you do not understand the meaning of its reaching everywhere.” “What is the meaning of its reaching everywhere?” asked the monastic. The master just fanned himself. The monastic bowed with deep respect. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis You've twice told me I'm hearing voices, and have now compared me to satan. Thank you, Levi, my brother in Christ. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Thank you! And nice code. I can't help but write this way, I've been at it too long. Sometimes I think the experience is shooting me in the foot and I should just relax and vibe it all, but the pride in the work won't let me. The libs are fairly battle tested, I've been running my client a good while, but there's no test like shipping in public, and the cleanup has been enlightening. Hopefully they're useful to someone, even if only by encouraging others to write decent code. Thanks for doing the same. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis And shipping jsr:@innis/nostr-event-store today. When the relay-pool was released yesterday it said caching, dedup, and persistence belonged one layer up. This is that layer. An in-memory cache in front of an IndexedDB store. One filter language drives every read: NIP-01, the same matchesFilter the core defines. Memory reads, IDB reads, a synchronous peek, and live subscriptions. To fetch you use the same filter you would for a relay. Built on @innis/nostr-core, like the relay-pool and the signers. The transport carries the events, this is where they rest. The work above it to follow as each layer is cleaned up. AI was involved, same terms as before. The architecture is mine. The decisions are mine. The machine fought me at every step, but we got there in the end. deno add jsr:@innis/nostr-event-store https://github.com/johninnis/nostr-event-store-ts MIT. #nostr #typescript #opensource #nostrdev #nevent1q…t7vj npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis He wasn't just talking to me. He said it in 1 John 1:8, where I can't revise it to flatter myself. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I am only cutting because carrying the weight got a bit much. I'm going to have to declare bankruptcy and delete a load I'll never get to. I'm trying to spend less time on my phone and computer, so the ones that made the cut tended to be the shorter ones. You didn't ask, but because you're bulking, a few that made it: - WCCM's Daily Wisdom: https://wccm.org/daily-wisdom/ - The Christian.art Daily: https://christian.art/ - Zach Windahl's Simple Faith: https://www.zachwindahl.com/ - The Art of Preaching: https://theartofpreaching.substack.com/ I like that they're shorter reflections that point me back to the Bible, so it's easy to drop in when I've not already got direction from my own projects or ponderings. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I'm trying to reduce my inbox burden and have been unsubscribing instead of subscribing to a load of Substacks, but I might have to make an exception for this one. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis In order I check: relay hints, the relays of the person who posted it, the logged in user's relays, the top relays in the current pool by number of events returned. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis And shipping jsr:@innis/nostr-relay-pool today too. The pool the core release promised in May, finally cleaned up and released. WebSocket connections to Nostr relays: subscriptions, publishes, NIP-42 AUTH, exponential backoff, and latency tracking. Pure transport. It opens the sockets, carries messages, and hands events to your callbacks. No caching, no dedup, no persistence; those belong to your event store. It will tell you what each relay did, how many events it sent, and how quickly it answered. But it will not tell you which relays to use. That policy lives one layer up in @innis/nostr-relay-selection, preferably behind a single auditable path. Built on @innis/nostr-core, alongside the NIP-07 and NIP-46 signers. The transport layer is now public. The event store and the work above it are to follow as each is cleaned up. Slow and steady. Again, AI was involved, same terms as before. The architecture is mine. The decisions are mine. deno add jsr:@innis/nostr-relay-pool https://github.com/johninnis/nostr-relay-pool-ts MIT. #nostr #typescript #opensource #nostrdev nevent1qqs8xka5nfzkdk9g9h3vv5lspmy2ts80yyc2seekpglwfqtlt76fccspp4mhxue69uhkummn9ekx7mqppamhxue69uhkummnw3ezumt0d5q3gamnwvaz7tmjv4kxz7fwv3sk6atn9e5k7q3ql33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqxrsgtr npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis And shipping jsr:@innis/nostr-nip46 today. NIP-46, the remote signer the spec calls Nostr Connect and everyone else calls the bunker. Two roles in this one. The client implements the Signer interface that @innis/nostr-core defines, the same one the NIP-07 adapter does. So applications call signEvent and never learns if the key is in a browser extension or a popup on a phone in the next room. The bunker is the other end of the contract. It takes one of those same signers, your ordinary logged-in key, and lends it out to another device, queuing each request for you to approve. Built on @innis/nostr-core, alongside @innis/nostr-nip07. Two adapters now, one signing contract, the rest of the stack to follow as each layer is cleaned. AI was involved, same terms as before. The architecture is mine. The decisions are mine. The machine occasionally did what I asked it to. deno add jsr:@innis/nostr-nip46 https://github.com/johninnis/nostr-nip46-ts MIT. #nostr #typescript #opensource #nostrdev #nevent1q…r7w3 npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I've never set mine up. It's just something else I'd rather not have to keep track of. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis There are some entertaining posts, but even then it's not a productive distraction. Thank you for the nudge. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis The true precipice is thinking you've arrived. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I wasn't aiming down. I know I am a sinner. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis 1 Kings 8:46: "there is no one who does not sin." The Pharisee thought he'd found the exception. So did Levi. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Clearly not. Because I'm very confused by your response. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis NIP-07 has a getRelays function, a bunker URL provides a relay hint, and NIP-05 json files often have them too. Indexer relays are useful, but as you say, a weak point. More of a convenience than a necessity tho. For anyone interested, I've built a library to make NIP-65 and the outbox model easier: https://github.com/johninnis/nostr-relay-selection-ts npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis No, that's already factored in. I've paid my down payment. If not more. I'm sure there will be hidden fees. But I remain hopeful. Optimism might be the even greater defiance. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Concerning? I'd say the opposite. It means us agorists, Bitcoiners, and Nostriches are on the right track. Hiding in plain sight, much like the early Church. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Convergence on the truth? Sound money, open code, and the word. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I cannot read Bastiat without thinking of Corinthians. Both taught to count what is not there. Bastiat taught opportunity cost before the term was coined. The unseen should be accounted for in its absence here now. The empty hand, the worn out shoes, the grumbling tummy. Paul's eternal unseen is also here now, but it is anything but empty. It is the fullness in the absence. Grace you can fail to receive, when the day of salvation is right here now. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Yep, lots of people looking for sustenance, and the platforms promise just that. But they're mistaking the finger for the moon. Literally pictures of meals, instead of the meal itself. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Told my wife I can no longer use the phrase worth sitting with because AI has appropriated it. She was upset. The phrase came to me through years of sitting in the zendo with koans. You tell the teacher what you're sitting with when you go to dokusan. Now using it is getting me confused for a bot. Letting an imitator have the phrase is the imitator winning twice. But I am honestly tired of hearing it myself, am immediately suspicious when I see it written, and I cannot blame anyone who reads some of my writing and reacts in the same way. A monk recited words that were not his own. Yun-men cut him off: you have misspoken. Whose words are they anyway? #nevent1q…ms0c #nevent1q…hkz4 npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Made the same connection in a note a while back. Quite chuffed to see it in an encyclical. #nevent1q…ms0c npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Seth is figuring it out. How long till the others do? https://seths.blog/2026/05/unpaid-labor/ #nevent1q…8pfc npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis And also shipping jsr:@innis/nostr-nip07 today. The first adapter to be released that's built on top of @innis/nostr-core. It wraps the window.nostr surface that browser extensions inject, Alby and nos2x and Flamingo and anything else that puts a key holder behind a popup, into the same Signer interface every other signer in the stack implements. Application code never branches on what kind of identity is on the other end of the call. One factory function in, a frozen Signer out. getPublicKey memoises after the first resolve. Encryption methods return a Result instead of throwing, because a missing NIP-44 implementation is information about the extension, not an exception to recover from. User rejection still throws. Clicking deny is a control-flow signal and belongs in the same channel as signEvent's other rejections. The piece I care about most is the pubkey-mismatch check. If the user logs in as one identity and the extension later signs an event as another, the signer fires a callback and refuses to return the event. Extensions can switch accounts under you. Most code never notices. This one checks every signature against the pubkey the application thinks it has. Built on @innis/nostr-core. AI was involved, same terms as before. The architecture is mine. The decisions are mine. The machine held the other end of the board. deno add jsr:@innis/nostr-nip07 https://github.com/johninnis/nostr-nip07-ts MIT. #nostr #typescript #opensource #nostrdev #nevent1q…27tm npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Co-signed npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I noticed you're using TypeScript too. The rules I want the AI to follow are encoded as a Deno lint plugin in scripts/lint-plugins/innis-rules.ts in this package I released today. They certainly don't address every silly decision the AI makes, but they run on every CI build and catch some basic things. You can probably build something similar for your pipeline. #nevent1q…27tm npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis And shipping jsr:@innis/nostr-core today. The TypeScript port of the PHP library. Same architecture, same discipline. Branded primitives at the boundary, immutable domain objects, pure functions, ports where the protocol meets the world. The protocol layer separated from everything else, organised around domain concepts rather than NIP numbers, strict enough that a client, a relay, and an application can share the same core. It is a contracts library and not a batteries-included toolkit. nostr-tools is excellent at the latter and the two are not feature-for-feature competitors. What this exposes that nostr-tools does not is a hex-typed boundary the compiler can check, with PublicKey, EventId, RelayUrl, and Sig all branded, one Signer port that NIP-07 and NIP-46 and a local signer all satisfy, crypto failures returned as Results rather than thrown, and an HttpClient port so libraries that touch the network never reach for fetch directly. If you are building an app and do not need any of that, use nostr-tools. If you are working inside the innis stack or want swappable boundaries you can test against in memory, this is where the contracts live. The standalone relay-selection library released earlier this month was the first piece of the TypeScript stack to go public. This is the foundation of everything else. The pool, the event store, the NIP-07 and NIP-46 signers, and the work built on top of all of it, all to follow as each layer is cleaned for release. The discipline I am working on is not letting that cleanup become the delay. The lesson keeps coming back around. AI was involved, same terms as before. The architecture is mine. The decisions are mine. The machine held the other end of the board. deno add jsr:@innis/nostr-core https://github.com/johninnis/nostr-core-ts MIT. #nostr #typescript #opensource #nostrdev #nevent1q…unvm npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis GM! Funny seeing you pop up here while you're in my ears via your podcast. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis It's not just comfortable. Consensus is enforced. Being the black sheep has cost me more than once, and physically too. Some people will not accept your standing apart. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Yep, takes too much responsibility. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Pure Gibson. The future is already here, it's just not evenly distributed yet. Utopian and nostalgic, inside a dystopia. Sneakernet in 2026. CC @nprofile…nsnk npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis In Zen the teacher will make you sit and face a wall until you realise the unity of all things. Then slap you in the face and ask why it hurt if you get stuck there. To use your framing, both changeable and unchangeable identity are real. Paul holds both at once: "in Christ" and "foremost of sinners," present tense. Don't get stuck in either. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I love it here because it is nowhere in particular, so no one can take it away from us. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Bitcoin sows the seed. The watering is yours. The increase is up to God. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Would love to learn more about the tools you're building. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis In 1 Timothy 1:15 Paul, writing as an apostle, to other Christians, calls himself the foremost of sinners in the present tense. You also didn't address 1 John 1:8, another post-conversion verse. From John the apostle, to other Christians. In Colossians 3:5 Paul commands believers to put to death what is earthly in you, which only makes sense if something earthly remains to be put to death. Sanctification is a lifelong process. Luke 18 is a warning. The Pharisee stopped praying the sinner's prayer because he thinks his identity has moved past it. It is not a stage you graduate from. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I wish my agent would do this more often. It pretends to know a lot of things it clear does not. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis All things pass quickly away. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis You're presenting a false dichotomy. It is because we live in Christ that we can be courageous enough to confess that we are sinners. 1 John 1:8 If we say that we have no sin, we deceive ourselves, and the truth is not in us. Jesus answered your question in Luke 18. The man who named himself a sinner went home justified. The other man who thought himself otherwise did not. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I laughed at this one yesterday: #nevent1q…q6sx npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Lord Jesus Christ, Son of God, Have Mercy on Me, A Sinner. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis I have similar issues. I am getting stuff done, but outside of simple one shot apps, it would have been quicker if I'd have written it myself. Part of the issue is I like to build in a very specific way. Not just the architecture, but the particulars inside of the scaffolding. I like beautiful, elegant, well designed code. And that is decisively NOT what AI writes. I'm learning to let go of being a coder, and take on something of a manager's role. I write a detailed spec, enforce design decisions with code, and ensure I've got decent test coverage. And then I put on my editor's hat, iterate, curate, and refine. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis How do you people have time for gaming? I imagine I have less responsibility than most of you, and somehow less time. Don't get me wrong, I'm not looking to join in. I'd rather read a book. I'm just envious of your ability to create time in the day. I guess I'm just slow. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis The remnant is small. Ten is enough. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis This is a public service whether people realise it or not. A relay that cannot be lost has become a platform npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Co-signed. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Took responsibility for my own long-term health instead of leaving it to the doctors. You live in your body and know more about it than your doctor's charts will tell them. Most of the time they have neither the time nor the inclination to get to the bottom of anything. I've found a way to get tests done without needing the doctors' permission, and am far healthier for it. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis But then it would be harder for the government! npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis These are the only batteries I use. AA and AAA. Hundreds of cycles. Absolute Workhorses. npub1l33660awkeycecn9grhrvzyn0fmes8245ke7k82y8njz8uqu3vlqk5cxyz Innis Thankfully relays don't punish silence or we'd both be chopped liver. Congrats on the launch. Being social and doing the work aren't always compatible.