* 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>
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>
* 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>
* 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>
* 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>
* 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>
* 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>
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>
* 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>
* 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>
* 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>
* feat: add Sats4AI to app store
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: pad Sats4AI logo to square
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(frontend): use npx skills add for agent skill install prompts
Agents WebFetch the GitHub URL and summarize the skill content, losing
important details. Switch to `npx -y skills add` commands which install
the skill directly, matching the pattern already used for payments-skill.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(frontend): use npx skills add for Bitrefill skill prompt too
Bitrefill is also on the skills registry as bitrefill/agents.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add both Sat and Msat companion fields for all ambiguous balance/amount properties
* feat: add sat and msat companion fields to backend API responses
* chore: align frontend types and other missing fields
* chore: keep old formula for calculating total fee sat
* chore: remove unnecessary balance assignments in cashu and phoenix
* chore: add deprecated comment to non unit fields
* chore: rename callers and variable to specify units
* chore: remove msat fields for channel size and liquidity fields
* chore: drop msat fields from onchain channel size and liquidity responses
* chore: further changes
* chore: remove amount msat field onchain tx
* chore: remove msats from onchain balance response
* chore: remove msat fields for swaps
* chore: remove msat fields for punishment reserves
* chore: simplify rebalancing fee calculation
* chore: remove unnecessary fields
* chore: mark deprecated fields in frontend types
---------
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
* feat(frontend): improve wallet page balance layout
Center the wallet balance area and tune spacing for a cleaner visual rhythm.
Move secondary actions to the header as ghost buttons and use a vertical more icon.
Made-with: Cursor
* feat(frontend): refine wallet header actions on mobile
Move wallet secondary actions into the mobile overflow menu and add Recurring.
Also remove the ZapPlanner card from Home to avoid duplicate entry points.
Made-with: Cursor
* refactor(frontend): separate wallet actions, add ProDropdownMenuItem and AlertAction
- Extract wallet navigation (Swap, Recurring, Buy) into dedicated WalletActionsMenu component
- Revert TransactionsListMenu to single-purpose (export transactions only)
- Move CSV export logic to shared transactions-utils
- Add ProDropdownMenuItem for reusable pro-gated dropdown items with consistent Pro badge
- Add AlertAction component to alert system for proper action button placement
- Use controlled mode in UpgradeDialog to avoid DialogTrigger data-slot conflicts
- Replace inline upgrade gating in Channels (Set Node Alias) and Settings (themes)
- Theme select now opens UpgradeDialog instead of disabling paid items
- Use AlertAction in SubwalletList for upgrade prompt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor(frontend): consolidate export into WalletActionsMenu
Show wallet actions (Swap, Recurring, Buy) only on mobile,
Export Transactions on all breakpoints — removes the separate
TransactionsListMenu from the wallet page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(frontend): sanitize CSV export and fix subwallet upgrade copy
Prevent CSV formula injection by prepending a single quote to values
starting with =, +, -, or @. Fix grammar in sub-wallet upgrade prompt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(frontend): center fiat amount skeleton on wallet page
Co-Authored-By: Claude Opus 4.6 (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>
* feat(frontend): improve wallet page balance layout
Center the wallet balance area and tune spacing for a cleaner visual rhythm.
Move secondary actions to the header as ghost buttons and use a vertical more icon.
Made-with: Cursor
* fix: no important modifiers
* fix: remove important modifiers
* fix: use ghost for both occurrences
* fix: screenreader
* fix: center fiat amount skeleton on wallet page
Co-Authored-By: Claude Opus 4.6 (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>
* feat: ai
* fix: review feedback
* fix: new tabs, install via prompt
* fix: cleanup
* fix: visual improvements
* fix: connection names
* fix: cursor
* fix: copy
* fix: optimize images
* fix: agent card
* fix: cursor logo
* fix: avatar rounding
* fix: class
* fix: link with tab handling
* fix: example prompts, claude code using skill
* fix: capabilities
* feat: share connection instructions
* fix: mange + explore ai apps
* fix: always create a new connection
* fix: use externallink, cleanup
* fix: improved hero copy
* fix: copy
* fix: apply CodeRabbit auto-fixes
Fixed 1 file(s) based on 2 unresolved review comments.
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
* fix: formatting
* fix: openclaw description
* fix: dim card classes
* fix: use tailwind divide classes
* fix: stop cursor blinking in header
* feat: use CLI auth flow for agent wallet onboarding
Replace connection secret embedding with @getalby/cli auth command
for CLI-based agents. The auth flow generates keys locally so the
secret never leaves the device or gets sent to the AI model.
- Generic agents skip connection creation, show auth prompt immediately
- Claude Code and Goose CLI tabs use auth instead of secret/MCP config
- Claude Web/Desktop and Goose Desktop still use MCP URLs as before
- "Waiting for agent to connect" only shown for MCP-based agents
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: simplify AI agent onboarding with CLI auth flow
- Use @getalby/cli auth for all CLI agents instead of embedding
connection secrets in prompts — keys stay local, never sent to AI
- Split Claude dropdown into "Claude Code" (auth prompt) and
"Claude Web/Desktop" (MCP setup via /apps/new)
- Goose uses generic auth prompt (no dedicated setup page needed)
- Remove Goose internal-app page/route (no longer linked)
- Remove standalone ClaudeConnectionInstructions and
GooseConnectionInstructions components (inlined into consumers)
- Add agent logo map in AppAvatar for connections without full
app store entries (goose, openclaw, cursor, codex, cline, opencode)
- Remove Goose from app store (prevents 404 on internal redirect)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add gemini, update mcp link
* fix: clarify Claude connector instructions (#2216)
fix: update Claude connector setup wording
Align Claude Web/Desktop steps with current Connectors labels and MCP URL wording.
Made-with: Cursor
Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: inline MCP setup on AI page, remove Claude internal-app
- Add generic McpSetup component for inline MCP URL connection
creation (reusable for future agents with MCP support)
- Claude entry gets mcpInstructions for Web/Desktop connector setup
- Remove /internal-apps/claude page and route
- Remove Claude from app store, add to agentLogos map
- Support subfolder installs in auth prompt hub URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: update inspiration prompts and copy
- Add service names to prompts (bitrefill.com, ppq.ai, unhuman.store)
- Add "Creative" category with image generation + print-on-demand
- Replace weak automation example with spending analysis
- Rename heading to "What can your agent do?"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: improve AI page prompt cards UX
Make inspiration prompts clickable to copy (matching connect card),
use ChevronRightIcon consistently, and add discovery prompt to Services.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: update Services prompt to podcast search example
Replace untestable "bitcoin price data" prompt with a working
discover→fetch example using Pull That Up Jamie podcast search.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: use npx skills add for agent onboarding prompts
WebFetch summarizes SKILL.md content, losing critical details. Switch
to `npx -y skills add getAlby/bitcoin-payments-skill` which downloads
the full skill file via GitHub without summarization.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: update prompts
* fix: update skill install command to use correct repo name
The repo was renamed from getAlby/bitcoin-payments-skill to
getAlby/payments-skill.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: add -y flag to skill install prompts for non-interactive install
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: redirect to app detail page after connection is established
After approving a new app connection, redirect to /apps/:id instead of
the apps list so the user sees the app they just created.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: match agent logos by app name fallback
When app_store_app_id metadata is not set, fall back to matching the
app name against the agent logos map so agent apps created via auth
show proper icons without needing app store entries.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: saunter <68239231+stackingsaunter@users.noreply.github.com>