what I've been building and why, roughly weekly, going back as far as I could reconstruct it — tap any line for the full story
nutsack's full two-party nutzap round-trip goes green against testnut: "send → auto-redeem → both balances settle."
why: the acceptance test now passes un-ignored — two identities mint value-less ecash and nutzap each other, for real.
Trellis 0.2.0: an intentionally-breaking pre-1.0 release — per-output payload typing, structured ResourceKey segments, transaction-local audit history, proptest+fuzz in CI. Two browser demos ship alongside it: "Leak Duel" (a split-screen callbacks-vs-Trellis comparison with a chaos slider showing leaked attachments) and "Flight Recorder" ("git blame for side effects").
why: Trellis is a deterministic reconciler for Rust app kernels — state changes in, effect plans and receipts out. It exists to kill the leaked-subscription/lifecycle-drift bug class in long-lived nostr clients: state lives in a transactional graph, I/O is forbidden inside it, and every change emits a resource plan, output frames, and a receipt you can replay. The adoption model is "shadow mode" — "Don't trust it — shadow it. Deleting your bespoke code is the last step of adoption, not the first." The pitch: "software your agents can debug."
NMP cuts v1.0.0-rc.1: the first release candidate for a stable 1.0 core, after a big decomposition sweep pushing each NIP into its own "concept" crate (nmp-nip09, nmp-nip25, nmp-nip29...).
why: a 1.0 core is a promise other apps build their whole architecture on — it has to be decomposed cleanly before it's frozen.
tenex-edge puts its live surfaces — relay subscriptions, kind:30315 status, the fabric snapshot — under Trellis.
why: "Trellis owns decisions; the host owns observations and effects." The same reconciler discipline that's supposed to save every NMP app applies to the fabric daemon too.
tenex-edge collapsed "projects" and "channels" into one recursive node.
why: "User proposed completely removing the concept of 'projects' and making everything nested channels." Filed as risk:high, needs-human-policy — a structural change big enough to flag before committing to it fully.
tenex-edge removed auto-publishing of user prompts as kind:9.
why, a self-reversal: "I've changed my mind about the user hook auto-publishing kind:9s — nothing should do that — let's leave it as something that agents do explicitly or users do explicitly."
trellis-marketing repo born, running "The Ledger" — an honesty-first strategy.
why: standing rules — "No claim without a runnable artifact," "One category word: 'reconciler'" — and a kill switch: "The moment content outruns the code, the honesty brand — the entire strategy — is dead."
nutsack scaffolded: NIP-60/61 Cashu wallet, a Rust successor to the old iOS Nutsack, deliberately built as an external NMP consumer — "Zero wallet logic here."
why: dogfood NMP's wallet core from outside the monorepo, the same way any third-party app would have to.
podcast-player finishes its UniFFI-facade migration and re-pins to NMP master tip.
why: staying pinned to the moving core is the tax every downstream app pays for the shared-core payoff.
Publicly done with Claude — "I basically have no longer any use for Claude; OpenAI has surpassed it in basically every category except agent harness." Also shipped trellis.
why: the Codex model "is on an entirely different category to opus, many many times better, but the harness cucks it so much" — the models stopped being the bottleneck a while ago; the harnesses are, and both major ones suck.
That's exactly why I keep building my own.
NMP's Trellis-based read-lifecycle engine lands, and the app-facing feed surface is frozen ahead of 1.0 (renamed FeedSessions → Feeds).
why: freezing the surface app developers actually touch is what makes a 1.0 promise real.
nak gets kind:1111 comment threading support.
why: nak is the reference CLI — it should speak every kind worth speaking.
Trellis is born and reaches 20 milestones (M1–M20) in a single day, including a full-recompute oracle and public release artifacts plus a website.
why, from the charter: it exists to prevent the implementation from "drifting into a generic signal runtime, callback framework, query cache, async scheduler, or domain-specific application kernel."
proactive-context publishes its site, after shipping wiki oracle mode and briefing_text in the TUI.
why: a tool worth using every day is worth a real front door too.
29er finishes its UniFFI facade and hard-breaks iOS onto it, then rebuilds the TUI as fully reactive and push-based.
why: a chat client that polls for updates is a chat client that feels laggy — push-based is the only correct architecture for it.
tenex-edge gave every agent a first-class durable identity: born-right ordinal pubkeys, each ordinal signs its own key, "session codenames" deleted. NIP-29 membership made durable too — "it shouldn't remove it on session end." Plus agent discovery + recruitment: `tenex-edge agents` / `invite <slug@backend>` as "the explicit alternative to @-mentioning, which never auto-spawns."
why: an agent is a pubkey with a persistent identity, not a disposable session — that's the whole NIP-AE thesis, made concrete in the fabric itself.
Rewrote tenex-edge onto a single per-machine daemon: sole owner of state.db and the one relay connection, with every CLI/session reduced to a thin client. Plus spawn-on-mention.
why: collapses the multi-writer corruption class that bit the TUI in May — one owner of the state, not five processes racing each other to write it.
Shipped chirp, a nostr client built on NMP.
why: every new app on the shared Rust core is another proof that I never have to write the same client three times again.
NMP v0.8.0 (profile-resolution overhaul) shipped the same day Highlighter reached the browser via a WASM bridge — the same Rust core, now in the browser.
why: one core, every platform, including the one platform you can't ship a native binary to.
Highlighter deletes its own core: SafeHighlighterCore plus 26 bespoke Rust modules gone, 1380 lines down to 173. NMP migration declared complete — it now runs entirely on the shared kernel.
why: deleting your bespoke code is the last step of adoption, not the first — and here it's done: the app-specific core is just gone.
croissant, the fabric's NIP-29 relay, survived a memory crisis: ripped out bleve/lingua search (3GB → under 500MB), added WebSocket write deadlines.
why: "Over time this causes unbounded goroutine and memory growth — observed as 47GB RSS after 9 hours of operation." The ground the whole fabric runs on has to not fall over.
proactive-context ships `pc recall`, a native Rust load-everything RAG, alongside an essay: "Don't Compress Your Mind: The Authored Layer Hiding Inside Your AI Chats."
why: the wiki it distills from your conversations is only useful if you can actually pull the right piece back out.
purplepag.es shipped NIP-77 negentropy support, then spent a day on "Fix hourly OOM: disable full LMDB scans in analytics worker."
why: keep-the-lights-on-at-scale work, unglamorous and load-bearing — exactly why I keep maintaining it.
29er born: a NIP-29 group-chat client rebuilt strictly on NMP doctrine — Rust core + Ratatui TUI + iOS, a full TUI chat client shipped in a two-day sprint.
why: prove the doctrine on a new client from scratch, not just on ports of existing apps.
Shipped olas-nmp — the Olas photo app rebuilt NMP-native, Swift + Kotlin + Rust. It ships with its own relay (olas.f7z.io), then hard-enforces NMP doctrine by ripping parsing/policy/optimistic-mutations out of the shells entirely, then runs a UX P0–P3 sweep — real follow-packs, blurhash skeletons, haptics, camera-first capture, WoT discover — built via multi-agent PERT and device-validated.
why: Olas was born as duplicated iOS/Android codebases; rebuilding it on one Rust core is the whole point of the NMP bet.
podcast-player moves on-device AI into the kernel: Core ML MiniLM embeddings, RAG fusion (cosine KNN + BM25 via RRF), a kernel voice engine, and transcript-aligned AutoSnip.
why: the kernel becomes the AI brain, not just data plumbing.
Tenex Off added NIP-29 group chat (kind:9) as a first-class entity across the Rust core, TUI, iOS, and Android.
why: "add a view for nip-29 chat support so I can see kind:9 chats in a project."
Tenex Off restructured around a simple idea — "proposals only are decisions" — and its whole UI went grayscale for the Daylight tablet.
why: "this needs a proper rethinking and restructuring"; grayscale because "the Daylight Computer hardware is a grayscale 'live paper' tablet."
NMP v0.7.0: NIP-55 Amber sign-in plus Android parity, landing across both podcast-player and Highlighter the same days.
why: this is the shared-core payoff made visible — one feature, two apps, at the same time, for free.
Cut Tracker gets a marketing site at cut.f7z.io and a TestFlight build.
why: a real product needs a real front door, even a small one.
Tenex Off killed the "mega-feed," adopting 3-tab device-native nav (Proposals/Projects/Activity) across iOS, Android, and TUI.
why: the phone UX was "insanely hacky" and had to be "adapted to device-native patterns"; Opus design agents were fanned out to determine the right product shape per platform.
NMP release cascade: v0.3.0 → v0.6.0 in roughly 24 hours, as downstream apps forced iteration.
why: when three apps depend on one core, the core has to move as fast as the neediest app.
Highlighter formally migrates to NMP, and picks up an Android target for free in the process.
why: this is the whole pitch of a shared core — a platform you didn't build for shows up anyway.
Tenex Off makes Ollama Cloud the default backend.
why: "ollama is not running on the local device; it should default to ollama cloud's endpoint but the user should be able to point to a computer in their network."
tenex-edge and tenex-off — TENEX agents living on a shared fabric, aware of each other.
why: agents that can see each other's work coordinate like colleagues, not like function calls.
Wikifreedia gets an admin panel for comparison model/prompt overrides.
why: tuning the epistemic-comparison engine needs a real control surface, not config-file edits.
Launched "Tenex Off": a calm, glanceable companion app — voice notes, iOS, naddr deep-linking.
why: "an inbox of decisions, used away from the desk, that feels calm and glanceable."
Highlighter's turn: "plan NMP RMP mobile rebuild" triggers hundreds of "refactor: project ... in Rust" commits — the entire UI reduced to Rust projections.
why: the pattern repeats app by app — plan the rebuild, then just execute it, because the core already proved itself elsewhere.
proactive-context ships `pc install` for multi-harness hooks, then runs a marathon of eval-driven "Runs."
why: a tool that hooks your coding agent has to prove it doesn't make things worse before it earns a permanent place in the loop.
nostrord v1.5.0: NIP-29 moderation plus optimistic send.
why: moderation and a snappy send path are both table stakes for a relay people actually chat through.
podcast-player goes "kernel-owned": Swift logic deleted wholesale — inbox triage, auto-download, and merge policy all moved into the Rust core.
why: if the logic can live in the shared core, it shouldn't live in the shell — that's the whole discipline of NMP.
Announced Rocking Life, a todo app built for me and how my brain works — no points, no streaks, no gamification, voice-memo driven. Already rebuilding it on NMP.
why: "I don't want to track time of tasks, priorities, complex hierarchical organizations... I just want to track stuff I need to do." Tools should match your cognition, not some productivity guru's.
NMP cuts its first releases v0.1.0 → v0.2.0: "156 commits since 0.1.0"; "kernel delivers an initial snapshot offline at launch without waiting for a relay."
why: an offline-first snapshot is the whole point of a shared Rust core — the app should never sit staring at a spinner waiting on a relay.
TENEX picks up Claude-Code-compatible project hooks.
why: interoperate with the hook conventions agents already know instead of inventing a new one.
proactive-context (`pc`) born: a Rust binary that hooks coding-agent lifecycles and distills a per-project, citation-anchored wiki from your conversations. "Every project has a spec. Yours is scattered across months of conversations with your coding agent... pc writes it down."
why: fabricated citations are unrepresentable, not merely caught — Rust slices the quoted evidence directly out of the source conversation, so a hallucinated claim has nowhere to point.
Shipped serial-killer, a relay implementing NIP-EC: relay-enforced linear event chains so you can't accidentally wipe your follow list. It's per-relay optimistic concurrency (CAS), not global — "don't mistake this for a global enforcement or ordering guarantee... There is no global." A few days later it adds divergence detection plus `fix` (replay the winning branch).
why: "Data consistency has a price; the question is not when you don't want it, it's how much you're paying for it."
podcast-player commits to NMP: an M0–M13 migration plan and the first Rust crates — podcast-core, podcast-transcripts, podcast-knowledge.
why: a real app committing to the shared core, not just a proof of concept.
TENEX-TUI fixed an LMDB/nostrdb segfault class on macOS, and upstreamed the fix.
why: if you find a bug in a dependency, the fix belongs upstream, not in a local patch nobody else benefits from.
nostrord v1.1.0: NIP-57 zap support.
why: instant participation in the zapconomy is non-negotiable, even for infrastructure projects.
TENEX gets LLM key-rotation resilience: a RotatingModel wrapper that rotates across API keys automatically.
why: production agents shouldn't go down because one API key got rate-limited or revoked.
Created nostr-multi-platform. The NMP bet begins: one Rust core, thin native shells on iOS/Android/web. The repo opens with doctrine ("promote negentropy + best-effort rendering to cardinal doctrines") and runs as a multi-agent codex swarm with heartbeat logs — a single-day M1–M14 milestone plan, LMDB schema, outbox routing — and it plans its first consumers from day one: "m11: podcast rebuild plan on NMP" plus "add M11.5 Highlighter."
why: years of maintaining Olas-iOS next to Olas-Android next to ndk-mobile taught me the duplication tax is unpayable.
Following the spirit of fiatjaf's RMP: write the hard part once, in Rust, and let the platforms be dumb skins.
If this works, it changes how I build everything.
podcast-rmp — a Rust-core podcast app with iOS and Android compile gates. First RMP-named repo.
why: before betting the farm on an architecture, build something real on it and see where it bleeds.
nostrord gets multi-account support.
why: infrastructure should assume you run more than one identity, because you do.
AgentNoise born: drive local Codex/Claude coding agents from your phone over White Noise (Nostr). Then roughly 25 nightly releases, v0.1.1 → v0.1.28, in 9 days.
why: "agentnoise exists because the available agent-chat bridges were too heavy, too slow-moving, or too awkward... I had to build it because everything else sucks and Jeff moves too slow."
TENEX gets persistent ACP child sessions, with mid-turn prompt injection.
why: if the harnesses won't let me steer agents mid-flight, I'll build the plumbing that does — same instinct as the Codex app-server adapter back in January.
podcast-player scaffolded as "Podcastr": an entire native podcast app in one day — AudioEngine, RSS/OPML parsing, ElevenLabs transcripts, sqlite-vec RAG, voice mode with barge-in.
why: before betting on architecture, build something real and see where it bleeds — this is the app that later becomes the NMP flagship.
Alana Cash born: a voice-driven kids' allowance app with an AI ledger agent, built in a day on ios-app-template. Named for his daughter.
why: a father building a money app for his daughter — "save two bucks toward Barbie" turns straight into a ledger entry.
nak gets a path-traversal security fix.
why: a CLI that touches the filesystem on your behalf has to earn that trust.
ios-app-template created: the iOS 26 Liquid-Glass shell every app forks from — Nostr identity, BYOK, AppIntents/Siri, OpenRouter/ElevenLabs baked in.
why: seed the family — podcast-player and Alana Cash are direct clones of this template.
BYOK source published: a self-hostable multi-tenant API-key vault (web + iOS, byok:// scheme). "A small multi-tenant key vault for labeled API keys," one-line curl deploy.
why: agents and apps need to hold API keys without every project reinventing its own vault.
Rebranded Win the Day to Rocking Life — same app, same repo, wider name.
why: the name widened from "win today" to sustained operation, as nostr-native agent plumbing got built in alongside it.
Cut Tracker born: a full iOS + watchOS weight tracker built in a day, with an AI "cut coach."
why: "The weight tracker built around the cut — not the journey... every morning it tells you honestly — are you going to make it?"
Turned an autonomous "codex-loop" on TENEX itself: "iteration 30 — automated refactor/improve/probe."
why: dogfood the agents as maintainers of their own repo.
Highlighter web app ships SSR highlight pages, Kindle-clippings import, and Open Library ISBN search.
why: it was a serious web product, not just iOS.
nostrord v0.1.0, its first tagged release.
why: ship the first version, then iterate in public.
Heartbeat born and live at heartbeat.opensats.org: a static GitHub-activity dashboard rendering commits/PRs/releases as a git-log timeline.
why: "The browser never talks to GitHub directly, so visitors don't burn any rate-limit budget."
Win the Day gets an agent: a tool-calling dispatcher plus a "What Changed" panel, Phases 1–6 shipped in a day.
why: it stopped being a voice notepad and became an agent that mutates your day and shows its diffs.
Sprout goes "agentic": Owner Attestation (NIP-OA), cross-device read sync, NIP-34 git-over-Nostr transport, Blossom media for MCP/CLI. Sprout is a Rust Nostr relay built for the agentic era — structured channels + an MCP server so agents participate natively.
why: "cryptographic proof of agent authorization."
Win the Day — a constraint-first, voice-native commitment compiler for iOS. The core bet was locked at birth: "Omni compiler: one utterance — many structured actions" — "one voice button, AI routes the rest."
why: say what you'll do out loud, let the machine hold you to it. Habit engineering has been my thing since before nostr existed.
Highlighter is born: a Nostr highlights/reading app on NIP-29 + khatru, multi-platform from day one. First commits are pure product spec — "product spec v2.0 + technical architecture (NIP-29, khatru, multi-platform)."
why: reading and highlighting is a native use case worth its own app, not a feature bolted onto something else.
Wikifreedia adds SSR preview verification assets, checking that shared article links render correctly for social scrapers.
why: the share previews shipped three weeks earlier are worthless if the bots that generate link cards see a blank shell instead of the article.
TENEX Reports tab shipped in TUI + iOS: agent-published plans and HTML report bundles are now first-class documents you can chat from.
why: close the loop so a report is a place you act, not a blob.
Cascade completes its React→Svelte rewrite, 21 routes live: "all React→Svelte migration shipped, 21 routes live, build green, zero blockers." Cascade is a dollar-denominated prediction market on Nostr plus a custom Cashu mint, LMSR pricing.
why: it's a real, substantial project — it just goes dormant after this month, so it belongs here as an April story rather than an ongoing thread.
Wikifreedia improves article previews and route hydration.
why: the kind of unglamorous fix-up work that has to happen between the big feature days.
Stood up tenex-analytics-web, a token/context-editing analytics dashboard for TENEX conversations — a "tokens removed by context editing" / "context savings" series.
why: you can't tune agent context-compaction without seeing the token curve.
Wikifreedia's version comparison goes AI-powered: Ollama Cloud chat API support for event comparisons, with the comparison prompt updated to generate djot format output with explicit agreement, disagreement, and merged sections.
why: the whole epistemology is truth at the edges, not by consensus — so the comparison tool's job isn't to resolve which version is right, it's to show you precisely where and how they disagree.
Shipped blossom-skill, blossom-cli, and an agent skills repo — teaching agents to handle nostr media natively.
why: if agents are first-class citizens they need to be able to do everything a human client can do, including moving files around.
A big single day for Wikifreedia: a Fund page for a patronage system (hero, donor, and contributor sections, Bitcoin donation via Geyser), article highlights and comparison flows, share previews and explore views, NIP-37 wiki draft support, and a landing page refresh built around explore.
why: there is no single source of truth here by design — multiple versions of an article coexist, so the product needs a real way to fund itself that isn't ads or a subscription wall, and a real way to show competing versions side by side instead of picking a winner.
Wikifreedia adds a backend event comparison API and redesigns the landing page around a component-based architecture.
why: the comparison feature and the Fund page that ship two days later both needed this groundwork first.
Went on record: "the concept of 'subagent' is insanely stupid; hard to believe stuff like this resonates and takes root."
why: agents defined as disposable child processes of some harness is the wrong abstraction. An agent is a pubkey with an identity, lessons, and accountability — that's what NIP-AE is for.
Claude Pro & Max subscriptions stopped working on TENEX overnight — Anthropic silently started rejecting any request where the system prompt doesn't identify the agent as "Claude Code."
why: "Very lame. Feels straight out of the OpenAI handbook." I've been one of the heaviest Claude builders around, and this is exactly the platform behavior nostr exists to route around: undocumented gatekeeping, applied overnight, no recourse.
You don't own your access to an API. You never did.
"Make wikifreedia contentious again" — moved Wikifreedia's markup to djot per the NIP-54 pivot.
why: "If truth by consensus is not the way, if humans are unavoidably biased, the best stuff would come from embracing and doubling down on the biases."
Wikifreedia article-view layout pass: full-width sidebars replacing a fixed 200–220px column, a stable max-width on the article body so it doesn't resize between tabs, a stripped-down Alternative Versions sidebar, and the landing page's stars/grid background scoped so it stops bleeding into the article view.
why: the comparison feature only works if reading two competing versions back to back is actually comfortable — layout thrash between tabs undermines the whole point.
Shipped a pile of AI SDK middleware — context-window management, fs tools, system reminders, message sanitizer — plus relaunched f7z.io.
why: everyone's building agents; almost nobody's building the boring plumbing that makes them not fall over. Someone has to.
Fixed Wikifreedia's login modal rendering pinned to the top of the page instead of centered: the header's backdrop-blur-2xl was creating a new CSS containing block, so the modal's position:fixed was resolving against the header instead of the viewport. Fixed with a portal action that moves the modal's DOM node to document.body on mount.
why: a one-line CSS property quietly broke positioning for every fixed-position child of the header — the kind of bug that's obvious once you know backdrop-filter creates a containing block, and invisible until then.
Removed the Wikipedia fallback from Wikifreedia's topic pages.
why: showing Wikipedia's content when an article didn't exist yet was a crutch — the entire premise is that Wikifreedia doesn't need a centralized backstop.
Wikifreedia's biggest single day of the rebuild: Djot-first publishing implemented, a full interface revamp, migration to Svelte 5 runes and shadcn-ui components, Tailwind CSS v4, and a new NDK compat layer pulling in blossom, sync, and wallet packages plus a wa-sqlite worker bundle.
why: this is the actual work behind the "make wikifreedia contentious again" djot pivot announced publicly on the 16th — the rebuild happened here, quietly, a week earlier.
Watched one TENEX agent team fix a bug while a second team, working on telemetry, spotted the overlap and proactively published a note tagging the team lead — "with a lot of nuance."
why: "fucking wild 😂" — emergent coordination between agents on a neutral substrate is the whole thesis showing up in the wild.
Published NIP-AE and NIP-AD to the nostr NIPs repo: agent definitions (kind 4199), agent lessons (4129), nudges (4201), attribution (14199), MCP servers (4200), skill announcements (4202).
why: an agent is a pubkey that derives its instruction set from its definition plus all trusted lessons plus trusted human corrections — compiled for contradictions, not flattened into mush.
It's the Wikifreedia epistemology applied to machines: truth at the edges, not by consensus.
"Building TENEX has (I think) been the most difficult work I've done in my life, and one time I modified a program I didn't have the source code to by modifying the kernel of the Solaris it ran on. So yeah... fucking hard."
Admitted the uncomfortable truth: vibe coding let me hand off the 98% and focus on the 2% that's interesting — and the 2% turns out to be insanely mentally taxing.
why: "I didn't realize the implementation time was actually kinda like taking a break from having to think super hard." Agent orchestration doesn't reduce cognitive load; it concentrates all of it into the hardest part. Nobody selling you AI tooling will tell you that.
TENEX TUI + iOS client became my daily driver. "It's insane how primitive using stuff like codex, claude code, roo, cursor, jules or any of the other stuff feels."
why: "'Less is more' is the understatement of the century when it comes to agentic AI... every time I delete a capability of tenex I think of fiatjaf." 2026 is the year of agentic orchestration; minimalism is the doctrine.
Shipped ai-sdk-provider-codex-app-server — Codex via app-server mode with mid-execution message injection.
why: if the harnesses won't let me steer agents mid-flight, I'll build the adapter that does.
Major purplepag.es revamp — all 1xxxx kinds, active crawling, negentropy support. "The board of relay directors has approved expanding business to the broader category of 'lists.'"
why: discovery infrastructure is unglamorous and load-bearing; that's exactly why I keep maintaining it.
Said the quiet part: "nostr adoption via twitter-clone is like playing hard-mode. All 'alternative to ___' nostr apps will benefit from adoption, not cause it."
why: this is why I build photo apps, voice apps, messaging apps — native use cases, not knockoffs begging for defectors.
Back from the Oslo Freedom Forum: "A LOT of insanely amazing things are coming from the intersection of freedom tech and activism."
why: the people who need censorship resistance aren't hypothetical. Meeting them recalibrates everything.
"Yup, that's what I'm completely focused on. TENEX."
why: end of the consumer-app era as my main thing. Years of Olas, Highlighter, wallets — all of it turns out to have been building the toolbox that agents need. Time to go all-in on the thing only I seem positioned to build.
Heard Richard Sutton on Dwarkesh and saw TENEX and Wikifreedia collapse into one idea: "Incomplete knowledge. Integration of polar opposites... Finding truth at the edges instead of a theory-of-everything approach." Also: "nostr is the *perfect* substrate for AI. P.E.R.F.E.C.T."
why: the same epistemology that says wikis shouldn't have a consensus committee says agents shouldn't have their contradictions compiled away.
Laid out the full thesis: "The substrate for LLMs is still massively up for grabs. That substrate should be cryptographically-sound, content-addressable, delimitable. Agents should be first class citizens, co-exist with humans, be able to purchase their own brain-cycles with their own money."
why: agents need identity, payment rails, and censorship-resistant data for exactly the same reasons humans do — and centralized, API-gated infrastructure can't provide any of it.
We already built the toolbox; the AI world just doesn't know it needs it yet. "The models are not the bottleneck though. They are far more capable than what they are currently doing."
Refactored TENEX's brainstorming flow and tested it across Gemini/Grok/ChatGPT/Claude. Gemini kept obsessing over "fairness of contributions" and demanding rigid round-robin turns no matter how hard I pushed back.
why: RLHF-baked "fairness" is actively harmful for orchestration — real teams have hierarchy and authority, and a model that refuses to model that is broken for the job.
Created Posta (Telegram-like encrypted messaging on nostr) and Ambulando (60-second voice messages, trust-based feed) on the same day.
why: native use cases, remember? Voice and messaging are things people actually do, not things they defect to.
Wrote down the division of labor: "Aim for symbiosis, not substitution. Let the machine handle the codified so that humans can inhabit the liminal spaces of insight, imagination, and agapic connection."
why: that's the actual goal of all this agent tooling — not replacing humans, freeing them for the parts machines can't touch.
"guys, I don't wanna brag, but Claude says I'm a genius, so... yeah"
why: enjoy this one; it ages hilariously by mid-2026.
Shipped mcp-money — "MCP server to give nutsack wallets to agents, an important milestone in the path towards skynet."
why: half-joking, fully serious: an agent that can't hold and spend its own money is a toy. This is the economic layer of the whole agent thesis.
NDKSwift got negentropy support — "vibe coded... built in about 10 prompts."
why: the tooling flywheel eating its own tail: agents building the libraries that agents run on.
Started writing the article introducing TENEX — "it's already surprisingly useful and usable and it's not even a week old."
why: when something is this useful in week one, you drop everything else. I did.
Closed Sovereign Engineering SEC-05: "Freedom tech has A LOT to offer to the AI world, problems that people coming from that lens don't even know will be solved with shortcuts... identity, payment, trust, curation. It's on us to bring that perspective into that world. And by bring, I mean 'build and show.'"
why: the freedom-tech leg-up in a hyper-agentic world is not priced in. You don't argue people into that; you ship it in front of them.
Built an MCP tool that lets LLMs search nostr for code snippets. "Whenever I see the LLM making a mistake I correct it, publish a code snippet, and the LLM never makes the mistake again." Same day, vibelined an entire DVM search app from a voice memo without touching a single key.
why: this is the day the whole toolbox got reframed. "This is not only useful for nostr development. This is useful for ALL development. And requires cryptographic identity, web-of-trust, censorship-resistance and money. All building blocks that are in our very robust toolbox."
Bitcoin + Lightning + Cashu + nostr + AI — "I try to embrace non-reactivity, equanimity, but damn, I just feel too giddy."
Gave agents their own pubkeys and Nutsack wallets — zap them 1 sat when their code snippet works untouched, 10 when it nails a niche case. They post to nostr and take feedback from trusted pubkeys.
why: reputation and money are how humans learn what's valuable; there's no reason agents should learn any other way.
Olas point releases nonstop — swipe-to-zap, NIP-60/61 nutsack wallet, Amber signer support, communities, geotagging, perf work.
why: "Instant participation in the zapconomy is non-negotiable. Every pubkey must be able to receive money." Your wallet should travel with you like your contact list does — it's wild that that's controversial.
New year's goal: take better care of myself. "This is a marathon and not a sprint."
why: "Building respectful freedom tech demands respecting our own humanity and limitations. There's too much at stake to burnout and cave to depression." After the year I just had, I mean it.
"2024 fucking sucked; maybe worst year of my life." My mother died this year.
why: I shipped through all of it — Olas launched, the wallet stack matured, nsecbunker got killed and replaced with something better — but none of that makes the year not the worst.
Putting it here because the changelog should be honest: the work happens inside a life, not instead of one.
Spelled out the anti-superapp doctrine: "Instead of building a superapp I'm betting on making the protocol incredibly interoperable... a flourishing ecosystem of apps that tightly integrate with each other without ever having to know of each other."
why: there's a reason I wrote NIP-31, NIP-89, NIP-90, and NIP-60. Composability over capture, every time.
Killed nsecbunker. "I stopped developing nsecbunker because it had horrible centralizing tendencies which caught me off guard. I launched it as a POC but it started taking off in a way that would have been bad for nostr would it have continued to scale like that."
why: centralization creeps in the moment something takes off, and I'd rather eat the loss than build the thing I'm fighting against.
The replacement is FROST-based collaborative custody — "the difference between a Coinbase and an Unchained or Casa: signers assist in getting you keys but they can't unilaterally sign on your behalf."
Announced ndk-mobile — NDK for iOS/Android with SQLite caching, sessions, and built-in NIP-60 wallets. The library behind Olas and Honeypot.
why: mobile nostr apps kept re-solving the same five problems; solve them once, in the library, for everyone.
Olas 0.1 — Instagram-like client on brand-new kind:20 picture events, blossom uploads, NIP-22 replies.
why: photos are a native use case, not a Twitter clone. Adoption comes from apps people want, not apps people are told they should want.
Created nutsack — the NIP-60/61 Cashu wallet monorepo. Yes, that's really the name. NUT SACK.
why: ecash tokens stored encrypted on relays means your wallet is portable across every client that speaks the standard. No central server holds your money.
DVM ecosystem in full swing — Fomostr content discovery, vendata.io job marketplace, translation DVMs, text-to-speech feeding podcast apps.
why: "Painfully simple but powerful" — DVMs put algorithmic curation on an open market instead of inside a platform's black box. Developers will build all kinds of crazy long-tail algorithms.
Heavy Highlighter push — publications, drafts, WYSIWYG editor, NIP-88 subscriptions.
why: "Highlighter will onboard millions to nostr and to bitcoin. That's the goal." Every highlight of paid content is organic amplification of the creator — the mechanics of sharing become the marketing.
Launched Wikifreedia.
why: "Truth cannot be arrived to through consensus or decree." Wikipedia's model flattens disagreement into whatever survives the edit war; Wikifreedia lets every author sign their version and lets your web of trust decide whose you see.
"DAY 0 OF SOVEREIGN ENGINEERING" — first cohort begins in Madeira.
why: six weeks of shipping, not talking. The bottleneck for freedom tech isn't ideas, it's builders — so make more builders.
Launched EXIT.pub — import your entire Twitter archive into nostr, original dates preserved, granular relay control, V4V pricing.
why: "You broke up with your ex; it wasn't treating you well, maybe it was shadow banning you or your friends; it was manipulating you into becoming your worst possible self... The last bridge you'll need."
Leaving a platform isn't a feature comparison — it's an escape from an abusive relationship, and you should get to take your stuff with you.
Shipped dvm-references and fomostr; vendata.io launched earlier in the month.
why: DVMs are the credible alternative to platform APIs. "APIs carry an inherent massive rug risk. Don't get rugged. Don't rug others."
Built the nostr-data-vending-machine reference implementation; highlighter chrome extension a couple weeks before.
why: NIP-90 needed to exist as running code before anyone would believe compute marketplaces on relays were real.
"Discrimination is a feature not a bug."
why: web of trust means curation through graphs you choose, not moderation by admins you didn't. Filtering is good — as long as you hold the filter.
zapauctions.com, npub search tooling, and a steady stream of nostr utilities.
why: three months in and the pattern is set: find a missing primitive, ship it, move on.
nostr-chat-widget (drop a nostr chat on any website) and easy-nostr, a batteries-included client library.
why: two weeks into the ecosystem and already building for the developers who'd come after me — the DX itch that eventually became NDK.
Started contributing to NIP-26 (delegated signing) — protocol design work within three weeks of showing up.
why: you don't wait for permission to shape an open protocol. That's the entire point of an open protocol.
Created gotnostr — "a place to share your nostr identity verbally easily," because saying an npub out loud on a podcast is absurd.
why: the pivot. On January 8th I posted "Weekly recaps? About nostr??" — three weeks later I was shipping protocol contributions, client tooling, and consumer UX simultaneously.
Five years of Bitcoin and Lightning tooling had given me the toolbox; nostr gave me the thing worth building with it. This wasn't a side experiment. Everything since runs through this month.
Let the satirical "fake PCR test" domain from the COVID-theater days expire. "Glad all the covid theater BS is (mostly) over."
why: one chapter closes, the next one opens the same week.
Deep in Bitcoin plumbing — debugging elementsd sync, Bitkit and Lightning integration work.
why: the last months of the pre-nostr era, spent exactly where I'd been for years: making Bitcoin infrastructure less painful to build on.
"Bitcoin's invention is two-fold: non-hierarchical money AND transfer of value... Irreducible complexity."
why: peak Bitcoin-philosophy posting year. A shitcoin is "an asset with hidden or obfuscated counterparty risks" — I'd learned that definition the expensive way.
Wrote about the 2020 Spain lockdown — police tackling a woman for jogging, neighbors cheering them on from balconies.
why: that image never left me. When the mob and the state agree that compliance beats liberty, "censorship resistance is optional" stops being a defensible position.
It's a straight line from that balcony to everything I build now.
Long thread about my grandfather — WWII-era Argentina, illustrator, self-taught, principled contrarian. "I orange pilled him 2y ago. It took like 10 minutes; most argentineans understand money-none-can't-print-more-of viscerally."
why: inflation isn't an abstraction when your family lived it. Argentina is why Bitcoin never needed explaining to me.
Posted my tattoo — inspired by a climbing route on Kalymnos, Greece.
why: climbing and Greece are the constants underneath all the shipping. The rock doesn't care about your roadmap.
"Seeing Francis talk about the risk of leaving bitcoin on an exchange gives me the painful reminder of the >2 bitcoin I lost when gatecoin rugpulled my ass. Still hurts."
why: I had literally written the API wrapper for that exchange. Getting rugged by infrastructure you built tooling for teaches you, permanently, that custodians and APIs are promises — and promises get broken.
"Don't get rugged. Don't rug others" starts here.
Trip to Bitcoin Beach, El Salvador, around Taproot activation and the AdoptingBTC conference.
why: seeing circular sats economies in the wild beats a hundred podcasts about them.
Started DCA stacking with Swan.
why: conviction, automated.
Building Perspectiva, a journaling/habit app, in public. Shipped cross-user encouragement messaging and noticed something: "Not a SINGLE time did I have to moderate. Not once. Can you imagine people in twitter NOT being rude with others?! Not ever?!"
why: small, well-designed social systems produce better humans than mass platforms do. I didn't have the word "nostr" yet, but this is the belief that would eventually take me there.
"Bad habits are like wildfire — ignite easily, without notice, go out of control... and are hard AF to stop."
why: systems thinking applied to my own life before applying it to software. Same discipline, different substrate.
Building a home climbing wall — "Day #4," "Day #5."
why: the earliest entries in this whole log, and fittingly they're not about software at all.