Community

Apps

phoenixd

phoenixd is not a Nostr client and not the Phoenix social app. It is a small Lightning wallet daemon from ACINQ, built for servers and apps that want Phoenix-style liquidity automation behind an API.

phoenixd visual
phoenixd icon
Apps The product layer Clients, signers, publishing tools, wallets and useful experiments.
Back to Nostr
Apps

Apps shelf

Apps pages collect clients, signers, tools, developer libraries and product research without turning the app into the whole network.

Apps27 min readACINQ server-side Phoenix wallet daemon, HTTP API and automated-liquidity Lightning backend for Nostr payment stacks

phoenixd

phoenixd is not a Nostr client and not the Phoenix social app. It is a small Lightning wallet daemon from ACINQ, built for servers and apps that want Phoenix-style liquidity automation behind an API.

The quick readphoenixd is ACINQ's server-side Phoenix wallet daemon. The project README calls it the server equivalent of the popular Phoenix mobile wallet, written in Kotlin Multiplatform and built for Linux, macOS and Windows through WSL. Its role is narrower than LND or CLN: it is designed to send and receive Lightning payments through an HTTP API while leaning on ACINQ's Phoenix model for automated channel and liquidity management. It exposes endpoints for node info, balances, invoices, BOLT12-style offers, incoming and outgoing payment history, paying invoices, paying offers, Lightning Address, LNURL pay, LNURL withdraw, LNURL auth, on-chain sends, bump fee, close channel, CSV export, webhooks and websocket events. The current release checked was `v0.8.0`, published on May 20, 2026, with a `lightning-kmp` upgrade to `1.12.0`; Docker Hub showed `acinq/phoenixd:0.8.0` and `latest` pushed in late May 2026. For Nostr, phoenixd usually enters as the Lightning backend behind another wallet service, especially Alby Hub, which can expose Nostr Wallet Connect to apps. phoenixd itself is not a NWC wallet service by default. Treat it as a powerful, simple backend with real tradeoffs: self-custodial keys, API credentials, local seed and channel-state backups, ACINQ LSP dependency, liquidity fees, no broad peer-management surface, no built-in web UI and security responsibility around any service you put in front of its HTTP port.

phoenixd is Phoenix for servers

phoenixd is easiest to understand if you already know Phoenix Wallet. Phoenix is ACINQ's self-custodial Lightning wallet for mobile users; phoenixd brings the same family of ideas to a server daemon. The README describes phoenixd as the server equivalent of the Phoenix wallet for mobile, written in Kotlin Multiplatform and running natively on Linux, macOS and Windows through WSL.

That does not make phoenixd a general-purpose Lightning node in the same shape as LND or CLN. It is a specialized payment daemon. It is meant for sending and receiving payments, not for manually managing peers, running a public routing node, tuning channel strategy or exposing every low-level Lightning control. It trades breadth for a simpler operating model.

For a Nostr reader, the important distinction is this: phoenixd is not the Phoenix social client, not the mobile Phoenix wallet app and not a Nostr Wallet Connect service by itself. It is the Lightning backend that can sit under another service. If you use Alby Hub with phoenixd, Alby Hub is the NWC-facing wallet service and phoenixd is the payment engine underneath.

That makes phoenixd a very useful bridge between two worlds. On one side are developers who want a server process and an API. On the other side are normal Nostr users who want zaps, subscriptions, paid actions and Lightning Address behavior without learning channel management. phoenixd can help the server side stay small enough that the user-facing wallet service can focus on permissions and product clarity.

ACINQ is the operator behind the design

ACINQ is a long-running Lightning company best known for Eclair and Phoenix. Its own site lists Phoenix Wallet as a self-custodial Bitcoin wallet with native Lightning support and phoenixd as a minimal, specialized Lightning node designed to send and receive payments. That framing is helpful because it explains the product's boundaries.

phoenixd inherits the Phoenix philosophy: make Lightning usable without forcing every user or small business to become a channel operator. That does not mean ACINQ takes custody of the seed. The server keeps the wallet seed locally. It does mean the payment model depends on ACINQ's LSP and infrastructure for liquidity, channel management and routing assumptions.

This is why phoenixd can feel magical in small deployments and still deserve careful review. You get a smaller operational surface, automatic liquidity and a simple API. In exchange, you accept a more opinionated relationship with ACINQ than you would have with a fully self-directed LND or CLN node connected to arbitrary peers.

The right question is not whether that tradeoff is good or bad in the abstract. It is whether the user understands it before they rely on it. For a small creator server, automatic liquidity may be exactly the missing piece. For a business that needs independent node policy, its own Bitcoin backend and peer choice, the same design may be too constrained.

The active project state is clear

GitHub API data checked on June 13, 2026 showed the `ACINQ/phoenixd` repository with 175 stars, 18 forks, 16 open issues or pull requests, Apache-2.0 licensing, creation on March 8, 2024, update and push activity on June 11, 2026, and `master` as the default branch.

The latest release checked was `v0.8.0`, published on May 20, 2026. Its release note was short but meaningful: it upgraded `lightning-kmp` to `1.12.0`, provided signed release assets for Linux, macOS and JVM builds, and documented checksum verification with ACINQ's release signing key `E434ED292E85643A`.

Docker Hub also showed an official `acinq/phoenixd` image, with `latest` and `0.8.0` pushed in late May 2026 for `linux/amd64` and `linux/arm64`. The Dockerfile builds from Eclipse Temurin 21, compiles the native binaries from the selected phoenixd tag, exposes port `9740`, stores data in `/phoenix/.phoenix` and starts the daemon with `--agree-to-terms-of-service` and an HTTP bind address.

Version awareness matters because this is money software. The repository's `gradle.properties` had moved to `0.8.1-SNAPSHOT` on the development branch, while the latest published release was still `v0.8.0`. A reader should distinguish a release they can install and verify from a development snapshot in the branch. Use tagged releases, pinned Docker tags and checksum verification when possible.

The API is the product surface

The official API page is linked from the README, and the implementation in `Api.kt` shows the working surface. phoenixd installs a Ktor server with JSON serialization, status handling, basic authentication, websocket support and webhook delivery. The result is a daemon that other software can call rather than a wallet with its own full graphical interface.

The API includes read endpoints such as `getinfo`, `getbalance`, `estimateliquidityfees` and `listchannels`. It also includes invoice and offer endpoints: `createinvoice`, `createoffer`, `getoffer`, `decodeinvoice` and `decodeoffer`. For an app developer, that is the difference between manually copying invoices and building a payment flow around server calls.

Payment history is first-class too. The code exposes `payments/incoming`, `payments/incoming/{paymentHash}`, `payments/outgoing`, `payments/outgoing/{uuid}` and `payments/outgoingbyhash/{paymentHash}`. That matters for commerce, subscriptions and Nostr app connections, because a backend needs more than a send button. It needs to reconcile what happened.

The API also reveals a product philosophy. phoenixd does not ask the caller to orchestrate every channel detail. It asks the caller to create invoices, pay invoices, inspect balances and react to payment events. That is exactly the surface a hub, merchant plugin or Nostr payment service wants, as long as it also handles permissions, limits and error interpretation.

Sending and receiving are intentionally narrow

phoenixd supports common payment actions directly: `payinvoice`, `payoffer`, `paylnaddress`, `lnurlpay`, `lnurlwithdraw`, `lnurlauth`, `sendtoaddress`, `bumpfee` and `closechannel`. It also supports `export`, which writes successful payments to CSV. This is a practical API for receiving money, paying invoices, handling Lightning Address and connecting to services that need accounting data.

The narrowness is a feature and a limitation. You do not get the full remote-control shape of a general Lightning daemon. You get the operations ACINQ has chosen to expose for the Phoenix server use case. That makes phoenixd easier to wrap, but it means a higher-level wallet service must decide how to translate user expectations into the API.

For Nostr, this is exactly where Alby Hub or another wallet service becomes important. A NWC request such as `pay_invoice`, `make_invoice`, `lookup_invoice` or `get_balance` needs a wallet service that maps NIP-47 semantics onto phoenixd calls, enforces budgets and keeps relay-facing credentials away from the raw daemon.

That mapping is not only naming. NWC clients expect consistent error codes, permission failures, payment hashes, invoice lookups and balances at the level of an app connection. phoenixd may know the real Lightning result, but the NWC layer has to translate it into a safe app-facing contract. Good integration hides daemon credentials, not daemon state that the user needs.

NWC is a bridge, not the daemon itself

Nostr Wallet Connect is a protocol for communicating with a Lightning wallet via Nostr. Alby's developer guide describes it as a way for apps to make backend or native payments without requiring the user to switch to a wallet for every action. phoenixd does not automatically become that service just because it can pay invoices.

The common pattern is phoenixd plus Alby Hub. The `getAlby/hub` repository lists Phoenixd as one of the optional external backends, beside LND, Cashu and CLN. Alby Hub then becomes the NWC wallet service, while phoenixd does the Lightning work. Nodana even offers an Alby Hub and Phoenixd template that pairs those layers.

There is also evidence in the phoenixd repository that NWC-shaped needs influenced API discussion. Discussion #55 asked for additions useful when implementing Nostr Wallet Connect for phoenixd, including preimage handling, invoice expiry and payment-hash lookup. That is a good sign for integration, but it is not the same as built-in NWC.

This is the clean way to describe phoenixd in the Nostr ecosystem: it is NWC-relevant infrastructure. It can power an NWC wallet service. It can sit behind Alby Hub. It can be part of a creator, merchant or relay-paid stack. But the protocol boundary still lives in the wallet service that speaks Nostr relays and signs or responds to NIP-47 requests.

Alby Hub gives phoenixd a Nostr face

A Nostr user usually wants app permissions, not raw daemon access. Alby Hub supplies that layer. It can manage wallet connections, NWC secrets, sub-wallets and app-facing permissions, then talk to a Lightning backend. When phoenixd is selected as that backend, the user gets Phoenix-style liquidity with an NWC-facing hub on top.

The Alby Hub Phoenixd script documents both Docker and non-Docker setups. It tells users to create separate data directories for phoenixd and Alby Hub and says those directories must be backed up. It also notes that the default Docker compose uses a preconfigured phoenixd password for simplicity and should not be publicly exposed unchanged.

That warning is the whole architecture in miniature. The Nostr app should never receive the phoenixd password. The app should receive a limited NWC connection from the hub. The hub should know which app can spend how much. phoenixd should sit behind the hub, reachable only by the service that is supposed to operate the wallet.

A practical setup might therefore have three secrets with different meanings: the phoenixd HTTP password, the Alby Hub account or admin credentials, and one NWC connection secret for each connected app. Mixing those secrets is a serious design smell. The daemon password belongs to the backend. The NWC secret belongs to a single app connection and should be revocable without changing the daemon.

Authentication is simple and therefore sensitive

The API implementation uses HTTP basic authentication with full-access and limited-access passwords. The status handler even tells failed callers to use basic auth with the HTTP password set in `phoenix.conf`. Websocket authentication uses the `Sec-WebSocket-Protocol` header as a workaround because browsers do not support basic auth for websocket in the same way.

This is practical, but it is not something to expose casually. If the HTTP port is reachable from the public internet with a weak password, you have not built a sovereign payment stack; you have built a hot wallet API waiting to be found. Put phoenixd behind a local network boundary, reverse proxy, firewall or trusted service boundary.

Limited access can reduce blast radius, but the security model still starts with deployment hygiene. Change default passwords, keep them out of repositories, avoid logging secrets, restrict network access, rotate credentials after incidents and avoid giving a Nostr-facing app any credential that can bypass the wallet-service permission layer.

The websocket workaround deserves special care in browser-adjacent software. Passing a password through a protocol header is practical for a daemon API, but it should not become a pattern where front-end code can see backend credentials. If a web app needs live payment events, terminate that need at a trusted service and pass only the minimum app event downstream.

The seed is local, but backups are more than a phrase

The `Seed.kt` code shows phoenixd reading an existing seed file or generating 16 bytes of entropy, converting it to mnemonic words, writing them to the seed path and then deriving the wallet seed. That is self-custodial in the key sense: the seed is local to the server and must be protected by the operator.

A seed phrase is not the whole operational backup story for Lightning. Channel state, payment databases, configuration and the service's data directory matter. Start9's phoenixd package is blunt about this: the mounted data volume contains wallet data, seed, channels and database, and backups must be secure because Lightning funds depend on them.

For a Nostr payment stack, backup discipline is easy to forget because the front end may feel like a normal web account. It is not. If Alby Hub talks to phoenixd and phoenixd stores the keys and channel state, then the server's data directory is money infrastructure. Back it up, test restore, and do not treat the host as disposable.

The backup conversation should happen before the wallet receives meaningful funds. Where is the seed stored? Where is the data directory mounted? Is the backup encrypted? Who can restore it? Does a restore require the same service version? What happens if the VPS disappears? Those are not advanced concerns when the server is holding spendable Lightning funds.

Automated liquidity is the main attraction

The reason phoenixd keeps appearing in Nostr payment setups is liquidity. A traditional Lightning node asks the operator to think about channels, peers, inbound liquidity, outbound liquidity, routing and uptime. phoenixd tries to make the receive-and-pay use case feel closer to Phoenix mobile: the operator focuses on the application and ACINQ handles much of the channel complexity.

Nodana's Phoenixd page describes it as a Lightning node with automated channels and liquidity, and says it has no channel management, no peer management and no firewall configuration for the user. The Plan B Academy tutorial explains the same tradeoff in more operational language: phoenixd uses ACINQ as its LSP for automatic liquidity, with on-the-fly capacity carrying liquidity and mining-fee costs.

That convenience is real, especially for creators, small merchants, donation pages, Nostr zaps and personal servers. It is also not free of dependency. The user controls the seed, but ACINQ remains the LSP path. If ACINQ infrastructure, policy, fees or availability matter to your business, that dependency belongs in the risk review.

Liquidity automation also changes how fees are experienced. A user may not buy a channel in advance, but they may still pay for incoming capacity, splice-related operations or on-chain movement when the backend needs it. A wallet service should not merely say automatic. It should explain when liquidity fees can appear and whether tiny payments, large receipts or on-chain events behave differently.

It is not a full peer-management node

The Start9 package documentation makes the limitations explicit: phoenixd requires connection to ACINQ's LSP, cannot use arbitrary Lightning peers, has no local Bitcoin node requirement, relies on ACINQ infrastructure for blockchain data, offers no built-in web UI and charges liquidity-related fees. Those are not footnotes; they define the product.

This makes phoenixd very different from running CLN or LND as a public node. If your goal is to route payments, experiment with peers, run a public node, connect to your own Bitcoin Core, tune channels or build node-management software, phoenixd is probably the wrong primary backend. If your goal is to run a simple self-custodial payment server, it may be excellent.

Nostr apps need this distinction because the word node can mislead users. A user may hear self-hosted Lightning node and assume full autonomy over peers and routing. phoenixd gives self-custodial wallet control with a managed-liquidity model. That is powerful, but it is a specific product category, not a synonym for every Lightning daemon.

This also affects privacy expectations. A node connected only through an opinionated LSP path leaks and protects different things than a node with arbitrary peers and a local chain backend. The user may gain simplicity and avoid public node management, while still depending on external infrastructure for liquidity and chain awareness. Those tradeoffs should be named in serious deployments.

The open issues show the edges

Open issues checked in June 2026 were a useful map of the product's rough edges. They included LNURL trouble, CSV accounting separation for channel opens, a channel-funding error during dual funding, lower minimum auto-liquidity, Electrum backend support, SOCKS proxy support, webhook or websocket behavior for invoice expiry, invoice cancellation, standardized websocket messages and HTTP status behavior for failed payment calls.

None of those issues makes phoenixd unusable by itself. They do show where a production integration should test carefully. If you run a shop, CSV exports and channel-open accounting matter. If you depend on LNURL, test it. If your integration treats HTTP 200 as success without parsing the response body, issue #42 is exactly the kind of trap that can become a support incident.

A good NWC-facing wrapper should normalize these edges for the user. It should translate daemon errors into wallet-service errors, distinguish pending from failed payments, show invoice expiry, avoid double-spending retries and keep an auditable payment record. phoenixd gives useful building blocks; the wrapper decides whether users experience them as clarity or confusion.

The issue list is also useful for deciding what to test after every upgrade. If a release touches `lightning-kmp`, LNURL, websocket events, CSV export or liquidity behavior, a merchant should test the exact workflow that makes money. Do not assume one successful send proves the receive-heavy or webhook-heavy path is healthy.

Webhooks and websockets help apps react

phoenixd is not limited to polling. The API implementation includes webhook delivery and a `/websocket` route that streams API events. It can notify general webhook URLs and per-invoice webhook URLs, and the code signs webhook requests with an HMAC-style signature header using the configured webhook secret.

This matters for commerce and Nostr apps because payment state is event-driven. A shop wants to know when an invoice is paid. A Nostr service wants to update a creator balance, unlock access, mark a zap, credit a subscription or reconcile a paid action. Webhooks and websockets reduce the need to hammer the daemon with polling loops.

The same event surface creates security obligations. Webhook endpoints should verify signatures, reject unexpected payloads, handle retries safely and avoid treating an unauthenticated callback as a payment proof. A Nostr app should also consider relay state separately from payment state. A paid action may need both a confirmed wallet event and a successfully published Nostr event.

For subscriptions and paid access, idempotency is just as important as speed. A webhook may be delivered twice, a websocket may reconnect, a relay event may fail to publish, and a user may retry from the front end. The integration should key state by payment hash or stable payment identifier and make repeated notifications harmless.

The deployment story is small-server friendly

The Docker image is intentionally simple: a compiled daemon, a `phoenix` user, port `9740`, and a mounted `/phoenix/.phoenix` data directory. Nodana offers phoenixd directly. Start9 offers a package. Alby Hub ships scripts for pairing with phoenixd through Docker compose or a non-Docker install. This is the kind of backend that can live on a small VPS or home server.

Small does not mean unserious. You still need uptime, disk backups, host security, upgrade discipline, logs, firewall rules, monitoring and a plan for secrets. A creator who receives zaps through a Nostr profile may be fine with occasional downtime; a merchant checkout flow may not. The same daemon can serve both, but the operating standard is different.

The best first deployment is boring: bind locally, use a wallet service or reverse proxy intentionally, back up the data directory, keep the host patched, test a tiny invoice, test a tiny payment, stop and restart the daemon, then check whether balances, payment history and webhooks behave as expected.

Small servers are often operated by people who are comfortable with apps but not with incident response. That is fine as long as the stack is honest about maintenance. Document where the daemon lives, how it starts, how to upgrade it, how to stop it, how to read logs, how to restore from backup and who has access to the host.

How to evaluate it for a Nostr stack

First identify who is speaking NWC. If the answer is Alby Hub, then check the Alby Hub connection settings, sub-wallet limits, NWC relay, app permissions and revocation UI. If the answer is a custom service, ask how it maps NIP-47 methods to phoenixd, how it stores NWC secrets and how it prevents a connected app from spending more than allowed.

Then inspect the phoenixd side. Confirm the version, release signature path, Docker tag, data directory, seed backup, `phoenix.conf`, full and limited passwords, port exposure, webhook secret, websocket usage and upgrade path. Do not connect a public Nostr app to an unreviewed daemon just because it paid one test invoice.

Finally test real failure modes: bad invoice, expired invoice, unpaid invoice lookup, low liquidity, webhook downtime, websocket reconnect, daemon restart, host reboot, restore from backup, revoked NWC connection and a payment that returns an error payload. The point is not to make Phoenixd look fragile. The point is to know where the product boundary is before real money is involved.

If the stack will serve other people, also test disclosure. Can the operator explain who holds the keys, what ACINQ does, what Alby Hub does, what NWC permits, what data is backed up and what happens during downtime? A user does not need every internal detail, but they should not be surprised by the custody, liquidity or permission model.

Who phoenixd fits best

phoenixd fits developers, creators, small merchants and technically curious Nostr users who want a self-custodial Lightning backend without manually managing channels. It is especially attractive when paired with a hub that exposes NWC, because the user can get app-to-wallet connections while the backend stays comparatively simple.

It is less suited to operators who want full peer choice, routing-node economics, local Bitcoin-node sovereignty, deep channel control or a daemon API that mirrors LND and CLN. Those users should look at LND, CLN, LDK-based stacks or other node designs. phoenixd is opinionated; that is part of why it is easy.

The practical takeaway is simple: phoenixd can make a Nostr payment stack feel approachable without handing keys to a custodian. But it does not erase Lightning risk. Use it behind a permissioning layer, protect the API, back up the data directory, understand the ACINQ LSP dependency and test every app connection with small amounts before trusting it with meaningful balances.

When it fits, phoenixd is one of the cleanest answers to a very real Nostr problem: people want self-custodial Lightning that can stay online for apps. It gives that problem a small daemon and an API. The final user experience still depends on the layer above it: the hub, permissions, UI, backup language and failure handling.

Sources worth opening

Open the ACINQ repository, README, latest release, Docker image, API implementation and Alby Hub backend material first. phoenixd is a backend, so the useful reading path is product boundary, API surface, key custody, liquidity model, deployment shape, NWC bridge, backup obligations and known open issues.

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

Keep the product map close.

Search the wider app shelf when you want another client, tool, protocol reference or source trail beside this page.

AppsSearch and next steps for phoenixdApps pages stay availableProducts, tools, communities and source trails.Browse pages
Apps contribution visual cue 1
Apps contribution visual cue 2
Apps contribution visual cue 3
Apps contribution visual cue 4
Apps contribution 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.