* fix: avoid mempool api failures during swaps by using boltz for fee and tx lookup
* fix: ensure swap payment isn't made twice on refresh
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* feat: just in time channels with lsps2
* fix: clarify JIT receive channel fee
* fix: fees
* fix: fees 2
* fix: don't show low inbound when LSPS2 is active
* fix: remove the receive limit below the input if LSPS2 is being used
* fix: simplify
* fix: bring back fee % for outgoing
* fix: remove unneeded changes
* fix: typo
* fix: unneeded
* fix: don't show open first channel is LSPS2
* feat: clearer JIT channel fee copy on receive screen
* fix: add LSPS2 var info
* fix: don't duplicate JIT fee hint on create invoice form
* fix: make paymentDone a standard boolean
* fix: update to golang:1.26 in Dockerfile
* feat: read LSPS2 sources from channel suggestions, set minimum receive amount, update guide link
* docs: update LDK_LSPS2_ADDRESSES to be used as an override
* fix: only show minimum jit receive amount on validation error
* fix: add more detail to receive error when receiving low amounts with jit
* fix: do not use JIT when user has public channels
* feat: add option to disable JIT
* fix: isTrusted check, add jit property to event
* fix: do not require node restart for toggling JIT
* chore: simplify JIT alert
* chore: add guide link on node settings JIT description
* feat: fetch the lsp2info to have access to params like minimum/maximum payment size
* refactor: share single learn-more link across JIT fee hint branches
* fix: remove variable amount invoice support
* fix: use lsps2info for min payment size and remove channelPeerSuggestion usage of minimumChannelSize
* fix: only do amount validation according to lsps2Info values if jit is enabled in settings
* feat: add jit first payment fee alert on receive via lightning address
* fix: remove unnecessary conditional
* fix: ensure at least one sat is left over when opening JIT channel
* chore: remove hardcoded suggestions
* chore: rename JIT enabled config variable
* fix: ui checks when JIT is disabled
* fix: amount input validation message
* fix: formatting
---------
Co-authored-by: anon <anon@anon.com>
Co-authored-by: saunter <68239231+stackingsaunter@users.noreply.github.com>
Co-authored-by: fmar <fmar@fmar>
Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* feat: pass selected provider to card topup app
The Bitcoin Card Topup app (card.albylabs.com) now supports configuration
presets selected via a `provider` query param. Pass the provider chosen on
the Cards page through to the topup app's install link so its preset is
pre-applied, simplifying setup.
Closes#2384
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: move bitcoin card topup install guide component to a new file
* chore: remove accidentally committed worktree gitlinks
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: use more general copy for card topup app install guide
* fix: remove subtree commits
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: tighten inline empty state spacing on wallet pages
* chore: refine wallet empty states
- Replace placeholder icons (drum, link) with channel-specific icons (ZapIcon for lightning, BitcoinIcon for on-chain)
- Rewrite empty-state copy with warmer, less technical phrasing
- Drop redundant CTA (Receive button already sits above)
- Add subtle bg-accent surface to anchor the transactions section
* chore(empty-state): add variant prop, drop unused button props on wallet pages
* chore(empty-state): swap muted surface from bg-accent/40 to bg-muted
* chore(transactions): allow callers to override empty-state copy and icon
App transaction lists now show app-context messaging ('No transactions yet'
+ 'Payments made through this app will appear here.' with a ReceiptIcon)
instead of the wallet-specific lightning copy.
* chore(empty-state): drop unused 'none' variant
* chore(empty-state): default showButton to false
* chore(empty-state): drop showButton prop, derive from buttonText+buttonLink
* fix(empty-state): drop nested surface in app transactions card
Add 'none' variant and use it from AppTransactionList so the empty state
no longer renders a bg-muted box inside the already-bordered Card.
* fix(app-transactions): swap ReceiptIcon for ArrowDownUpIcon
ReceiptIcon renders a dollar sign — wrong for a bitcoin app.
* chore(empty-state): default variant to 'muted', CTA placeholders opt into 'dashed'
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* fix: reduce wallet balance/transaction polling interval to 10s
The wallet dashboard polls /api/balances and /api/transactions every 3s
via SWR refreshInterval. For hubs left open in a browser tab, this produces
a high, continuous volume of identical requests around the clock with little
UX benefit, since SWR already revalidates on window focus.
Raise the interval for the balances and transactions-list hooks to 10s. The
single-transaction hook (used while waiting for a specific invoice to settle)
is intentionally left at 3s, where fast updates matter and polling is
short-lived.
* refactor: drop poll-interval comments, rationale moved to PR
* feat: reframe AI agent inspiration tab around managing the hub
Change the Node inspiration tab on the AI & Agents page to a Hub tab focused on managing Alby Hub itself (app connections, sub-wallets, budgets) rather than lightning channels. Channel/node prompts only show when the backend supports channel management.
Closes#2401
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: icon
* chore: name
* chore: remove stray .claude/worktrees gitlinks
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: René Aaron <rene@twentyuno.net>
* chore: remove Bitrefill custom app in favor of standard NWC connection
Bitrefill now supports Nostr Wallet Connect directly, so the custom
embedded iframe app is no longer needed. Remove the internal Bitrefill
screen and route, convert the app store entry to a standard NWC
connectable app, and drop the embed.bitrefill.com frame-src CSP
exceptions from both the backend header and the dev Vite config.
Closes#2283
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: update bitrefill instructions and add mobile links
* chore: remove accidentally committed .claude/worktrees gitlinks
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Renames the onboarding checklist item from "Send or receive your
first payment" to "Receive your first payment" and marks it complete
when the wallet has a spendable balance (e.g. after opening an
outbound channel) in addition to having a transaction.
Exporting a wallet with thousands of transactions previously appeared to
do nothing — the handler silently paginated through every page with no
feedback. It now shows a loading toast that updates with the running
transaction count, and fetches 1000 transactions per page instead of 20
to cut round-trips.
Closes#2386
These promo cards are now covered by the Stories widget (Alby account,
Alby Go and Alby Extension stories are live in the stories feed), so the
standalone home widgets are redundant.
Supersedes #2175, which patched the older inline cards that were since
refactored into widgets.
* feat: integrate Stories widget with backend endpoint
Add stories endpoint plumbing for HTTP and Wails, wire the Home Stories card
to fetch from /api/alby/stories, and keep it first in the right column.
Made-with: Cursor
* feat(home): story modal CTAs and preview fallback
- Add contextual actions in the story dialog (update hub with version,
open Alby Go in-app, install extension) keyed by kind or title
- Use preview stories when the stories API request fails
- Pass hub version from useInfo into the update link
Made-with: Cursor
* feat(stories): polish modal, drop preview fallback
- Widen modal and put video edge-to-edge with overlay close button
- Drop verbose header and 'Watch on YouTube' button
- Remove previewStories fallback so widget hides until upstream API ships
- Tighten title line-height
* feat(stories): render cta from API instead of mapping by kind
Move CTA copy and URLs into the API response. Hub renders story.cta
directly, so adding new story types no longer requires a hub release.
* chore(csp): allow cdn.getalby-assets.com in img-src
* feat(stories): bump avatar size and add ring gap
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): post-review cleanups
- Use react-router Link for in-tab CTA instead of plain <a>.
- Drop redundant www.youtube.com from frame-src (embeds always go through nocookie).
- Tighten stories endpoint status check from >= 300 to >= 400.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): address CodeRabbit feedback
- Switch StoriesWidget to useSWR + swrFetcher (project convention).
- Guard story iframe with isYouTubeUrl so non-YouTube urls never embed.
- Wrap GetStories errors with fmt.Errorf("...: %w", err).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): drop isYouTubeUrl guard
Stories are curated and always YouTube; the runtime check was
redundant. CSP frame-src still constrains the iframe source.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): drop getYouTubeEmbedUrl, embed videoUrl as-is
The Alby API now sends canonical youtube-nocookie embed URLs with
autoplay/rel query strings (getAlby/getalby.com#2568), so the
runtime normalization is no longer needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): use w-16 instead of arbitrary w-[73px]
Match the avatar's size token; no magic numbers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): take videoId from API and assemble embed url locally
Pairs with getAlby/getalby.com#2568. The API now sends just the
YouTube videoId; the hub composes the canonical embed URL so the
domain/query-string format stays in one place.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): treat 3xx as non-success, matching file convention
The other status checks in alby_oauth_service.go all use >= 300;
align GetStories so redirects don't slip through.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): move viewed-storage key to constants, widen story button
Address review feedback:
- Centralize the localStorage key for viewed stories in localStorageKeys
alongside the other keys.
- Widen the story button from w-16 to w-20 so "Alby Extension" fits on
one line and matches the other titles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(stories): bump story button to w-24 so titles fit one line
w-20 still wrapped "Alby Extension"; w-24 fits all current titles
without truncation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Revert "chore(stories): bump story button to w-24 so titles fit one line"
This reverts commit 0b47438f50.
* chore(stories): split title words onto separate lines
Reserve two lines for every story title so avatars align regardless of
title length.
* chore(stories): align homeStoriesViewed key with sibling pattern
* chore(stories): fit titles on one line
* chore(stories): widen story button to w-21 for one-line titles
---------
Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: stop prompting for bitcoin: protocol handler on every load
Browsers re-show the registerProtocolHandler prompt every time it is
called if the user dismissed (X'd) the previous one without explicitly
accepting or denying. Gate the call with sessionStorage so we ask at
most once per browser session.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: guard sessionStorage access against restricted/private modes
sessionStorage.getItem and setItem can throw in private browsing or
restricted storage modes. Move both inside the existing try/catch so an
exception doesn't break the hook.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore: simplify protocol handler session flag to a boolean
sessionStorage is tab-scoped and ephemeral, so comparing the stored
handler URL gains nothing over a plain truthy check.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* chore: remove unnecessary regions
* chore: improve cards mobile UI, remove extra regions from RedotPay
* fix: add visit button for mobile provider cards rather than the whole card opening the provider url
* chore(cards): use Select for the region filter everywhere
Drop the mobile-only Select / desktop-only ToggleGroup split. Using a
single Select for the region filter across both viewports removes the
duplicated component, keeps the filter bar a single row at all widths,
and lets the feature toggles stay as pills (those carry icons and read
as a row of binary on/off filters).
* chore(cards): cluster Apple/Google Pay icons next to region badges
Drop the ml-auto on the mobile ProviderCard's pay icons so they sit
right after the region badges instead of floating at the far-right
edge with a large gap. Reads as a single group of card properties.
* chore(cards): rework mobile card spacing + use w-40 for region select
- Bump card padding to p-5 for more breathing room.
- Add a subtle border-t before the facts grid so KYC/Time/Cost/Fees
read as a separate block from the header + regions row.
- Widen the facts grid's vertical gap (gap-y-4) so labels don't sit
right against the value of the previous row.
- More space before the Visit CTA (mt-6) so it reads as a primary
action, not a fifth fact.
- Swap w-[160px] on the region Select for w-40 per project Tailwind
conventions (CodeRabbit nit on PR #2377).
---------
Co-authored-by: René Aaron <rene@twentyuno.net>
* feat: add cards directory page with provider listings
Adds a dedicated Cards screen that surfaces crypto debit card
providers users can top up from their Alby Hub balance, with region
and feature filters and a fees comparison table.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(cards): connect-card flow with NWC top-up link
Iterates on the cards directory page (#ae087d0b) to wire up the full
connect-card flow described with the bitcoin-card-topup PWA at
card.albylabs.com.
- AI-style hero with three steps: Get a card → Connect it → 1-click top-ups
- Trimmed provider list to RedotPay / 2fiat / Freedomia (the providers
we've validated end-to-end)
- New "Time to get" column so users see physical vs virtual at a glance
- Renamed "Add card" → "Connect card" everywhere; submit mints a real
NWC connection via createApp (same pattern as the AI page) with
scopes for the topup app (get_info / get_balance / list_transactions /
lookup_invoice / make_invoice / pay_invoice / notifications)
- CardCreatedDialog shown once at creation with QR code + bookmarkable
top-up link of the form
https://card.albylabs.com/#label=...&address=0x...&chainId=42161¤cy=USDC&nwc=<pairing-uri>
Includes prominent "save this link — you won't see it again" warning
(Alert with warning variant) and "scan with your phone's camera app
(this is a URL, not a Lightning invoice)" caption under the QR
- Saved card tiles link to /apps/:appId so users get back to the NWC
connection detail; no separate top-up affordance from the hub
- useUserCards hook persists cards in localStorage with appId pointing
at the NWC connection; ready to migrate to deriving the list from
/api/apps filtered by metadata.app_store_app_id = "bitcoin-card-topup"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cards): derive cards from /api/apps, polish
Replaces the localStorage card store with a derivation from /api/apps
filtered by metadata.app_store_app_id = "bitcoin-card-topup". Card
provider/destination/chain/currency now ride on the NWC app's metadata,
so cards survive across devices, reloads and DB backups, and "forget
card" flows through the existing /apps/:id delete affordance.
- Gate /cards through DefaultRedirect so a locked hub redirects to
/unlock (matches /wallet, /apps, etc.)
- Hub-generated top-up link now uses #?... prefix so bitcoin-connect's
parser branches to the URLSearchParams path (works in all cases vs.
the bare #... which mis-parsed for some users)
- Remove EmptyCards empty state (the Connect card button in the page
header is the sole entry point)
- Drop the "Experimental" filter and badge — too small a catalog for
it to be useful, and the toggle behavior confused users
- Replace "Top up via" column with "Card cost" (more decision-relevant)
- Verified all provider data from each provider's site; updated
- RedotPay: KYC Full (not Light), regions add US/UK, fees ~2.2% + FX
- 2fiat: Mastercard (not Visa), Apple Pay + Google Pay supported, KYC
None (not Light), card cost $50, fees ~6.8%
- Freedomia: Google Pay supported, card cost $5–30/mo subscription,
fees 1.3–4.3%
- Add a hoverable info-icon tooltip on the "None" KYC badge so privacy-
focused users keep the signal they want while cautious users see the
merchant-of-record-fragility caveat
- Field label "Destination address" → "Top-up address" (matches what
the user pastes from their provider)
- Connect dialog copy de-emdashed
- Various smaller copy/layout tweaks
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(cards): tidy provider tiles, filter, and column header
- Switch Freedomia tile bg to bg-orange-500 to match the brand's
orange F logo
- Drop the upscaled watermark logo from card-tile backgrounds for a
cleaner surface
- Hide filter toggles whose criterion no provider satisfies, so the
filter bar only offers actionable options
- Rename "Mobile pay" column header to "Mobile" — the icons already
identify Apple/Google Pay
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(cards): drop unused provider logos
We trimmed the catalog to RedotPay/2fiat/Freedomia in an earlier
commit; the other 8 PNGs were left behind. Remove them to keep the
asset directory tight.
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(cards): downgrade RedotPay KYC from Full to Light
RedotPay only requires ID verification — no proof of address, employer
details, or source-of-funds questions. "Full" overstates it and may
deter users from even trying.
Adds a Light KYC tooltip alongside the existing None one so the
distinction is visible at a glance.
* chore(cards): tighten copy and mobile layout
- CardCreatedDialog: drop the "regular URL, not a Lightning invoice"
caveat and replace with actionable "save it as an app to your
homescreen" guidance.
- Hide the QR + scan instruction on mobile — the user is already on
their phone, so scanning their own screen is nonsense.
- Provider table: switch wrapper from overflow-hidden to overflow-x-auto
and set a 720px min-width so 9 columns scroll horizontally on narrow
viewports instead of cramming/clipping.
* feat(cards): list Bringin and wavecard
Both already ship as suggested apps with their own NWC pairing flows, so
the table row's action arrow links to /appstore/<id> rather than the
stablecoin connect-card dialog. Marked via a new optional appStoreId
flag on Provider; the Connect-card dropdown filters these out so the
top-up form never offers a chain/currency for cards that don't need one.
Reuses the existing suggested-apps logos to avoid duplicating assets.
* chore(cards): retitle 3rd hero step to highlight top-up speed
"Top up in seconds — your card is funded in under a minute, ready to
spend on the go" lands the speed promise harder than "1-click top-ups"
did, and frames the value as on-the-go spending rather than mechanics.
* feat(cards): route app-store cards through the Connect dialog
Bringin and wavecard are now in the provider dropdown. Picking either
hides the address/network/currency fields and replaces the primary
button with an "Open setup guide" link to /appstore/<id>, where their
own NWC pairing flow lives. Keeps a single entry point for "connect a
card" without forcing the stablecoin form onto cards that don't use it.
Also tightens the hero subtitle to lead with the speed promise.
* chore(cards): link app-store cards straight to /apps/new
Skip the app-store detail page — /apps/new?app=<id> drops users into
the connection flow with the right app preselected, which is what they
actually wanted.
* chore(cards): correct Bringin and wavecard table data
Verified against bringin.app/bitcoin-debit-cards and wave.space/card:
- Both offer physical *and* virtual cards (added "Both" to cardType).
- wave.space is EEA-only for issuance (card itself is accepted globally)
— regions changed from Global to EU.
- Direct Apple Pay isn't live for either; both currently work via Curve,
which is too indirect to claim native Apple Pay support.
- Issuance is not free: Bringin charges a €3.49/mo subscription that
bundles both cards; wave.space charges €2.99 virtual / €29.99 physical
one-time.
- Conversion fees are 1% + ~0.5% LP spread for both, not flat ~1%.
- Bringin URL fixed to bringin.app (they migrated from bringin.xyz);
wave.space URL points at the card landing page.
Doesn't change the dialog routing — picking Bringin/wavecard still drops
the user into /apps/new?app=<id> for the NWC pairing.
* chore(cards): tighten created-dialog copy
- Title and subtitle now describe the link instead of warning.
- Alert highlights the device-specific action ("save it on the phone
you'll top up from") and drops the redundant secret-recovery prose.
- QR caption mentions bookmark as an alternative to home-screen install.
* refactor(cards): route every provider through the standard app flow
- Add a bitcoin-card-topup app store entry pointing to card.albylabs.com
with a "visit + add to home screen + enter card details" install guide.
- Wire RedotPay and Freedomia to bitcoin-card-topup, and 2fiat to its
existing app store entry. Bringin and wavespace already had theirs.
- Drop the custom Connect card dialog, address/network/currency form,
and the one-shot CardCreatedDialog with embedded NWC link. Card config
is now collected inside the topup app itself.
- Drop the "Your card connections" section and the useUserCards hook —
connected cards show up in the standard /apps list like any other app.
* feat(cards): add Connect card picker dialog + clickable rows
- Bring back the Connect card button in the header; opens a lightweight
provider-picker dialog where each tile routes straight to
/apps/new?app=<appStoreId>.
- Drop the table's action column entirely; the whole provider row is now
clickable and opens the provider's website in a new tab. This separates
discovery (row click → learn more) from action (Connect card → setup).
* feat(cards): add Other card option + broaden install wording
- Add an "Other card" tile to the Connect card picker (dashed border,
generic credit-card icon). Routes to /apps/new?app=bitcoin-card-topup
so anyone holding a USDC/USDT card not in the listed providers can
still set up the topup flow.
- Reword the install guide from "phone you'll top up from" to "device" —
the topup app works equally well on a tablet or any browser.
* chore(cards): fix bitcoin-card-topup logo + broaden copy to "any crypto"
- Swap the placeholder 2fiat logo for the Alby logo (alby.png).
- Drop USDC/USDT specifics from the app description, extended
description, and the picker dialog's "Other card" tile copy. From the
user's perspective the topup app just takes a crypto card.
* chore(cards): use bitcoin-card-topup's own PWA icon as the app logo
Copy bitcoin-card-topup/public/shortcut-icon.png (the topup PWA's home-
screen icon) into suggested-apps/ and point the bitcoin-card-topup app
store entry at it, replacing the Alby-logo placeholder.
* fix(apps): align Connect-to-app header logo size with the appstore page
NewApp.tsx rendered the app logo at w-12 h-12 (48px) while
AppStoreDetailHeader uses w-14 h-14 (56px) — the logo visually jumps
between /apps/new?app=<id> and /appstore/<id>. Unify on w-14 h-14.
* fix(appstore): use AppHeader's standard icon/description slots
AppStoreDetailHeader was rendering the logo + title + description inside
a custom flex container nested into AppHeader's title prop, which gave
the icon a different vertical alignment than every other AppHeader use.
Pass them via the icon and description props instead so the header
layout stays consistent with /apps/new and the rest of the app.
* chore(cards): use Freedomia affiliate URL
* chore: add affiliate links
* fix: always show global cards
* fix: make 2fiat lightning native
* chore: update card instructions
* chore: optimize bitcoin card topup app image
* chore: improve bitcoin card topup copy
* chore: add card events, fix http service event endpoint url
* chore(cards): drop redundant 'Get a card' section heading
* chore(cards): tighten hero subtext + 3-step copy, hide filter footer when inactive
- Hero subtext drops the "one click" claim that's no longer accurate
post-refactor and the em-dash.
- 3-step descriptions reworded for length and fix "Setup" -> "Set up";
bottom step matches the "in seconds" heading instead of saying
"under a minute".
- "Showing N of M providers" footer is hidden unless a filter is
active — silent when there's nothing to clarify.
* chore(cards): apply Alby button gradient + brand stroke to hero card
Use the same vertical white→cream highlight and 1px #ffdf6f stroke that
alby.css applies to default primary buttons, so the hero card visual
reads as part of the same theme family instead of an isolated panel.
* chore(cards): reframe step 2 around the top-up link + drop hero gradient
- Step 2 title shifts from "Connect it" to "Get a top-up link" so the
deliverable (a saveable link) is what users see, matching what
actually happens at that step post-refactor.
- Drop the white→cream gradient overlay from the hero card; the flat
yellow with the existing shadow is the look we want.
* chore: change wave.space kyc level
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* fix: show BOLT-12 offer button for CLN backend
The CLN backend implements MakeOffer and the /api/offers endpoint is
backend-agnostic, but the UI only surfaced the "Lightning Offer" button
when backendType === "LDK", leaving CLN users without a way to reach
the flow.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* refactor: gate BOLT-12 offer UI on supportsBolt12 from useInfo
Surface a supportsBolt12 capability on the info response (true for LDK
and CLN) so the frontend stops hardcoding backend-type checks for the
BOLT-12 offer button.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(appstore): rebrand LendaSwap as Satora
* chore: also show the previous name on the app card
---------
Co-authored-by: Lucas Soriano del Pino <lucas_soriano@fastmail.com>