Commit graph

3222 commits

Author SHA1 Message Date
Roland
5b3f1bef9d
fix: update to alby go-nostr fork which reconnects after receiving CLOSED message (#2331) 2026-05-11 12:34:56 +07:00
Adithya Vardhan
9f8da1a003
chore: add new gpg key for im-adithya (#2318)
Adds my GPG key for signing releases
2026-05-07 17:56:48 +05:30
Adithya Vardhan
04d3712cb2
chore: add new gpg key for im-adithya 2026-05-07 17:51:38 +05:30
Roland
d5bdb435b5
feat: show last transaction amount on recently used apps (#2315)
* feat: show last transaction amount on recently used apps

* fix: icon size
2026-05-07 17:31:06 +05:30
Adithya Vardhan
261a668a2f
fix: allow creating apps without requiring superuser access (#2316) 2026-05-07 18:56:31 +07:00
Adithya Vardhan
a8f2c87122
fix: position and size sidebar hint x icon (#2313)
* fix: position and size sidebar hint x icon

* chore: remove unused name prop
2026-05-07 17:13:26 +05:30
Roland
d7481ee71a
fix: incorrect colors in close channel dialog (#2312)
* fix: incorrect colors in close channel dialog

* chore: undo copy change

* fix: text/button colors
2026-05-07 15:00:50 +05:30
Roland
5d71064b94
fix: allow pasting BIP-21 URL into the wallet send input (#2310)
* fix: allow pasting BIP-21 URL into the wallet send input

* fix: remove replace in navigation from bip21 link
2026-05-07 14:40:28 +05:30
Roland
fb7986dd16
fix: link colors in themes with brighter primary colors (#2311)
* fix: link colors in themes with brighter primary colors

* fix: change link button variant color
2026-05-07 14:22:42 +07:00
Roland
d8d7452e75
feat: add swap in button to insufficient lightning balance alert (#2309)
* feat: add swap in button to insufficient lightning balance alert

* fix: casing
2026-05-07 12:45:58 +05:30
Adithya Vardhan
011c030512
fix: replace payment flow intermediate screens in browser history (#2308)
* fix: replace payment flow intermediate screens in browser history

* fix: add break all to ln address container

---------

Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
2026-05-07 13:46:56 +07:00
René Aaron
bb9249c767
feat: replace wallet balance toggle with Lightning / On-chain tabs (#2306)
* feat: prototype balance switcher variants on wallet screen

Adds two switcher styles (icon-only segmented control and tab-style
control) alongside the original "Spending Balance ⇅" toggle, with a
floating dev-only variant toggle for side-by-side comparison.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: replace balance toggle with tab switcher

Drops the icon-only and original variants plus the dev preview toggle,
keeping just the Lightning / On-chain tab switcher and a wider gap to
the balance underneath.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: use shadcn Tabs primitive for balance switcher

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: type balance switcher icons with LucideIcon

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: only render balance switcher when on-chain wallet exists

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: note lucide-react *Icon suffix convention in AGENTS.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
2026-05-07 13:01:17 +07:00
Roland
15be274f24
chore: rename spending balance to lightning balance (#2305)
* chore: rename spending balance to lightning balance

* chore: align AutoSwap threshold label capitalization

Match sentence case used by the form label and sibling rows in
ActiveSwapOutConfig.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: more renaming and copy fixes

* chore: more renaming

---------

Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 12:49:24 +07:00
René Aaron
a64345714e
fix: scope Alby theme default-variant styling to buttons only (#2302)
fix(alby-theme): scope default-variant styling to buttons only

The Alby theme's `[data-variant="default"]` selector was element-broad
(`:is(button, a, span)`) and matched any Radix component that exposes
`data-variant`. Wrapping a `DropdownMenuItem` around `<Link asChild>` made
the `<a>` inherit `data-variant="default"` and pick up the gold gradient +
1px border — the bug fixed symptomatically in #2286 and #2295.

Narrow the selector to `[data-slot~="button"][data-variant="default"]`.
Radix's Slot forwards `data-slot="button"` onto `<Button asChild>` children,
so DialogTrigger asChild and friends keep their styling, while
DropdownMenuItem (`data-slot="dropdown-menu-item"`) and Badge
(`data-slot="badge"`) no longer match.

Restore the idiomatic `<DropdownMenuItem asChild><Link/>` pattern that #2286
removed so users keep middle-click / cmd-click / "open in new tab" on menu
navigation items.
2026-05-06 17:15:16 +07:00
René Aaron
954c69028e
fix: hide transaction ID from on-chain transactions list (#2304)
Transaction IDs in the wallet on-chain tab list are noisy and not very
useful at a glance. The full TX ID is still shown in the transaction
detail modal with a copy button and a link to mempool.

Note: showing the bitcoin address in the detail modal (also suggested
in the issue) would require extending lnclient.OnchainTransaction with
an Address field. LDK's PaymentKindOnchain doesn't expose the address,
so this would only be populatable for LND/CLN — leaving it out for now.

Closes #2299
2026-05-06 16:58:20 +07:00
Roland
21e7b1d885
docs: add avoid useNavigate point to AGENTS.md (#2300) 2026-05-06 11:01:00 +02:00
daywalker90
12c454f3ae
feat: add notifications for CLN backend (#2287)
* fix: protoc command for cln bindings documentation

* feat: update cln proto bindings to v26.04

* feat: add notifications for CLN backend

starting with nwc_lnclient_payment_sent, nwc_lnclient_payment_failed,
nwc_lnclient_payment_received, nwc_payment_forwarded, nwc_channel_ready,
nwc_channel_closed
2026-05-06 13:11:03 +07:00
Adithya Vardhan
099ad146df
chore: bump protobuf hex-display replace to v1.33.0 (#2293)
* chore: bump protobuf hex-display replace to v1.33.0

* chore: update protobuf replace comment for lnd v0.20.1-beta
2026-05-06 13:06:59 +07:00
Adithya Vardhan
f9fd5e9993
chore: bump lnd to v0.20.1-beta (#2285) 2026-05-04 15:07:23 +05:30
Adithya Vardhan
b9d15f54d3
fix: avoid highlighted border on menu buttons in Alby theme (#2286) 2026-05-04 15:06:55 +05:30
dependabot[bot]
fef6fc0afc
build(deps): bump github.com/mattn/go-sqlite3 from 1.14.42 to 1.14.44 (#2276)
Bumps [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) from 1.14.42 to 1.14.44.
- [Release notes](https://github.com/mattn/go-sqlite3/releases)
- [Commits](https://github.com/mattn/go-sqlite3/compare/v1.14.42...v1.14.44)

---
updated-dependencies:
- dependency-name: github.com/mattn/go-sqlite3
  dependency-version: 1.14.44
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 14:10:23 +05:30
dependabot[bot]
fa978b6faf
build(deps): bump @scure/bip39 from 2.0.1 to 2.2.0 in /frontend (#2277)
Bumps [@scure/bip39](https://github.com/paulmillr/scure-bip39) from 2.0.1 to 2.2.0.
- [Release notes](https://github.com/paulmillr/scure-bip39/releases)
- [Commits](https://github.com/paulmillr/scure-bip39/compare/2.0.1...2.2.0)

---
updated-dependencies:
- dependency-name: "@scure/bip39"
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 13:55:49 +05:30
dependabot[bot]
66467b580a
build(deps): bump dayjs from 1.11.13 to 1.11.20 in /frontend (#2278)
Bumps [dayjs](https://github.com/iamkun/dayjs) from 1.11.13 to 1.11.20.
- [Release notes](https://github.com/iamkun/dayjs/releases)
- [Changelog](https://github.com/iamkun/dayjs/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/iamkun/dayjs/compare/v1.11.13...v1.11.20)

---
updated-dependencies:
- dependency-name: dayjs
  dependency-version: 1.11.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 13:42:00 +05:30
dependabot[bot]
80291dcb90
build(deps-dev): bump @commitlint/cli from 20.5.0 to 20.5.3 in /frontend (#2279)
Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 20.5.0 to 20.5.3.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.5.3/@commitlint/cli)

---
updated-dependencies:
- dependency-name: "@commitlint/cli"
  dependency-version: 20.5.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 13:37:50 +05:30
dependabot[bot]
a73338e168
build(deps-dev): bump typescript-eslint from 8.58.2 to 8.59.1 in /frontend (#2281)
build(deps-dev): bump typescript-eslint in /frontend

Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.58.2 to 8.59.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.59.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 13:31:05 +05:30
dependabot[bot]
386a849124
build(deps-dev): bump eslint from 10.2.0 to 10.3.0 in /frontend (#2280)
Bumps [eslint](https://github.com/eslint/eslint) from 10.2.0 to 10.3.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.2.0...v10.3.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 10.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-04 13:26:20 +05:30
daywalker90
28706ecf31
feat: add CLN backend (#2026)
* feat: add CLN as a lnclient backend

* feat: add hold invoice support for CLN backend

* fix: reduce CLN form to just addresses and lightning dir

* feat: add README for CLN grpc go code generation

* fix: cln backend does not support keysend with given preimages

* fix: hold invoice notifications in CLN backend

* fix: remove dead code in CLN backend from ListTransactions

* fix: env example CLN_ADDRESS_HOLD with different port to show it's a different service

* fix: cleanup of CLN ressources in all cases

* fix: cln backend's GetNetworkGraph only fetches specified nodeId's

* fix: cln backend: only advertise hold methods for nip47 if hold plugin enabled

* fix: cln's Shutdown should not stop CLN itself

* fix: relax the LND README line regarding env configuration

* fix: more nil checks in clnInvoiceToTransaction

* fix: prevent feerate overflow in CLN's RedeemOnchainFunds

* fix: don't access nil errors for empty reponses of certain CLN methods

* fix: nil instead of empty string in cln's GetNetworkGraph return types

* fix: nil checks for created_at in cln's clnInvoiceToTransaction

* fix: set minimum tls version to 1.2 for cln backend grpc connections

* fix: cln's subscribeOpenHoldInvoices doesn't give up as fast

* fix: deduplicate graph edges in cln's GetNetworkGraph

* fix: print the error string, not pointer address, in cln's ListChannels

* fix: remove cln's ListTransactions completely

* fix: use ListPeers instead of ListPeerChannels in cln's ListPeers

* feat: cln's MakeHoldInvoice supports minCltvExpiryDelta

* fix: use named return err in NewCLNService

* fix: cln listpeers log message

* fix: incorrect import

* fix: compile errors after rename

---------

Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
2026-05-03 12:36:13 -07:00
Adithya Vardhan
fe1f338ed3
feat: allow payments from app connections (#2267)
* feat: allow payments from app connections

* feat: add searchable pay-from combobox

* chore: add constant for apps limit and sort apps in list

* fix: add serverside filtering, default combobox value

* chore: rename appId to fromAppId in send payment request

---------

Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
2026-05-03 12:27:38 -07:00
im-adithya
a10c328876 fix: stretch theme preview labels to full width 2026-05-01 16:00:01 +05:30
Adithya Vardhan
f9702c6998
fix: preserve badge background clipping (#2273)
* fix: update codex logo

* fix: preserve badge background clipping
2026-05-01 15:48:09 +05:30
Adithya Vardhan
0c421375e5
chore: update to use sat/msat suffixes everywhere (#2271)
* chore: align internal models and methods to use sat/msat suffixes

* chore: update request structs to use sat/msat suffixes

* fix: default max amount to 0 during app creation

* fix: simplify helper functions

* chore: remove unused lnclient probing methods

* chore: remove unused json tags on swap struct

* chore: update frontend to use sat/msat suffixes everywhere

* chore: use request types in frontend

* fix: linting

* fix: remove deprecated sat and msat fields in frontend

* chore: further changes

* fix: avoid sat/msat resolver variable shadowing

* fix: validate Support Alby amounts
2026-05-01 15:41:56 +05:30
Adithya Vardhan
663b805868
feat: simplify onchain receive routing (#2268)
* feat: show onchain options in receive screen

* fix: wallet receive mode routing and navigation issue

* fix: receive on-chain link in command palette
2026-05-01 13:00:45 +05:30
Adithya Vardhan
1394733729
fix: simplify themes (#2270) 2026-04-30 20:39:13 +02:00
René Aaron
925cba450c
refactor(frontend): extract DetailRow for transaction details dialog (#2269)
refactor(frontend): extract TransactionDetailRow for both detail dialogs

Pulls the repeated `<div><label/><value+copy/></div>` shape out of
TransactionItem and OnchainTransactionItem into a shared component with
an optional `copyable` prop. Replaces ~16 hand-written rows in the
lightning dialog and 4 in the on-chain dialog. Lightning also gets
parent-driven `gap-6` spacing in place of per-row `mt-6` / `mt-8`.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 21:03:32 +05:30
René Aaron
25ce056eb8
fix(frontend): auto-balance home dashboard columns (#2255)
* fix(frontend): auto-balance home dashboard columns

Replace the fixed two-column grid with a CSS multi-column layout so
widgets flow and auto-balance regardless of which ones render (several
widgets can return null based on user state). Group the Alby ecosystem
cross-promo cards so they stay together within a column.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: extract Alby home widgets

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-30 20:46:36 +05:30
saunter
30ef3c254a
feat(frontend): wallet on-chain mode (#2217)
* feat(frontend): add wallet on-chain balance mode

Show on-chain balances and transactions in Wallet.
Keep receive and send flows aligned with the active balance mode.

Made-with: Cursor

* fix(frontend): gate on-chain toggle on channel management and fix isLast naming

Hide the balance mode toggle for backends without on-chain support
(PHOENIX, CASHU). Rename misleading `isLast` prop to `showSeparator`
in PendingClosedChannelsAlert.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(frontend): inline on-chain balance display per page

Drop the shared OnchainBalanceSummary component. The two call sites
(compact card on Channels, large hero on Wallet) diverged enough that
sharing required threading className overrides for every internal node.
Inline each shape next to its surrounding context.

Also drop the pending-closed-channels alert from Wallet — it's
channel-management context and belongs on the Channels page only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): a11y and small cleanups on wallet on-chain mode

- Add aria-label to the balance-mode toggle and aria-hidden on its
  icon so screen readers announce it as a mode switch.
- Drop the unnecessary :index suffix on the pending-closed-channels
  item key — (fundingTxId, fundingTxVout) is unique.
- Replace trailing mb-4 on each on-chain transaction row with
  space-y-4 on the list container so the last row has no dangling
  margin.
- Use named useState import in Wallet to match repo convention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(frontend): move OnchainTransactionsTable to components/wallet and drop node page copy

Wallet is now the single place to review on-chain transaction history,
so drop the duplicate <OnchainTransactionsTable /> from the Node page
and move the component to components/wallet/ to reflect its new home.
Pure move — no content changes to the component itself.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): simplify OnchainTransactionsTable to its one use case

Wallet is now the sole consumer of this component, so remove the
reusability props that were only there for the now-dropped Channels
page render: wrapInCard, title, className, contentClassName,
showEmptyState, and the four emptyState* props. The card-wrapping
branch and its CardHeader/CardTitle dependencies are gone with it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(frontend): add on-chain transaction details dialog

Open a lightweight details dialog from an on-chain transaction row
showing amount, status, confirmations, date/time, and full transaction
id. Mempool becomes a secondary action in the dialog footer (hidden
when no mempool URL is configured).

Diverges slightly from saunter's original implementation: body content
lives in a sibling div of DialogDescription instead of inside it, so
the block elements don't nest inside a <p> (invalid HTML / React
hydration warning).

Folds in https://github.com/getAlby/hub/pull/2218 (original author: saunter).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(frontend): polish on-chain pending transaction state

Treat unconfirmed on-chain transactions as pending in the Wallet UI.
Keep the backend "unconfirmed" state value unchanged — this only
affects UI labels and the variable name (isUnconfirmed → isPending).

Folds in https://github.com/getAlby/hub/pull/2221 (original author: saunter).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): use "transactions" instead of "payments" in on-chain empty state

Aligns terminology with bitcoin.design convention: "transaction" for
on-chain, "payment" for lightning.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): reset receive-onchain flow on "Receive Another Payment"

The success screen's "Receive Another Payment" button linked to
/wallet/send (typo) and later to /wallet/receive/onchain (still broken
since the route is unchanged, so React Router wouldn't remount and the
local state kept showing the success card).

Replace the LinkButton with a Button that resets the local state
(txId, confirmed/pending amount, start timestamp) and requests a fresh
on-chain address, taking the user back to "Waiting for Payment…" with
a new QR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): address review feedback on wallet on-chain mode

- OnchainTransactionsTable: don't flash the empty state while SWR is
  still loading; only render it once transactions is defined AND empty.
- OnchainTransactionsTable: add DialogDescription to the details dialog
  so DialogContent has an accessible description (fixes Radix's dev
  warning and improves screen-reader flow).
- OnchainTransactionsTable: swap the copy-tx-id native button for the
  shadcn Button in ghost/icon-xs — kept the row-level button native
  because the shadcn variants (justify-center, h-9, bg) fight the
  custom-shaped row surface.
- Wallet: dynamic aria-label on the balance-mode toggle so the current
  state is announced (previously "Switch balance mode" hid the visible
  label).
- Wallet: align on "On-chain Balance" (repo convention — ~18 other uses)
  instead of "On-Chain Balance".
- Wallet: gate the "Open Your First Channel" alert on channels being
  loaded so it doesn't flash while useChannels() is resolving.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): unify copy buttons in transaction details dialogs

Both the Lightning (TransactionItem) and on-chain (OnchainTransactionsTable)
transaction details dialogs now use the shadcn Button component for
inline copy-to-clipboard affordances — variant=ghost, size=icon-sm,
muted foreground to match the surrounding value text. Previously Lightning
used a bare CopyIcon with onClick and on-chain used a mix; now both
dialogs look and behave the same.

Also drops the now-redundant "Copy Transaction ID" footer button from
the on-chain dialog (the inline copy icon next to the tx id does the
same thing). Footer hosts only "View on Mempool" and renders only when
a mempool URL is configured.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): second review pass — pluralization and null-guard fixes

- OnchainTransactionsTable: pluralize the confirmations tooltip so a
  single-confirmation tx reads "1 confirmation" instead of
  "1 confirmations".
- PendingClosedChannelsAlert: guard the mempool funding-tx link on
  info?.mempoolUrl being resolved — previously the URL interpolated to
  "undefined/tx/..." during the brief window before useInfo settles.
  Falls back to omitting the funding-tx link rather than rendering a
  broken one.
- PendingClosedChannelsAlert: only render "with {details}" when the
  details arrays are non-empty. Avoids the dangling "with." sentence
  in the unlikely case that pendingBalancesFromChannelClosures > 0
  while both pendingBalancesDetails and pendingSweepBalancesDetails
  are empty.

Other items in the review were already addressed in earlier commits:
capitalization (6a8f47b3), row mb-4 → space-y-4 on parent (c51826bb),
and the title/emptyState* props (gone with the component simplification).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): drop redundant mempoolUrl guards

Backend always populates info.mempoolUrl — MEMPOOL_API env defaults to
https://mempool.space/api in config/models.go and GetMempoolUrl
(config/config.go:206) returns it with /api trimmed. There's no code
path that leaves the URL empty, so guarding the "View on Mempool"
button and the "funding tx" link against it being falsy was defensive
against a state the backend won't produce. Matches the convention
used elsewhere (ReceiveOnchain etc.).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): guard against negative incoming and drop dead mb-1

In the Channels-page inline on-chain balance block:

- Switch the "+X incoming" guard from spendable !== total to
  total > spendable, matching the wallet hero. Prevents a negative
  displayed amount in the unlikely event spendable briefly exceeds total.
- Drop mb-1 from the inline <span> wrapping FormattedBitcoinAmount;
  margin-bottom is a no-op on inline elements. Parent <div className="mb-1">
  already provides the intended spacing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): drop unreachable short-txid branch in subtitle

Bitcoin transaction ids are always 64 hex chars, so the
`tx.txId.length > 22` ternary's false branch is dead code.
Always render the truncated head…tail form in the row.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): group subtitle with other derived vars

Move the subtitle declaration up alongside Icon, isPending,
typeStateText, statusText, createdAt at the top of OnchainTransactionRow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): use ExternalLinkButton for "View on Mempool"

Replace the Button + onClick(openLink(...)) pattern with the repo's
ExternalLinkButton component. In http mode it renders as a real
<a target="_blank" rel="noreferer noopener"> so right-click-to-open,
middle-click, keyboard nav, and ctrl-click all work; in wails mode it
falls back to openLink. Previously the button always used the wails
path regardless of mode.

Also drops the now-unused openLink import.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: redirect to send screen in onchain mode

* chore: align components

* feat(frontend): drive wallet balance mode from URL

Lift the spending/onchain toggle state into a `mode` query param so the
browser back button restores the previous mode after going through
send/receive flows.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): split wallet dashboard into Lightning and Onchain routes

Replaces the single conditional Wallet component with two sibling route
components mounted under a shared WalletLayout that hosts the page header
and Outlet. The Lightning view (default `/wallet`) is the renamed and
trimmed-down former index.tsx; on-chain (`/wallet/onchain`) is a new
component with its own balance, action buttons, and transactions list.

The toggle UI stays — clicking it now navigates between the two real
routes instead of flipping a `?mode=` query param, so the browser back
button restores the previous tab for free.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(frontend): drop on-chain incoming indicator from balance header

Pending receives are already visible in the on-chain transactions list
below, so the duplicated +X incoming summary just adds noise.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-30 14:30:01 +02:00
René Aaron
ed7e10cf25
feat: user labels for transactions (#2265)
* feat: user labels poc

* feat: backend for transaction user labels

Add PATCH /api/transactions/:paymentHash/label that merges a
user-supplied {key:value} map into the existing transaction metadata
under the user_label key, preserving NIP-47 fields. Empty map clears
the labels. Trims whitespace, drops blank rows, caps key/value length.

Wire the frontend editor to call the endpoint and revalidate the
transactions SWR cache on success.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: include user labels as columns in CSV export

Collect the union of user_label keys across all exported transactions
and emit each one as its own label_<key> column. The existing metadata
JSON column is preserved so importers like Raccoin keep working.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: drop hardcoded label suggestions, autocomplete from prior keys

Open the editor with a single blank row instead of four pre-seeded
fields. Suggest label keys via a datalist populated from any
user_label keys already present in the SWR transactions cache, so
suggestions reflect the user's own taxonomy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: inline label editor and indicator-only list row

Replace the nested label dialog with an inline editor that toggles
within the existing transaction detail dialog, removing dialog
stacking. In the transactions list, replace per-label badges with a
single tag icon next to the timestamp so row height stays uniform; the
full labels remain visible in the detail view.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: don't bump updated_at on metadata-only edits

GORM's Update auto-touches updated_at, which made the transactions
list reorder labeled transactions to the top. Switch
SetTransactionMetadata to UpdateColumn so only the metadata column
changes. Add regression test.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: route PATCH transaction label requests in wails

The desktop app routes API calls through WailsRequestRouter rather
than HTTP. Add a handler for PATCH /api/transactions/:hash/label
before the existing transaction lookup so labels work in Wails too.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: finalize backend

* chore: rename to labels

* chore: finalize frontend

* chore: use tx id to add user labels

* chore: address minor nits

* fix: linting

* fix: use explicit primary key lookups

* chore: simplify transaction csv label export

* fix(frontend): drop label count from transaction list badge

The count adds visual weight without informing any decision from the
list view. The icon-as-badge already signals labels exist; the actual
values are in the details dialog.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): revert transaction list label indicator to bare icon

The Badge wrapper made the icon-only indicator wider than tall, which
looked off. Restores the pre-PR look — a small TagIcon next to the
timestamp — since the in-dialog editor is the place to see actual labels.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-30 13:13:07 +02:00
Adithya Vardhan
7195c09de3
feat: make Alby the default theme and rename default to classic (#2266)
* feat: make Alby the default theme and rename default to classic

* refactor(frontend): extract neutral base.css for theme defaults

Splits the global :root/.dark fallbacks out of alby.css into a dedicated
base.css so no single theme is special. Alby and Classic both become
pure override layers; Classic is now an empty layer that falls through
to base, eliminating the :root/.theme-classic dual-selector pattern.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 11:04:02 +02:00
René Aaron
51ec695a6d
fix(frontend): improve Earn page readability (#2264)
* fix(frontend): improve Earn page readability and polish

Use theme-safe link styling instead of text-primary (unreadable yellow
on white in the Alby theme), bolder reward amounts, and trophy/heart
icons for non-sat rewards.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: simplify reward icon handling

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-28 17:10:36 +05:30
René Aaron
54840ba2ed
refactor(frontend): drop time-based home greeting (#2254)
refactor(frontend): replace time-based greeting with static title

The previous time-of-day greeting used the browser's local hour but had
range bugs (e.g. midnight showed "Good Morning"). Rather than iterate on
the ranges, drop the greeting entirely and use "Home" to match the
sidebar nav.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 14:01:49 +05:30
dependabot[bot]
4c1c592a3c
build(deps): bump swr from 2.3.6 to 2.4.1 in /frontend (#2263)
Bumps [swr](https://github.com/vercel/swr) from 2.3.6 to 2.4.1.
- [Release notes](https://github.com/vercel/swr/releases)
- [Commits](https://github.com/vercel/swr/compare/v2.3.6...v2.4.1)

---
updated-dependencies:
- dependency-name: swr
  dependency-version: 2.4.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 16:58:27 +05:30
dependabot[bot]
eb7ecb086a
build(deps): bump react-router from 7.14.0 to 7.14.2 in /frontend (#2262)
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) from 7.14.0 to 7.14.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.14.2/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.14.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 16:50:21 +05:30
dependabot[bot]
ba7d10086e
build(deps-dev): bump eslint-plugin-react-hooks from 7.0.1 to 7.1.1 in /frontend (#2261)
* build(deps-dev): bump eslint-plugin-react-hooks in /frontend

Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 7.0.1 to 7.1.1.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/eslint-plugin-react-hooks@7.1.1/packages/eslint-plugin-react-hooks)

---
updated-dependencies:
- dependency-name: eslint-plugin-react-hooks
  dependency-version: 7.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: disable react-hooks set-state-in-effect

* chore: suppress react-hooks set-state-in-render in NewApp

* fix: avoid mutating order before submission

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-27 16:46:41 +05:30
dependabot[bot]
a4f81fd907
build(deps-dev): bump @commitlint/config-conventional from 20.0.0 to 20.5.0 in /frontend (#2260)
build(deps-dev): bump @commitlint/config-conventional in /frontend

Bumps [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) from 20.0.0 to 20.5.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.5.0/@commitlint/config-conventional)

---
updated-dependencies:
- dependency-name: "@commitlint/config-conventional"
  dependency-version: 20.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 16:45:39 +05:30
dependabot[bot]
008a1c7f74
build(deps-dev): bump @tailwindcss/vite from 4.1.11 to 4.2.4 in /frontend (#2259)
build(deps-dev): bump @tailwindcss/vite in /frontend

Bumps [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) from 4.1.11 to 4.2.4.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.4/packages/@tailwindcss-vite)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.2.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 15:58:29 +05:30
dependabot[bot]
eca9599047
build(deps): bump github.com/BoltzExchange/boltz-client/v2 from 2.11.2 to 2.11.3 (#2257)
build(deps): bump github.com/BoltzExchange/boltz-client/v2

Bumps [github.com/BoltzExchange/boltz-client/v2](https://github.com/BoltzExchange/boltz-client) from 2.11.2 to 2.11.3.
- [Release notes](https://github.com/BoltzExchange/boltz-client/releases)
- [Changelog](https://github.com/BoltzExchange/boltz-client/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BoltzExchange/boltz-client/compare/v2.11.2...v2.11.3)

---
updated-dependencies:
- dependency-name: github.com/BoltzExchange/boltz-client/v2
  dependency-version: 2.11.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 15:52:15 +05:30
René Aaron
12557618ad
refactor(frontend): redesign Pro upgrade modal (#2251)
* refactor(frontend): redesign Pro upgrade dialog and fix theme bleed

- Drop the `premium` button variant; default buttons now use the alby
  theme gradient via theme tokens instead of hard-coded amber
- Fix alby button gradient: target `data-variant` only (so Radix
  asChild wrappers like DialogTrigger don't break the selector) and
  unlayer the override so it's not overridden by Tailwind utilities
- ExternalLink now forwards arbitrary props so ExternalLinkButton's
  data-variant attribute reaches the rendered <a>
- Recompose UpgradeDialog: Pro badge -> headline -> stacked $3 / mo
  price -> 6-feature grid -> CTA with inline price -> guarantee

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): apply V1 upgrade modal design

Restructure the Pro upgrade dialog to match the V1 "Refined default"
design from the Claude Design handoff:

- Pro pill: primary-tinted Badge with sparkles glyph
- New headline ("Do more with your Hub.") + open-source subhead
- Price block: $3 / month inline with "Billed $36 yearly" caption
- Single-column feature list with primary-tinted check circles
- CTA drops the inline price (already prominent above) and the
  guarantee tightens to "30-day money-back guarantee"

All color treatments use theme tokens (bg-primary/10, border-primary/40,
text-foreground) so the look adapts per hub theme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(frontend): inline Pro badge in upgrade dialog heading

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: copy

* fix(frontend): compose onClick in ExternalLink non-http branch

Spreading props after setting onClick silently dropped caller-provided
handlers. Compose them instead so callers' onClick runs, with
openLink skipped if the event is prevented.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: add sr-only to dialog header

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-27 15:44:04 +05:30
René Aaron
1c69f2f261
feat: redesign settings pages with improved UI (#2224)
* feat: redesign settings pages with improved UI

- Add icons and group nav into sections
- Visual theme picker with color previews
- Segmented light/dark/system toggle
- Card-based layout for settings sections
- Alby Account: profile info with ProBadge
- Locked themes trigger UpgradeDialog
- Sidebar: startsWith for active states

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address review feedback

- Sidebar: boundary-aware route matching
- Theme cards: use button for keyboard a11y
- Appearance toggle: add aria-pressed
- Alby Account: show email when name exists

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use CSS variables for theme previews

Use actual theme classes with CSS variables instead
of hardcoded hex colors for theme preview cards.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: extract ThemePreview component

Use CSS theme classes directly on preview elements
with a theme-default wrapper for proper fallback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: mobile view

* revert: restore AlbyAccount page to master

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: align general settings with other settings pages

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: drop unused optional description change in SettingsHeader

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: improve theme picker accessibility and loading state

- Use role=radiogroup/radio semantics for theme grid and dark mode toggle
- Make locked theme cards keyboard-accessible via controlled UpgradeDialog
- Gate render on albyMe load when account connected to prevent lock flash
- Use cursor-not-allowed on disabled theme cards
- Mark ThemePreview aria-hidden (decorative)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: extract isPathActive helper in AppSidebar

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: move ThemePreview to components directory

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: align settings sidebar with main sidebar

* chore: polish appearance section in settings

* chore: add spacing for scroll in backup page

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-27 15:12:38 +05:30
René Aaron
2f3dc233d3
feat: improve Alby Account settings page (#2253)
* feat: improve Alby Account settings page

Redesigns the settings page with a unified profile card, groups
destructive actions into a "Danger Zone", and simplifies the copy
for the Switch/Disconnect flows.

Closes #2247

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: handle loading and failed state

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
2026-04-27 10:55:22 +05:30
hermes-alby
d97ed7114f
chore: update ldk-node-go (#2256)
Co-authored-by: Hermes Alby <hermes-alby@users.noreply.github.com>
2026-04-25 14:50:33 +07:00