* fix: remove legacy acceptance of empty unlock password check
CheckUnlockPassword previously treated a missing or empty
UnlockPasswordCheck value as a match — a legacy compatibility path from
before the canary was always written. It now requires the stored value
to be present and to equal the expected string.
StartApp checks for the canary up front and, if it is missing, stops
with a message asking the user to restore from a backup rather than
continuing. A new IsUnlockPasswordCheckSet helper reports whether the
value is present.
keys.Init now returns the error from reading NostrSecretKey instead of
ignoring it, so a read failure aborts instead of generating and saving a
new key.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* chore: add operation context to unlock password check errors
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat: just in time channels with lsps2
* fix: clarify JIT receive channel fee
* fix: fees
* fix: fees 2
* fix: don't show low inbound when LSPS2 is active
* fix: remove the receive limit below the input if LSPS2 is being used
* fix: simplify
* fix: bring back fee % for outgoing
* fix: remove unneeded changes
* fix: typo
* fix: unneeded
* fix: don't show open first channel is LSPS2
* feat: clearer JIT channel fee copy on receive screen
* fix: add LSPS2 var info
* fix: don't duplicate JIT fee hint on create invoice form
* fix: make paymentDone a standard boolean
* fix: update to golang:1.26 in Dockerfile
* feat: read LSPS2 sources from channel suggestions, set minimum receive amount, update guide link
* docs: update LDK_LSPS2_ADDRESSES to be used as an override
* fix: only show minimum jit receive amount on validation error
* fix: add more detail to receive error when receiving low amounts with jit
* fix: do not use JIT when user has public channels
* feat: add option to disable JIT
* fix: isTrusted check, add jit property to event
* fix: do not require node restart for toggling JIT
* chore: simplify JIT alert
* chore: add guide link on node settings JIT description
* feat: fetch the lsp2info to have access to params like minimum/maximum payment size
* refactor: share single learn-more link across JIT fee hint branches
* fix: remove variable amount invoice support
* fix: use lsps2info for min payment size and remove channelPeerSuggestion usage of minimumChannelSize
* fix: only do amount validation according to lsps2Info values if jit is enabled in settings
* feat: add jit first payment fee alert on receive via lightning address
* fix: remove unnecessary conditional
* fix: ensure at least one sat is left over when opening JIT channel
* chore: remove hardcoded suggestions
* chore: rename JIT enabled config variable
* fix: ui checks when JIT is disabled
* fix: amount input validation message
* fix: formatting
---------
Co-authored-by: anon <anon@anon.com>
Co-authored-by: saunter <68239231+stackingsaunter@users.noreply.github.com>
Co-authored-by: fmar <fmar@fmar>
Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* feat: 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>
* feat: add HIDE_UPDATE_BANNER environment variable
Add a new HIDE_UPDATE_BANNER env var that allows platform operators
(e.g. Start9) to suppress the built-in version update banner when
they provide their own update notification mechanism.
When set to true, the "What's New" widget is hidden and the header
banner only shows for VSS migration notices. The version comparison
against the Alby API is skipped entirely.
Closes#2048
* chore: simplify
* chore: undo changes
---------
Co-authored-by: Joel Klabo <max@klabo.world>
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
* chore: add method to return cached config value
* fix: add check for relay urls when starting NWC wallet service
* fix: mocks
* chore: always use cache for config entries
* feat: support multiple relays (WIP)
* fix: multiple NWC url construction for multiple relays
* fix: startup
* chore: update go-nostr to fix pool relay reconnect
* fix: split nip-47 queue info publish event for each relay url
* fix: add relayUrls to dispatched nwc success events
* fix: ensure newly created app info publishing is not blocked by sleep from failed publishes
* feat: multiple relays improvements
- update app deleted and updated consumers to handle multiple relays
- handle multiple relays in healthcheck
- display relay online status in about page
- renaming and improved comments
* chore: simplify error messages
* fix: unnecessary db error log when checking if app has notification permission
* fix: tests
* chore: remove old comment
* fix: app wallet subscription context usage
* feat: rebalance into channel (WIP)
* feat: rebalancing
- add mainnet service URL
- add loading state
- add validation to avoid bad rebalancing
- add rebalance warnings
* chore: improve rebalance dialog copy
* chore: add rebalance endpoint to wails handler
* chore: change fee to 0.2%
* fix: local spendable balance check
* fix: local spendable balance check
* fix: local spendable balance check, close dialog on successful swap
* chore: use min/max for rebalancing amounts rather than errors
* docs: change rebalancing fee copy
* fix: only show rebalance option for channels that are less than half full
* fix: rebalance fee copy
* fix: reload balances after swapping
* feat: specify max channel saturation power of half from env
* feat: add max path count ldk variable to env
* fix: app config types
* chore: change ldk max path count default to 5
* chore: add comment
* fix: use custom mempool url
* chore: return mempool url in info endpoint
* chore: use mempool url from info response in frontend
* chore: remove default mempool url in frontend
* fix: tests
* fix: default currency to usd for new hubs
* chore: default currency to uppercase
* chore: remove uppercase
* feat: add currency to error logs at function level for getBitcoinRate
* chore: use info.currency instead of state variable
* chore: filter out satoshi from fiat currencies
* feat: hide fiat currency if currency is SATS
---------
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* feat: language switcher
* feat: add fiat amount to send and receive instances
* feat: add wails handler to set currency
* chore: improve fiat currency handling
- simplify code
- change api endpoint to update settings rather than just currency
- add missing fiat value on receive invoice page
- allow passing classname to formatted fiat component
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>