Commit graph

1354 commits

Author SHA1 Message Date
dependabot[bot]
afdb842a54
build(deps-dev): bump @tailwindcss/forms from 0.5.10 to 0.5.11 in /frontend (#2453)
build(deps-dev): bump @tailwindcss/forms in /frontend

Bumps [@tailwindcss/forms](https://github.com/tailwindlabs/tailwindcss-forms) from 0.5.10 to 0.5.11.
- [Release notes](https://github.com/tailwindlabs/tailwindcss-forms/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss-forms/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss-forms/compare/v0.5.10...v0.5.11)

---
updated-dependencies:
- dependency-name: "@tailwindcss/forms"
  dependency-version: 0.5.11
  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-07-27 19:52:09 +07:00
Anshuman
754acfc9df
fix: update wave.space affiliate URL (#2475) 2026-07-27 19:51:07 +07:00
dependabot[bot]
e6fcc3e3c1
build(deps-dev): bump typescript-eslint from 8.60.1 to 8.61.0 in /frontend (#2452)
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.60.1 to 8.61.0.
- [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.61.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.61.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-07-27 19:19:40 +07:00
dependabot[bot]
270d23d273
build(deps-dev): bump @types/node from 25.8.0 to 25.9.3 in /frontend (#2450)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.8.0 to 25.9.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.9.3
  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-07-27 19:18:50 +07:00
René Aaron
bf9c346a98
feat: use switch and improve copy on node settings page (#2441)
Some checks failed
Multiplatform Docker build & push / build (push) Has been cancelled
Code quality - linting and typechecking / linting (push) Has been cancelled
Backend testing with Postgres / test-postgres (push) Has been cancelled
* feat: use switch and improve copy on node settings page

* fix: allow disabling JIT channels when no liquidity source exists
2026-06-12 11:11:17 +07:00
Roland
b1c0d4eac8
fix: add fallback instructions if JIT LSP seems to be offline (#2443)
* fix: add fallback instructions if JIT LSP seems to be offline

* fix: duplicate invoice probe

* fix: properly check if lsps2 is enabled before setting jit request failed

* fix: don't render incorrect maximum receive amount if balances aren't loaded
2026-06-12 11:09:27 +07:00
Alchemist
a21c320fde
feat: simplify receive screen (#2426)
Some checks are pending
Multiplatform Docker build & push / build (push) Waiting to run
Code quality - linting and typechecking / linting (push) Waiting to run
Backend testing with Postgres / test-postgres (push) Waiting to run
* feat: simplify receive screen

* fix: use absolute receive routes

* chore: move other options to separate card, improve copy

* chore: also add accordion to receive invoice screen (for non-logged-in users)

* fix: JIT alert padding

* feat: explain other receive options with descriptive menu rows

* fix: move first channel jit alert outside of card

---------

Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
Co-authored-by: René Aaron <rene@twentyuno.net>
2026-06-11 19:20:35 +07:00
Roland
864c841c07
feat: add solvocard + add provider name to bitcoin card topup (#2440) 2026-06-11 15:56:52 +07:00
René Aaron
2f258138bc
fix: send referrer header on stories YouTube embed (#2435) 2026-06-11 13:17:27 +07:00
Anthonyushie
5249ebe7db
fix: add lightning tag to Freedomia card (#2437) 2026-06-11 13:15:39 +07:00
Roland
cc429c4553
chore: fix formatting (#2430)
Some checks are pending
Multiplatform Docker build & push / build (push) Waiting to run
Code quality - linting and typechecking / linting (push) Waiting to run
Backend testing with Postgres / test-postgres (push) Waiting to run
2026-06-10 14:51:37 +07:00
Adithya Vardhan
d8faf09109
fix: avoid mempool api failures during swaps by using boltz for fee and tx lookup (#2421)
* 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>
2026-06-10 14:47:54 +07:00
frnandu
b55978d7bc
feat: just in time channels with lsps2 (#2275)
* 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>
2026-06-10 14:47:07 +07:00
Roland
e5dc19ae68
feat: add readonly option for app store apps (#2415) 2026-06-10 13:17:13 +07:00
Roland
98e7d987bb
feat: pass selected provider to card topup app (#2416)
* 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>
2026-06-10 13:16:02 +07:00
René Aaron
3453b69a1c
feat: refine wallet empty states (#2382)
* 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>
2026-06-10 13:00:43 +07:00
René Aaron
d1636cbcce
fix: reduce wallet balance/transaction polling interval to 10s (#2425)
Some checks are pending
Multiplatform Docker build & push / build (push) Waiting to run
Code quality - linting and typechecking / linting (push) Waiting to run
Backend testing with Postgres / test-postgres (push) Waiting to run
* 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
2026-06-09 20:52:40 +07:00
Roland
2657c89aa8
feat: reframe AI agent inspiration tab around managing the hub (#2418)
* 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>
2026-06-09 20:50:30 +07:00
Roland
10771b7c0a
chore: remove Bitrefill custom app in favor of standard NWC connection (#2420)
* 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>
2026-06-09 20:11:04 +07:00
dependabot[bot]
7b963e944f
build(deps): bump @base-ui/react from 1.4.1 to 1.5.0 in /frontend (#2405)
Bumps [@base-ui/react](https://github.com/mui/base-ui/tree/HEAD/packages/react) from 1.4.1 to 1.5.0.
- [Release notes](https://github.com/mui/base-ui/releases)
- [Changelog](https://github.com/mui/base-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/base-ui/commits/v1.5.0/packages/react)

---
updated-dependencies:
- dependency-name: "@base-ui/react"
  dependency-version: 1.5.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-06-09 15:03:29 +07:00
dependabot[bot]
2215b04da6
build(deps-dev): bump eslint from 10.3.0 to 10.4.1 in /frontend (#2409)
Bumps [eslint](https://github.com/eslint/eslint) from 10.3.0 to 10.4.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.3.0...v10.4.1)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 10.4.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-06-09 15:01:12 +07:00
dependabot[bot]
2d4aab5bee
build(deps): bump tailwind-merge from 3.4.1 to 3.6.0 in /frontend (#2408)
Bumps [tailwind-merge](https://github.com/dcastil/tailwind-merge) from 3.4.1 to 3.6.0.
- [Release notes](https://github.com/dcastil/tailwind-merge/releases)
- [Commits](https://github.com/dcastil/tailwind-merge/compare/v3.4.1...v3.6.0)

---
updated-dependencies:
- dependency-name: tailwind-merge
  dependency-version: 3.6.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-06-09 14:29:27 +07:00
dependabot[bot]
6cacd12dcc
build(deps-dev): bump vite-plugin-pwa from 1.2.0 to 1.3.0 in /frontend (#2407)
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.2.0 to 1.3.0.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.2.0...v1.3.0)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.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-06-09 14:28:18 +07:00
René Aaron
d2cd4a5ed2
fix: change first payment checklist item to receive-only (#2393) (#2394)
Some checks are pending
Multiplatform Docker build & push / build (push) Waiting to run
Code quality - linting and typechecking / linting (push) Waiting to run
Backend testing with Postgres / test-postgres (push) Waiting to run
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.
2026-06-04 17:45:42 +07:00
René Aaron
d36f050a11
feat: show progress while exporting transactions (#2396)
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
2026-06-04 17:36:47 +07:00
René Aaron
2af517d577
chore: remove redundant Alby Account, Go and Extension home cards (#2392)
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.
2026-06-04 16:05:12 +07:00
dependabot[bot]
e042e01fb7
build(deps-dev): bump typescript-eslint from 8.59.2 to 8.60.1 in /frontend (#2352)
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.59.2 to 8.60.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.60.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.59.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-06-04 15:25:36 +07:00
dependabot[bot]
feb4aef935
build(deps-dev): bump @vitejs/plugin-react-swc from 4.3.0 to 4.3.1 in /frontend (#2353)
build(deps-dev): bump @vitejs/plugin-react-swc in /frontend

Bumps [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react-swc) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/v4.3.1/packages/plugin-react-swc)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react-swc"
  dependency-version: 4.3.1
  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-06-04 15:13:52 +07:00
dependabot[bot]
89deef164d
build(deps-dev): bump @types/node from 25.6.2 to 25.8.0 in /frontend (#2355)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.6.2 to 25.8.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.8.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-06-04 14:52:39 +07:00
dependabot[bot]
94332c617d
build(deps-dev): bump tailwindcss from 4.2.4 to 4.3.0 in /frontend (#2356)
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.2.4 to 4.3.0.
- [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.3.0/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.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-06-04 14:48:54 +07:00
Roland
84e56a23db
feat: bark backend (#2374)
* feat: bark backend

* fix: use real preimage

* fix: balance shows as 0 on startup after hours offline period

* chore: add bark-specific warnings to setup security page

* chore: update setup security page

* chore: use notifications instead of polling

* feat: bark sub-wallet support

* fix: tests

* feat: add env variables for mainnet support

* chore: add custom node commands for debugging, log next notification

* fix: notification handling

* fix: fees for outgoing payments, pending payment handling, decrease required tx confirmations

* chore: bump bark version

* chore: use better bark image

* fix: back button logic and imported mnemonic state in onboarding flow

* chore: update bark copy on security page

* chore: improve copy for first transaction checklist item

* fix: backup copy based on backend

* fix: remove unused/unnecessary code
2026-06-04 11:57:29 +07:00
René Aaron
56b1ce895f
feat: add Pi agent to AI page (#2388)
Some checks failed
Multiplatform Docker build & push / build (push) Has been cancelled
Code quality - linting and typechecking / linting (push) Has been cancelled
Backend testing with Postgres / test-postgres (push) Has been cancelled
Closes #2387
2026-06-02 17:15:29 +07:00
saunter
23dccc6c6f
feat: stories (#2172)
* 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>
2026-06-02 10:50:15 +02:00
René Aaron
81b1b2f695
fix: prevent scrollbar on incoming capacity page (#2383) 2026-05-29 14:11:09 +02:00
saunter
efee2b85e8
feat: new currency input (#2320)
* feat: add currency input to receive flows

* feat: use currency input in send flows (#2321)

* feat: use currency input in send flows

* feat: use currency input in swap flows (#2322)

* feat: use currency input in swap flows

* feat: add BTC denomination toggle to currency input (#2367)

* feat: add BTC denomination toggle to currency input

* fix: auto switch decimal bitcoin input to BTC

* chore: address feedback on currency input field (#2371)

* chore: address feedback on currency input field

* feat: make currency input units clickable

* fix: separate currency and unit click targets

* fix: remove persistent unit toggle highlight

* fix: tighten currency input unit spacing

* fix: make alternate bitcoin amount clickable

* fix: align context amount unit spacing

---------

Co-authored-by: saunter <68239231+stackingsaunter@users.noreply.github.com>

---------

Co-authored-by: Roland <33993199+rolznz@users.noreply.github.com>

---------

Co-authored-by: Roland <33993199+rolznz@users.noreply.github.com>

---------

Co-authored-by: Roland <33993199+rolznz@users.noreply.github.com>

* fix: tab highlight on currency input field buttons

* fix: undo incorrect copy change

* chore: undo unrelated change

* fix: limit min/max validation to 2 decimal places

* fix: input max amounts and context rows based on whether node has channel management

* fix: rename spending balance to lightning balance

* fix: rename spending balance to lightning balance

* fix: re-add anchor reserve alert to swap page

* fix: remove autocomplete from currency input field

* fix: number of decimals in getModeBound

* fix: remove important tailwind modifier

---------

Co-authored-by: Roland <33993199+rolznz@users.noreply.github.com>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
2026-05-27 23:11:45 +07:00
René Aaron
48ab9efe2c chore: use redotpay referral link on cards page 2026-05-26 14:21:03 +02:00
Roland
318c622887
chore: simplify kyc info on cards page (#2378) 2026-05-26 09:38:25 +02:00
René Aaron
e29fe81eb4
fix: stop prompting for bitcoin: protocol handler on every load (#2369)
* 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>
2026-05-25 20:38:29 +05:30
Roland
4053a4a722
Fix: card page mobile interface (#2377)
* 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>
2026-05-24 22:44:26 +02:00
René Aaron
40dcf11a2b
feat(cards): provider directory routed through the standard app-install flow (#2366)
* 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&currency=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>
2026-05-24 12:22:48 +07:00
René Aaron
d58b9f3ead
fix: show BOLT-12 offer button for CLN backend (#2360)
* 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>
2026-05-23 20:10:02 +07:00
hermes-alby
dd04326f76
chore: remove shut down suggested apps (#2372)
Co-authored-by: Hermes Agent <hermes-agent@users.noreply.github.com>
2026-05-23 15:26:54 +07:00
Roland
4a7123a4b9
Feat: satora rebrand (#2376)
* 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>
2026-05-23 15:26:33 +07:00
René Aaron
3a2f935a75
feat: add Hermes agent to AI page (#2358)
Closes #2357

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:04:35 +02:00
Adithya Vardhan
861662664d
chore: bump react-dom to v19.2.6 to match react version (#2332) 2026-05-11 14:46:30 +05:30
dependabot[bot]
e566f6ac37
build(deps-dev): bump @types/node from 25.6.0 to 25.6.2 in /frontend (#2326)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.6.0 to 25.6.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.6.2
  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-11 14:43:35 +07:00
dependabot[bot]
186f72715c
build(deps): bump tw-animate-css from 1.3.6 to 1.4.0 in /frontend (#2328)
Bumps [tw-animate-css](https://github.com/Wombosvideo/tw-animate-css) from 1.3.6 to 1.4.0.
- [Release notes](https://github.com/Wombosvideo/tw-animate-css/releases)
- [Commits](https://github.com/Wombosvideo/tw-animate-css/compare/v1.3.6...v1.4.0)

---
updated-dependencies:
- dependency-name: tw-animate-css
  dependency-version: 1.4.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-11 14:32:21 +07:00
dependabot[bot]
2e72407327
build(deps-dev): bump typescript-eslint from 8.59.1 to 8.59.2 in /frontend (#2329)
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.59.1 to 8.59.2.
- [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.2/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.59.2
  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-11 14:23:18 +07:00
dependabot[bot]
b9b9882fe1
build(deps): bump react from 19.2.5 to 19.2.6 in /frontend (#2330)
Bumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) from 19.2.5 to 19.2.6.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.6/packages/react)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.2.6
  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-11 14:18:40 +07:00
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