From a597c1d9464665fe55b11af0aac0328a3a645f51 Mon Sep 17 00:00:00 2001 From: Dorian Date: Tue, 21 Jul 2026 23:45:53 +0100 Subject: [PATCH] feat: scan-modal polish, Pine 1.2.0 copy, bitcoind RPC creds off argv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Wallet scan modal: fallback buttons no longer flash on open (spinner while the camera auto-starts, video hidden until live — also kills the Android WebView play-glyph), decode rate 10/s -> 4/s (preview visibly lagged on phones), clear messages for BOLT12 offers and LNURL/lightning addresses (unsupported by the LND backend; full LNURL-pay is a queued feature), zero-amount invoices in BIP21 URIs prefill from amount=. - Pine 1.2.0: launch-page copy reflects the auto-seeded HA wiring (only speaker pairing stays manual), adds the ask-Archy hint and the silent-answers power-cycle troubleshooting tip (firmware FIFO bug). - bitcoin-core/knots: rpcuser/rpcpassword move from bitcoind argv (world- readable in host ps) to a 0600 config file inside the container tmpfs; the salted txrelay rpcauth hash stays on argv. Catalog regenerated. Co-Authored-By: Claude Fable 5 --- apps/bitcoin-core/manifest.yml | 7 +++- apps/bitcoin-knots/manifest.yml | 7 +++- apps/pine/manifest.yml | 15 +++++--- neode-ui/src/components/WalletScanModal.vue | 42 ++++++++++++++++++--- releases/app-catalog.json | 10 ++--- 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/apps/bitcoin-core/manifest.yml b/apps/bitcoin-core/manifest.yml index 55cbb492..326a7315 100644 --- a/apps/bitcoin-core/manifest.yml +++ b/apps/bitcoin-core/manifest.yml @@ -35,6 +35,9 @@ app: fi; RPC_USER="$(printenv BITCOIN_RPC_USER)"; RPC_PASS="$(printenv BITCOIN_RPC_PASS)"; + RPC_CONF="/tmp/rpc.conf"; + umask 077; + printf "rpcuser=%s\nrpcpassword=%s\n" "$RPC_USER" "$RPC_PASS" > "$RPC_CONF"; RPC_TXRELAY_AUTH="$(printenv BITCOIN_RPC_TXRELAY_RPCAUTH || true)"; DISK_GB_VALUE="$(printenv DISK_GB || true)"; RPC_HEADROOM="-rpcthreads=16 -rpcworkqueue=256"; @@ -43,9 +46,9 @@ app: RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips"; fi; if [ "${DISK_GB_VALUE:-0}" -lt 1000 ]; then - exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -noconf -printtoconsole=0 -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=1024 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser="$RPC_USER" -rpcpassword="$RPC_PASS"; + exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -conf="$RPC_CONF" -printtoconsole=0 -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=1024 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS; else - exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -noconf -printtoconsole=0 -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=4096 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser="$RPC_USER" -rpcpassword="$RPC_PASS"; + exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -conf="$RPC_CONF" -printtoconsole=0 -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=4096 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS; fi derived_env: - key: DISK_GB diff --git a/apps/bitcoin-knots/manifest.yml b/apps/bitcoin-knots/manifest.yml index 4c3f9257..21372b74 100644 --- a/apps/bitcoin-knots/manifest.yml +++ b/apps/bitcoin-knots/manifest.yml @@ -35,6 +35,9 @@ app: fi; RPC_USER="$(printenv BITCOIN_RPC_USER)"; RPC_PASS="$(printenv BITCOIN_RPC_PASS)"; + RPC_CONF="/tmp/rpc.conf"; + umask 077; + printf "rpcuser=%s\nrpcpassword=%s\n" "$RPC_USER" "$RPC_PASS" > "$RPC_CONF"; RPC_TXRELAY_AUTH="$(printenv BITCOIN_RPC_TXRELAY_RPCAUTH || true)"; DISK_GB_VALUE="$(printenv DISK_GB || true)"; RPC_HEADROOM="-rpcthreads=16 -rpcworkqueue=256"; @@ -43,9 +46,9 @@ app: RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips"; fi; if [ "${DISK_GB_VALUE:-0}" -lt 1000 ]; then - exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -noconf -printtoconsole=0 -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=2048 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser="$RPC_USER" -rpcpassword="$RPC_PASS"; + exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -conf="$RPC_CONF" -printtoconsole=0 -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=2048 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS; else - exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -noconf -printtoconsole=0 -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=4096 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser="$RPC_USER" -rpcpassword="$RPC_PASS"; + exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -conf="$RPC_CONF" -printtoconsole=0 -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=4096 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS; fi derived_env: - key: DISK_GB diff --git a/apps/pine/manifest.yml b/apps/pine/manifest.yml index 3785ce2f..4f690234 100644 --- a/apps/pine/manifest.yml +++ b/apps/pine/manifest.yml @@ -1,7 +1,7 @@ app: id: pine name: Pine - version: "1.1.1" + version: "1.2.0" description: A private voice assistant for your home. Pine runs speech-to-text (Whisper) and text-to-speech (Piper) on your own node and pairs with a PineVoice satellite speaker, so Home Assistant Assist works locally with nothing sent to the cloud. category: home @@ -174,10 +174,15 @@ app:
Ready. Click the button, then pick “PineVoice” in the Bluetooth popup.
-

After WiFi joins, add the speaker to Home Assistant: - Settings → Devices & services → Add Wyoming Protocol, host = - the speaker’s IP, port 10700, then pick an Assist pipeline using - Whisper + Piper. Wake word: “Hey Jarvis.”

+

After WiFi joins, one manual step remains — pair the + speaker in Home Assistant: Settings → Devices & services → + Add Wyoming Protocol, host = the speaker’s IP, port + 10700. Whisper, Piper and the Assist pipeline are wired up + automatically when Pine installs. Wake word: “Hey Jarvis.” + You can also ask node things like “what’s the block height?”

+

Troubleshooting: if it hears you (LED reacts) but answers + are silent, unplug and replug the speaker — an interrupted answer can + wedge its audio output until it reboots.

\n\n\n" + "content": "\n\n\n \n \n Pine \u2014 connect your speaker\n \n\n\n
\n
\n \n \n \n \n \n \n

Pine

\n

Connect your speaker \u2014 everything stays on your node.

\n
\n\n
\n
Whisperspeech-to-text ready on :10300
\n
Pipertext-to-speech ready on :10200
\n
Speakerput it in pairing mode \u2014 ring LED blinking yellow
\n
\n\n
\n This page isn\u2019t running over HTTPS, so the browser blocks Bluetooth.\n Open it via its https://\u2026:10380 address (accept the self-signed\n certificate) and the button below will work.\n
\n\n
\n \n \n \n \n \n
Ready. Click the button, then pick \u201cPineVoice\u201d in the Bluetooth popup.
\n
\n\n

After WiFi joins, one manual step remains \u2014 pair the\n speaker in Home Assistant: Settings \u2192 Devices & services \u2192\n Add Wyoming Protocol, host = the speaker\u2019s IP, port\n 10700. Whisper, Piper and the Assist pipeline are wired up\n automatically when Pine installs. Wake word: \u201cHey Jarvis.\u201d\n You can also ask node things like \u201cwhat\u2019s the block height?\u201d

\n

Troubleshooting: if it hears you (LED reacts) but answers\n are silent, unplug and replug the speaker \u2014 an interrupted answer can\n wedge its audio output until it reboots.

\n
\n\n \n\n\n" } ], "health_check": { -- 2.47.2