Community

Wallets

Avocadough

Avocadough is not trying to become your Lightning node. It gives an iPhone a clean way to control a wallet you already connected through Nostr Wallet Connect.

Avocadough visual
Avocadough icon
Wallets Money paths Wallets, NWC, zaps, mints, Lightning addresses and payment tooling.
Back to Nostr
Wallets

Wallets shelf

Wallet pages collect zaps, Lightning accounts, Nostr Wallet Connect, ecash, payment interfaces and the security tradeoffs around moving money through Nostr.

Apps All Apps pages 520 pages in this routeApp pages, App categories, Product pages and 3 more shelves Browse pagesClose shelf

App orientation

App categories

App profiles

0xchatadvanced-nostr-searchAegisAlbyAlby GoAlby HubAlby HubAlby SDKAmberAmberAmethystAmethystApp and product researchApplication-specific dataBlossomBlossom spec NIP-B7BookstrBorisBouquetCalendar by FormstrChachiNostr Apps DirectoryCoracleCoracleCorny ChatCreatrDamusDamusDeveloper stack researchDittoDittodiVineDocstrDTANEmojitoFlotillaFlycatFormstrFountainFreeFromFundstrfutrGIF BuddyGittrgo-nostrGossipGossipGrimoireGroups NIP-29HablaHablaHello Nostr — ResourcesHighlighterHiveTalkhomebrew-nostrHORNET StorageHugo2NostrHyperNoteIrisIrisJumblekanbanstrKeys BandListrLNBits NostrmarketLumeLumilumiLUMINAMapstrMarmot Protocolmatrix-nostr-bridgeMeetstrMemestrMindsmonstrmostardMostronaknak — Nostr Army KnifeNalgorithmNarrnashboardNDKNegentropyngitNofluxNosNos Socialnos2xnosbinnosclNostorg Feature MatrixNostr App ManagerNostr Apps Directory GuideNostr clients feature listNostr Compass — ProjectsNostr Developer GuideNostr Development KitNostr Events MonitorNostr MCP ServerNostr NestsNostr PlaygroundNostr Service ProvidersNostr Writernostr-post-checkernostr-protocol/nostrnostr-rubynostr-sdknostr-sdk-ffinostr-sdk-flutternostr-to-rssnostr-toolsNostr.bandnostr.buildnostr.co.uk ClientsNostr.how — Clientsnostr.hsNostrabilityNostrAppsNostrApps category — AudioNostrApps category — CareerNostrApps category — CommunityNostrApps category — CurationNostrApps category — Direct MessageNostrApps category — DiscoveryNostrApps category — File SharingNostrApps category — Group ChatNostrApps category — MeatspaceNostrApps category — OnboardingNostrApps category — SignersNostrApps category — Toolsnostrchecknostrdbnostrdb-rsNostreeNostreonNostriaNostridNostrium / read.nostr.comNostrmoNostrubenoStrudelnoStrudelNostterNosturNosturNotedeckNpub.proNpub.worldnsec.appnsiteNsiteNstart.meObsidian Nostr WriterOlasOpenvibeOracoloOstrich WorkOwn Your PostsP2P BandPazPeridotPhoenixPlebeian MarketPostizPostr / write.nostr.comPrimalPrimalPrimal Article Editor / Reads authoringPrimal Studiopynostrpython-nostrRecommended Application HandlersRelay Toolsrsslayrust-nostrrust-nostr docsSatelliteSatellite EarthSatlantisSatShootShakespeareShopstrSlidestrSnortSnortStemstrswift-nostr-clientTreasuresWavlakeWavlakeWikifreediaWikistrYakiHonneYakiHonneYakiHonne mobile/web app directoryYondar

App pages

Deep dives

Field guides

Awesome Nostr branches

NIP explainer pages

Research and library

Source inventory

Deep Research: Clients, apps and product surfacesDeep Research: Developer stack and toolingResearch Map: nostrapps.comResearch Source: 0xchatResearch Source: 0xchat — NostrApps pageResearch Source: advanced-nostr-searchResearch Source: Aegis — NostrApps pageResearch Source: AlbyResearch Source: Alby — NostrApps pageResearch Source: Alby GoResearch Source: Alby HubResearch Source: Alby Hub GitHubResearch Source: Alby SDKResearch Source: AmberResearch Source: Amber — NostrApps pageResearch Source: AmethystResearch Source: Amethyst GitHubResearch Source: Awesome Nostr ResourcesResearch Source: BookstrResearch Source: BorisResearch Source: Boris — NostrApps pageResearch Source: BouquetResearch Source: Bouquet — NostrApps pageResearch Source: Calendar by FormstrResearch Source: ChachiResearch Source: Chachi — NostrApps pageResearch Source: CoracleResearch Source: Coracle — NostrApps pageResearch Source: Corny ChatResearch Source: DamusResearch Source: Damus — NostrApps pageResearch Source: DittoResearch Source: Ditto — NostrApps pageResearch Source: DocstrResearch Source: DTANResearch Source: DTAN — NostrApps pageResearch Source: EmojitoResearch Source: Emojito — NostrApps pageResearch Source: Flotilla — NostrApps pageResearch Source: FlycatResearch Source: FormstrResearch Source: Formstr — NostrApps pageResearch Source: FountainResearch Source: FreeFromResearch Source: FreeFrom — NostrApps pageResearch Source: FundstrResearch Source: futrResearch Source: futr — NostrApps pageResearch Source: GIF BuddyResearch Source: GIF Buddy — NostrApps pageResearch Source: GittrResearch Source: go-nostr GitHubResearch Source: GossipResearch Source: Gossip — NostrApps pageResearch Source: GrimoireResearch Source: Grimoire — NostrApps pageResearch Source: HablaResearch Source: Habla — NostrApps pageResearch Source: Hello Nostr — ResourcesResearch Source: HighlighterResearch Source: HiveTalkResearch Source: HORNET Storage — NostrCompassResearch Source: IrisResearch Source: Iris — NostrApps pageResearch Source: JumbleResearch Source: Jumble — NostrApps pageResearch Source: Keys BandResearch Source: Keys Band — NostrApps pageResearch Source: ListrResearch Source: LNBits NostrmarketResearch Source: LumeResearch Source: LumilumiResearch Source: LUMINAResearch Source: MapstrResearch Source: Marmot ProtocolResearch Source: MeetstrResearch Source: MemestrResearch Source: MindsResearch Source: monstr GitHubResearch Source: mostardResearch Source: MostroResearch Source: my.nostr.comResearch Source: nak — Nostr Army KnifeResearch Source: nak GitHubResearch Source: NalgorithmResearch Source: Narr — NostrApps pageResearch Source: nashboardResearch Source: NDK GitHubResearch Source: NDK NPMResearch Source: NegentropyResearch Source: Noflux — NostrApps pageResearch Source: Nos SocialResearch Source: Nos Social — NostrApps pageResearch Source: nos2xResearch Source: nos2x — NostrApps pageResearch Source: nosbinResearch Source: noscl GitHubResearch Source: Nostorg Feature MatrixResearch Source: Nostr App ManagerResearch Source: Nostr Book — KindsResearch Source: Nostr DesignResearch Source: Nostr Developer GuideResearch Source: Nostr NestsResearch Source: Nostr Nests — NostrApps pageResearch Source: Nostr PlaygroundResearch Source: nostr-post-checkerResearch Source: nostr-protocol/nostr GitHubResearch Source: nostr-sdk crates.ioResearch Source: nostr-sdk-ffi GitHubResearch Source: nostr-tools GitHubResearch Source: nostr-tools NPMResearch Source: Nostr.BandResearch Source: nostr.buildResearch Source: nostr.co.uk ClientsResearch Source: Nostr.howResearch Source: Nostr.how — ClientsResearch Source: Nostr.how — ProtocolResearch Source: Nostr.how — What is Nostr?Research Source: Nostr.orgResearch Source: NostrabilityResearch Source: NostrAppsResearch Source: NostrApps category — AudioResearch Source: NostrApps category — CareerResearch Source: NostrApps category — CommunityResearch Source: NostrApps category — CurationResearch Source: NostrApps category — Direct MessageResearch Source: NostrApps category — DiscoveryResearch Source: NostrApps category — File SharingResearch Source: NostrApps category — Group ChatResearch Source: NostrApps category — MeatspaceResearch Source: NostrApps category — OnboardingResearch Source: NostrApps category — SignersResearch Source: NostrApps category — ToolsResearch Source: nostrcheckResearch Source: nostrdb GitHubResearch Source: NostreeResearch Source: Nostree — NostrApps pageResearch Source: NostriaResearch Source: Nostria — NostrApps pageResearch Source: NostridResearch Source: Nostrmo — NostrApps pageResearch Source: Nostrmo GitHubResearch Source: NostrubeResearch Source: noStrudelResearch Source: noStrudel — NostrApps pageResearch Source: NostterResearch Source: NosturResearch Source: Nostur — NostrApps pageResearch Source: NotedeckResearch Source: Npub.proResearch Source: Npub.worldResearch Source: nsec.appResearch Source: NsiteResearch Source: Nstart.meResearch Source: Nstart.me — NostrApps pageResearch Source: Obsidian Nostr Writer — NostrApps pageResearch Source: OlasResearch Source: Olas — NostrApps pageResearch Source: OpenvibeResearch Source: OracoloResearch Source: Oracolo — NostrApps pageResearch Source: Ostrich WorkResearch Source: P2P BandResearch Source: PazResearch Source: PeridotResearch Source: Peridot — NostrApps pageResearch Source: PhoenixResearch Source: Phoenix — NostrApps pageResearch Source: Plebeian MarketResearch Source: Plebeian Market — NostrApps pageResearch Source: PrimalResearch Source: Primal — NostrApps pageResearch Source: Primal Article Editor / Reads authoringResearch Source: Primal StudioResearch Source: pynostr GitHubResearch Source: python-nostr GitHubResearch Source: Registry of KindsResearch Source: Relay Tools — NostrApps pageResearch Source: rsslayResearch Source: rust-nostr docsResearch Source: rust-nostr GitHubResearch Source: SatelliteResearch Source: SatShootResearch Source: ShakespeareResearch Source: Shakespeare — NostrApps pageResearch Source: ShopstrResearch Source: Shopstr — NostrApps pageResearch Source: SlidestrResearch Source: SnortResearch Source: start.nostr.netResearch Source: StemstrResearch Source: TreasuresResearch Source: WavlakeResearch Source: WikifreediaResearch Source: Wikifreedia — NostrApps pageResearch Source: WikistrResearch Source: Wikistr — NostrApps pageResearch Source: YakiHonne mobile/web app directoryResearch Source: YondarResearch Source: Yondar — NostrApps page
Wallets25 min readiOS Nostr Wallet Connect controller

Avocadough

Avocadough is not trying to become your Lightning node. It gives an iPhone a clean way to control a wallet you already connected through Nostr Wallet Connect.

The quick readAvocadough is an iOS wallet interface for Nostr Wallet Connect. The app is built by SparrowTek LLC, published through avocadough.xyz, available through the App Store and TestFlight links on the official site, and open sourced on GitHub. The important thing to understand before using it is that Avocadough is a controller, not a new bank account. It scans or accepts a nostr+walletconnect URI, stores the NWC secret in the iOS Keychain through SparrowTek's Vault package, saves connection metadata in SwiftData, and then asks the connected wallet what methods it allows. If the wallet grants balance, payment, invoice or transaction permissions, Avocadough can show a balance, pay a BOLT11 invoice, create an invoice, display a Lightning Address when one is present and mirror recent transactions locally. If a permission is missing, the interface blocks that action. That makes the app useful, but it also makes the NWC string sensitive. Anyone who gets a live connection string may be able to command the wallet within the allowed scope. Use Avocadough with a wallet provider you trust, start with small amounts, check exactly which permissions are granted, and use the disconnect flow when you want the iPhone to forget the wallet connection.

An iPhone face for someone else's Lightning wallet

Avocadough is best understood as a wallet interface, not as a new wallet service that asks you to deposit money into a brand. The official site describes it as a Bitcoin Lightning app powered by Nostr Wallet Connect, and the open-source repository describes it as an iOS Lightning wallet through NWC. That wording is precise. The iPhone app gives you a native surface for a wallet that already exists somewhere else.

That makes Avocadough different from a Cashu wallet, a custodial Lightning account, a node dashboard or a social client with a zap button. The app does not start by asking you to create a timeline, follow people or publish posts. It starts by asking for an NWC connection. Once paired, it can show the balance and payment tools exposed by that connection. If the remote wallet says no to a method, Avocadough has to say no too.

This is the right mental model for testing the app. Avocadough is the steering wheel and dashboard. The funds, payment policy, fees, channel liquidity, custodial risk and uptime live with the connected wallet provider. The app can make that relationship feel clean on iOS, but it cannot turn every NWC backend into the same product.

The first secret is the pairing string

The heart of Avocadough is the NWC URI. In practice that usually arrives as a QR code or a string beginning with nostr+walletconnect. Inside that string are the pieces needed to talk to the wallet service: the wallet public key, at least one relay, a secret and sometimes a Lightning Address. The string is convenient because it lets a client connect quickly. It is dangerous for the same reason.

Avocadough's setup flow treats that URI as the real onboarding step. The app lets you scan a code with the camera or paste a manual string. It parses the URI through NostrKit, stores the secret, records the wallet public key and relay, and tries to initialize the NWC client. If parsing fails or the wallet cannot be reached, the setup stays in the error path instead of pretending the wallet is ready.

Handle that connection string as wallet authority. It is not a public Lightning Address. It is not a normal username. It is a capability that can authorize commands within the permissions granted by the wallet service. If you screenshot it, paste it into an untrusted page or keep it in cloud notes, you may be leaking the control plane for your payments.

What Avocadough stores on the phone

The code separates the sensitive secret from the rest of the connection record. The NWC secret is saved through SparrowTek's Vault package with an iOS Keychain configuration named for the NWC secret. The less sensitive connection metadata, such as wallet public key, relay and optional Lightning Address, is represented as a SwiftData model.

That split is a good iOS pattern. The Keychain is the right place for secrets that should not sit in ordinary app data. SwiftData is the right kind of local model layer for records the interface needs to reconstruct state, route the user past setup and show the connected wallet. Avocadough does not have to store a password or create a server-side account to remember that it has been paired.

The Settings screen makes this storage story visible in plain user terms. The destructive action says it will disconnect and clear data. Behind that button, the app routes through the wallet state and removes the local NWC connection. That is the button to use when a phone is changing hands, a connection has been over-permissioned or you simply want this iPhone to stop controlling that wallet.

Permissions shape the whole interface

Nostr Wallet Connect is useful because it does not have to be an all-or-nothing relationship. A wallet can expose only the methods it wants a client to use. Avocadough takes that seriously. After setup it asks the wallet for information and stores the returned method list as part of the local wallet model.

The visible app then checks those methods before opening money actions. If the wallet does not advertise balance access, tapping balance can show a permission error. If the connection does not include pay_invoice, the Send flow is blocked. If make_invoice is not available, the Receive invoice path is blocked. The interface is not inventing capabilities that the remote wallet refused to grant.

That is good for safety and good for diagnosis. If Avocadough feels limited after pairing, the next question is not only whether the app is broken. The better question is which permissions the NWC provider granted. A read-only connection, a receive-only connection and a full send-and-receive connection should not behave the same.

Balance, send, receive and recent activity

The main wallet screen is built around everyday Lightning actions. It can display the current balance in millisatoshis converted into a human view, offer Send and Receive buttons, show a recent activity section and refresh transaction data. The app also asks Block's public Bitcoin pricing endpoint for a current BTC price so fiat-adjacent displays can be calculated locally.

The NWC client methods underneath are familiar if you have used the protocol: get_info, get_balance, pay_invoice, make_invoice, lookup_invoice and list_transactions. Avocadough wraps those calls in its own wallet provider layer so the UI can call a common wallet manager rather than reaching into protocol details from every screen.

That provider design matters because the repository already has a broader wallet abstraction. The enum includes NWC and Cashu as wallet types, and there is a Cashu provider protocol with methods for mints and tokens. Today the default provider registration is NWC. The Cashu hooks read like an architectural opening, not a current promise that the shipped app is a full Cashu wallet.

Receiving depends on the connection you brought

Avocadough's receive flow has two modes. If the NWC URI included a lud16 Lightning Address, the receive screen can show that address and present a QR code for it. That is the smoother experience because the address can be reused by someone who wants to pay you without asking for a fresh invoice first.

If no Lightning Address is present, the app falls back to invoice creation. The make_invoice path asks the connected wallet to create a BOLT11 invoice for an amount and description, then looks the invoice up so the app can keep the payment hash with the local receive state. That extra lookup is a small implementation detail with a practical purpose: the UI wants both the invoice string and the payment hash.

The limitation is important. A reusable address shown in Avocadough is not invented by the iPhone. It comes from the connected wallet relationship. If your provider did not put lud16 into the NWC URI, Avocadough cannot magically publish a Lightning Address for you. It can still create invoices if make_invoice is permitted.

Sending is invoice first, with address support

The send screen accepts an invoice, a Lightning Address or LNURL-style input. Avocadough uses LightningDevKit's BOLT11 parser to detect invoice strings and sends invoice payments through the connected wallet's pay_invoice method. For address-style input, it moves through a details and review flow before submitting the payment.

Camera access is requested only when the user wants to scan a QR code. The SwiftUI send presenter checks the iOS camera authorization state, requests permission if needed and opens the QR scanner only when permission is available. That is the kind of small mobile detail that separates a real iPhone app from a protocol demo.

The most important send rule remains simple: Avocadough can only spend through the authority you gave it. If the NWC string is allowed to pay invoices, a successful pairing can become a spending device. If you only wanted the app to view or receive, create a limited NWC pairing at the wallet provider side before scanning it.

Transactions are a local mirror

Avocadough keeps local transaction models, but it is not the final ledger of the wallet. The app calls list_transactions through NWC, maps remote transaction data into SwiftData and stores fields such as payment hash, invoice, description, amount, fees, created time, expiry and settlement time. That local model lets the interface show recent activity without treating the remote backend as a dumb black box.

There are limits. The app's wrapper notes that some NostrKit list transaction parameters are not supported by the underlying call and are ignored. The transaction sync code also catches errors and returns instead of making every failed refresh into a user-facing crash. For a wallet interface, that is understandable. For a financial audit, it means you should check the source wallet if anything looks incomplete.

Read the activity list as a convenience layer. It helps you see what Avocadough recently observed through NWC. It is not a substitute for understanding the connected wallet's own records, its backup model, its fee policy or its transaction export story.

NostrKit, CoreNostr and the SparrowTek stack

Avocadough is also useful as a window into SparrowTek's Nostr tooling. The Swift package lock file shows NostrKit and CoreNostr coming from SparrowTek repositories, Vault for secret storage, LightningDevKit's Swift package for invoice parsing and Apple's Swift ASN.1 and Swift Crypto libraries. It is a native Swift stack, not a web wrapper with a wallet logo.

NostrKit does the heavy NWC work. The Avocadough app delegates URI parsing, wallet connection, encrypted command handling and wallet method calls to NostrKit's WalletConnectManager. CoreNostr sits lower in the stack, while Vault handles Keychain access. That division keeps the app code focused on pairing, screens, permissions and local state.

The repository requirements are modern: Xcode 16.2, macOS 15 and Swift 6. That matters if you are trying to build the app yourself. You should expect a current Apple development setup rather than an old sample project that can be compiled casually on any Mac.

The privacy policy is modest, not magical

Avocadough's privacy posture is straightforward. The official policy says the app does not create accounts. It also says server software may keep basic technical information such as IP addresses in temporary memory or logs, and that the app may collect aggregate anonymous statistics about feature usage to improve the app.

That is a modest claim, and modest claims are better than impossible ones. A wallet interface can avoid creating accounts and still touch external systems: the NWC relay, the wallet provider, Block's pricing endpoint, the official website, App Store distribution and whatever analytics are present in the app. Privacy depends on the whole path, not only on whether Avocadough has a login form.

Before using it with meaningful funds, think about what each party can see. The NWC relay can be part of the command path. The wallet provider knows the wallet. The pricing endpoint sees price requests. The App Store knows install metadata. Avocadough's own policy limits what the developer says it collects, but it does not erase the rest of the payment stack.

Background notifications have real iOS limits

The repository includes notes on wallet notifications, and those notes are more realistic than the usual instant-payment marketing. iOS does not let an ordinary app keep a persistent WebSocket connection alive in the background forever. That is a direct constraint for any NWC client that wants to receive live relay notifications after the phone is locked or the app is suspended.

The documented plan separates three layers: foreground or brief-background NWC notifications when the app is active enough, local notifications for events the app sees, and slower background refresh as a fallback. It also points out that reliable instant push would require a small server that subscribes to the NWC relay and sends APNs notifications.

That should shape expectations. Avocadough can be a pleasant iPhone wallet interface, but no iOS client can pretend the operating system does not exist. If instant receive alerts matter to you, test them under real lock-screen and background conditions, not only while the app is open on the desk.

Open source helps, but testing still matters

The public repository is one of Avocadough's strengths. You can read the wallet provider, setup flow, settings screen, transaction model, receive flow, send flow, price service and package dependencies. You can also see the support link, privacy policy text and attribution to NostrKit and Block's price API inside the app source.

Open source does not remove the need to test. It gives you a way to verify how the app intends to behave, but the shipped app is still a compiled iOS build, and the actual security of your setup also depends on the wallet provider, the relay, the permissions inside the NWC connection and your device hygiene.

A sensible first run is small and deliberate. Pair a low-value wallet, confirm the methods returned by the provider, check whether balance appears, create a tiny invoice, pay a tiny invoice, verify the source wallet's record, close and reopen the app, then disconnect and confirm that the connection is removed. That test teaches you more than a logo, a screenshot or a promise.

Where Avocadough fits in the NWC ecosystem

Avocadough belongs with wallet interfaces because it makes NWC usable from the phone. It does not try to solve relay policy, social discovery, long-form publishing or Nostr identity by itself. It focuses on the specific moment when a person has a wallet service somewhere and wants an iOS app to operate it cleanly.

That role is valuable. NWC only becomes friendly when normal users have good surfaces for pairing, viewing balance, receiving, paying and disconnecting. Avocadough gives that surface to Apple users while keeping the Nostr and Lightning mechanics out of the main line of the interface.

The tradeoff is that a good interface can make a dangerous connection feel harmless. NWC is powerful because it moves wallet commands through a portable protocol. Use that power intentionally. Pair the minimum permissions you need, keep the secret private, prefer providers you understand and treat the iPhone as one control device among several, not as the place where every risk disappears.

What to check before you rely on it

Start with the official links. Download Avocadough from the App Store link on avocadough.xyz or join the TestFlight from the official site. Avoid random builds and unsolicited pairing pages. A wallet interface that begins with a sensitive NWC string should not be installed from a source you cannot verify.

Then inspect the wallet side. Which provider created the NWC URI? Which methods are allowed? Is there a spending cap? Is the relay reliable? Can the connection be revoked from the provider? Does the wallet expose lud16 if you expect reusable receiving? Avocadough can only enforce what the connection and provider make available.

Finally, decide what the app is for. It is a strong fit for a small mobile NWC controller, a clean iPhone companion to a wallet service and a way to learn how NWC feels in a native app. It is not a reason to ignore wallet custody, backup, relay dependency, iOS background limits or the risk of leaking a live connection string.

Sources worth opening

Open the official website, App Store link, TestFlight link, GitHub repository, Swift wallet files, NWC documentation, NIP-47, LNURL documents and Apple's Keychain and SwiftData documentation together. Avocadough is easiest to understand when the polished iPhone surface is read beside the connection and storage code.

Back to the Crays Nostr page
Apps route visual cue 1
Apps route visual cue 2
Apps route visual cue 3
Apps route visual cue 4
Apps route visual cue 5

How to use this page

Find the product surface first.

Search clients, signers, product categories or developer tools when you need a specific app, source file or comparison clue.

AppsThe full Apps route stays open520 pages in this routeProducts, categories, builder notes and signer context.Browse pages
Apps route visual cue 1
Apps route visual cue 2
Apps route visual cue 3
Apps route visual cue 4
Apps route visual cue 5

Bring something back

Ask, suggest, submit or nominate.

Ask a question, send a source, suggest a fix, submit a project or nominate a public Nostr account. The page stays stable; your contribution gets reviewed beside it.