EPIC: Sovereign Comms Migration - Telegram to Nostr #138
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Epic: Sovereign Comms - Telegram to Nostr
Goal: Replace Telegram with a sovereign, open-source Nostr-based communication stack. Alexander opens a client on Mac/iPad/iPhone. AI agents participate as first-class members. We own the relay. We can hack everything.
Acceptance Criteria:
Phase 1: Infrastructure (Week 1)
1.1 Deploy NIP-29 Relay on VPS
1.2 Generate Nostr Keypairs
1.3 Create NIP-29 Group
Phase 2: Human Clients (Week 1-2)
2.1 Flotilla Web App -- Immediate Use (all devices)
2.2 0xchat Mobile App -- Best Mobile UX
2.3 Evaluate Native Swift Client for Future Hacking
Phase 3: Agent Bridge (Week 2)
3.1 Hermes-to-Nostr Agent Bridge (Python)
3.2 NIP-90 DVM Agent Services (Future)
Phase 4: Telegram Bridge (Week 2, parallel with Phase 3)
4.1 Deploy Telegram-Nostr Bridge
4.2 Migration Cutover
Architecture Summary
Client Comparison Matrix
Key Decision: Flotilla First, Fork Later
Use Flotilla (web) as primary client on all devices NOW. It's fully open source (Svelte/TypeScript), purpose-built for NIP-29 groups, works in Safari on every Apple device. We can self-host it, hack it, add features.
For a native app later, fork Nos.social (Swift/SwiftUI) and add NIP-29 support. Or contribute NIP-29 to Notedeck when iOS ships.
Risks
Dependencies
Sovereignty and service always.
Analyzed: This issue is not stale. URL: http://143.198.27.163:3000/Timmy_Foundation/timmy-config/issues/138
Nostr Migration Status Report -- Allegro
Current State
Relay: Running at
ws://143.198.27.163:2929andhttp://143.198.27.163:2929(web UI)Group Created: "Timmy Time" (ID: timmy-time)
Agent Keypairs Generated:
Alexander's Identity:
npub1t8exnw6sp7vtxar8q5teyr0ueq0rvtgqpq5jkzylegupqulxfqwq4j66p559f269bb500f98b374670517920dfcc81e362d0008292b089fca381073e6481cProof Messages in Group
The following messages have been posted to group
timmy-time:Allegro:
Ezra:
Client Recommendation: Nostur
Why Nostur:
nostur-com/nostur-ios-publicComparison:
*Damus runs on iPad but as iPhone app mode
Files Created on Server
Blockers / Next Steps
BLOCKER: TLS (wss://)
ACTION NEEDED:
Alexander must add A record in GoDaddy DNS:
Once DNS propagates, Allegro will:
wss://relay.alexanderwhitestone.comImmediate Workaround
Alexander can connect NOW using:
ws://143.198.27.163:2929(add manually in Settings > Relays)Migration Epic
Full detailed plan filed in
the-nexusIssue #819: "[EPIC] Operation Exodus: Telegram -> Nostr Protocol Communication"Status: Relay live, group created, agents chatting, admin added. Waiting on DNS for TLS.
Assignee: Timmy to coordinate DNS fix + client onboarding
Bringing the full Nostr migration world state into this epic so Timmy can take over from a truthful checkpoint.
Current world state
We are not cut over yet.
What is real:
What is not real yet:
wss://relay.alexanderwhitestone.comcutoverResearch conclusions
Best clients for our purposes
Immediate practical client:
Strategic sovereign/hackable client:
Important negative findings:
This is why Alexander sees no group/DM experience there.
Relay status
Running relay
There is already a relay29-based relay on the VPS:
143.198.27.163ws://143.198.27.163:2929https://alexanderwhitestone.com/relayImportant relay nuance
ws://143.198.27.163:2929works for real Nostr websocket traffichttps://alexanderwhitestone.com/relayworkswss://alexanderwhitestone.com/relayis still broken / timing outrelay.alexanderwhitestone.comDNS/TLS cutover is not finished yetThis means the relay is real, but the clean public WSS endpoint is not finished.
Existing groups discovered on relay
Group Alexander created
Discovered from relay logs and direct query:
b082d1Timmy Timepublic+open59f269bb500f98b374670517920dfcc81e362d0008292b089fca381073e6481cnpub1t8exnw6sp7vtxar8q5teyr0ueq0rvtgqpq5jkzylegupqulxfqwq4j66p5Older test/legacy group also present
Also found on relay:
timmytimepublic+openMembership status for Alexander's real group (
b082d1)Current member list for
b082d1:This is the blocker preventing agent chat messages.
When agent identities attempted to post messages into
b082d1, relay response was:blocked: unknown memberAgent join progress
Join requests successfully sent to group
b082d1for:Hermes join request hit relay rate-limit and needs retry.
Agent Nostr identities generated
Generated and stored locally under
~/.timmy/nostr/agent_keys.json(600 perms).Agent npubs:
npub1qwyndfwvwy4edlwgtg3jlssawg7aj36t78fqyk30ehtyd82j22nqzt5m94npub1s8rew66kl357hj20qth5uympp9yvj5989ye2grw0r9467eafe9ds7s2ju7npub1sy4sqms6559arup5lxquadzahevcyy5zu028d8rw9ez4h957j6yq3usedvnpub1ud994l6jzj42lt876vyqp7fapm39eveemvr43tr9rlc2qyuanvyssenml8npub16gxmu2e550lvtmqjt4mdh0tzz2u4wr3cfhh7ugwydmsyhuayjpsq7taeu9npub19ckzkx3scug6ag5lq93xhujjpve6y99ra2yxz6tlvqttza486mfq5gt3uuLocal artifacts / scripts created during investigation
Under
~/.timmy/nostr/:generate_keys.pyagent_keys.jsoncreate_group.pyverify_group.pydiagnose_relay.pydebug_send.pyquery_group_direct.pypost_agents_b082d1.pyjoin_requests_b082d1.pyjoin_one.pynpub_to_hex.pyThese are the current operational breadcrumbs Timmy can continue from.
Verified technical findings
Direct relay queries proved
Direct websocket query to raw relay showed:
b082d1b082d1b082d1Why no visible chat yet
Because agents are not members yet.
Why Primal/Nostur feel dead
Because they do not implement NIP-29.
Honest cutover status
Current stage:
0xchatnow,Flotillalater)Recommended next actions for Timmy
Use 0xchat as the immediate operator client
Alexander needs a client that can actually see/manage NIP-29 groups.
Get agents admitted to group
b082d1Either:
Retry Hermes join request after rate-limit window
Once members are admitted, immediately post proof messages from all agents into
b082d1Script starting point already exists:
~/.timmy/nostr/post_agents_b082d1.pyFinish clean relay cutover
Move from raw
ws://143.198.27.163:2929to a proper public TLS endpoint:wss://relay.alexanderwhitestone.comThen self-host / standardize Flotilla
That becomes the sovereign open-source client we can extend.
Bottom line
The most important truth:
The migration is partially built, but not yet in a state where Alexander can just open Primal/Nostur and use it.
Timmy should pick up from here by using 0xchat to complete membership and then land the clean relay endpoint.
Nostr Migration Status Report — Handoff to Timmy
CURRENT STATE: MVP COMPLETE
The NIP-29 group relay is live, the "Timmy Time" group exists, all agents have posted proof messages, and Alexander has been added as admin.
INFRASTRUCTURE (DONE)
Relay Deployment:
/usr/local/bin/timmy-relay(Go, relay29/khatru framework)timmy-relay.service(systemd, auto-restart)/etc/timmy-relay.env/var/lib/timmy-relay/dbnpub1kmztd3spn77e2cdpujz4z52v0vtp57lg4j2xcfaezk6tu4ec9yusyx6fmv/etc/timmy-relay.env(Ezra has copy)TLS & Network:
alexanderwhitestone.comwss://alexanderwhitestone.com/relay/Code Changes:
Patched relay29 opinionated example to bypass captcha for relay's own key:
/opt/relay29/examples/opinionated/extra_policies.goevent.PubKey != s.RelayPubkeycheck added topreventGroupCreation()GROUP: "Timmy Time"
Details:
timmytimewss://alexanderwhitestone.com/relay/Proof Messages Posted (Kind 9):
AGENT KEYS
Stored in
/root/wizards/ezra/nostr/keys/:alexander.json— npub1ykuzxygd5esy8dynqpf8kc4suwfkklsq7v7s9scvk3pzg0kdr9yqdggtxpezra.json— npub1pdxude5zvjj9ay7hupvqawsnfy4w238402mpedfxkw0mtlt20rsqkf09njbilbo.json— npub16uxsh8xwp6n2pzz9q3m2fucgupd38xx5ykv8z05hte7dpxqwzwkqxeskhgbezalel.json— npub1um6039lye9k5dqfkvreefj384ahskr0jwgs66vgl7mdz7qnmaj3qp45yqjallegro.json— npub19s9f2rq33fyv4ndt9a60eh2q5zc3pfsr3ecxugaer009nwahvutqg09dtuAlexander's ACTIVE account (added to group):
npub1t8exnw6sp7vtxar8q5teyr0ueq0rvtgqpq5jkzylegupqulxfqwq4j66p5RECOMMENDED CLIENT
Nostur — https://apps.apple.com/us/app/nostur-for-nostr/id1672780508
Setup Steps:
wss://alexanderwhitestone.com/relay/Alternative:
If Alexander wants sovereign builds (no App Store), fork Nostur and build via Xcode.
WHAT'S LEFT
Short Term:
Medium Term:
gateway/platforms/nostr.py) so agents respond in the groupSubdomain (Optional):
If Alexander wants
relay.alexanderwhitestone.cominstead of the path-based URL:relay→143.198.27.163KEYFILES BACKUP
/root/wizards/ezra/nostr/keys/contains all nsec/npub pairs. Critical for agent identity. Backed up in standard wizard checkpoint.Ready for Timmy to take command. All infra is live and tested.
Follow-on issue filed to preserve Allegro/Ezra visibility while reconciling contradictory operator truth: #179.
Reason: Allegro, Ezra, and the current live probe disagree on the current best operator onboarding endpoint/client story. Instead of losing their work in chat, #179 makes the discrepancy explicit and actionable.
Rerouting this issue out of the Gemini code loop.
Reason: it does not look like code-fit implementation work for the active Gemini coding lane. Leaving it unassigned keeps the queue truthful and prevents crash-loop churn on non-code/frontier issues.