diff --git a/app-catalog/catalog.json b/app-catalog/catalog.json index 8029a456..f9e2caa8 100644 --- a/app-catalog/catalog.json +++ b/app-catalog/catalog.json @@ -1,6 +1,6 @@ { "version": 2, - "updated": "2026-04-12T00:00:00Z", + "updated": "2026-04-22T00:00:00Z", "registry": "git.tx1138.com/lfg2025", "featured": { "id": "indeedhub", @@ -18,6 +18,14 @@ "dockerImage": "git.tx1138.com/lfg2025/bitcoin-knots:latest", "repoUrl": "https://github.com/bitcoinknots/bitcoin" }, + { + "id": "bitcoin-core", "title": "Bitcoin Core", "version": "28.4", + "description": "Reference implementation of the Bitcoin protocol. Run a full node validating and relaying blocks.", + "icon": "/assets/img/app-icons/bitcoin-core.svg", + "author": "Bitcoin Core contributors", "category": "money", "tier": "optional", + "dockerImage": "bitcoin/bitcoin:28.4", + "repoUrl": "https://github.com/bitcoin/bitcoin" + }, { "id": "lnd", "title": "LND", "version": "0.18.4", "description": "Lightning Network Daemon. Fast Bitcoin payments through Lightning.", diff --git a/core/Cargo.lock b/core/Cargo.lock index c6f934ad..367f9e4d 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.35-alpha" +version = "1.7.36-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 7ba26acb..8e318633 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.35-alpha" +version = "1.7.36-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/core/archipelago/src/api/handler/mod.rs b/core/archipelago/src/api/handler/mod.rs index d0ffacf9..56d6da11 100644 --- a/core/archipelago/src/api/handler/mod.rs +++ b/core/archipelago/src/api/handler/mod.rs @@ -115,14 +115,41 @@ impl ApiHandler { /// Server-side fetch of the upstream app catalog so the browser can /// load it without fighting CORS (git.tx1138.com emits no ACAO) or - /// CSP (the fallback IP-port URL isn't in `connect-src`). Tries the - /// upstream URLs in the same order the frontend used, returns the - /// first 2xx response. 15s total timeout. - async fn handle_app_catalog_proxy() -> Result> { - const UPSTREAMS: &[&str] = &[ - "http://23.182.128.160:3000/lfg2025/app-catalog/raw/branch/main/catalog.json", - "https://git.tx1138.com/lfg2025/app-catalog/raw/branch/main/catalog.json", - ]; + /// CSP (the fallback IP-port URL isn't in `connect-src`). The upstream + /// list is derived from the operator's configured container registries + /// so switching mirrors in Settings changes the App Store source too — + /// each active registry contributes one Gitea `raw/branch/main/catalog.json` + /// URL (http or https per `tls_verify`), tried in priority order. + /// If registry config can't be loaded, falls back to the legacy + /// hardcoded pair so the App Store still renders on nodes that haven't + /// persisted a registry config yet. 15s total timeout. + async fn handle_app_catalog_proxy(&self) -> Result> { + let mut upstreams: Vec = Vec::new(); + if let Ok(config) = + crate::container::registry::load_registries(&self.config.data_dir).await + { + for reg in config.active_registries() { + let scheme = if reg.tls_verify { "https" } else { "http" }; + // Gitea raw URL: :////app-catalog/raw/branch/main/catalog.json. + // reg.url already includes the namespace (e.g. "host/lfg2025"), + // so we just tack on the repo + raw path. + upstreams.push(format!( + "{}://{}/app-catalog/raw/branch/main/catalog.json", + scheme, reg.url + )); + } + } + if upstreams.is_empty() { + upstreams.push( + "http://23.182.128.160:3000/lfg2025/app-catalog/raw/branch/main/catalog.json" + .to_string(), + ); + upstreams.push( + "https://git.tx1138.com/lfg2025/app-catalog/raw/branch/main/catalog.json" + .to_string(), + ); + } + let client = match reqwest::Client::builder() .timeout(std::time::Duration::from_secs(15)) .build() @@ -136,8 +163,8 @@ impl ApiHandler { )); } }; - for url in UPSTREAMS { - match client.get(*url).send().await { + for url in &upstreams { + match client.get(url).send().await { Ok(resp) if resp.status().is_success() => { if let Ok(bytes) = resp.bytes().await { return Ok(Response::builder() @@ -408,7 +435,7 @@ impl ApiHandler { if !self.is_authenticated(&headers).await { return Ok(Self::unauthorized()); } - Self::handle_app_catalog_proxy().await + self.handle_app_catalog_proxy().await } // LND connect info — nginx validates session cookie (presence check), diff --git a/neode-ui/package-lock.json b/neode-ui/package-lock.json index 0d619a1a..e056e49a 100644 --- a/neode-ui/package-lock.json +++ b/neode-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "neode-ui", - "version": "1.6.0-alpha", + "version": "1.7.36-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "neode-ui", - "version": "1.6.0-alpha", + "version": "1.7.36-alpha", "dependencies": { "@types/dompurify": "^3.0.5", "@vue-leaflet/vue-leaflet": "^0.10.1", diff --git a/neode-ui/package.json b/neode-ui/package.json index 40a3b1f3..4f27614d 100644 --- a/neode-ui/package.json +++ b/neode-ui/package.json @@ -1,7 +1,7 @@ { "name": "neode-ui", "private": true, - "version": "1.7.35-alpha", + "version": "1.7.36-alpha", "type": "module", "scripts": { "start": "./start-dev.sh", diff --git a/neode-ui/public/assets/img/app-icons/bitcoin-core.svg b/neode-ui/public/assets/img/app-icons/bitcoin-core.svg new file mode 100644 index 00000000..74fb0304 --- /dev/null +++ b/neode-ui/public/assets/img/app-icons/bitcoin-core.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/neode-ui/public/catalog.json b/neode-ui/public/catalog.json index 9946ba78..06fe281b 100644 --- a/neode-ui/public/catalog.json +++ b/neode-ui/public/catalog.json @@ -22,6 +22,18 @@ "category": "money", "tier": "core" }, + { + "id": "bitcoin-core", + "title": "Bitcoin Core", + "version": "28.4", + "description": "Reference implementation of the Bitcoin protocol. Run a full node validating and relaying blocks on the Bitcoin network.", + "icon": "/assets/img/app-icons/bitcoin-core.svg", + "author": "Bitcoin Core contributors", + "dockerImage": "bitcoin/bitcoin:28.4", + "repoUrl": "https://github.com/bitcoin/bitcoin", + "category": "money", + "tier": "optional" + }, { "id": "lnd", "title": "LND", diff --git a/neode-ui/src/views/discover/curatedApps.ts b/neode-ui/src/views/discover/curatedApps.ts index 36809aa2..539ea621 100644 --- a/neode-ui/src/views/discover/curatedApps.ts +++ b/neode-ui/src/views/discover/curatedApps.ts @@ -77,6 +77,7 @@ export async function fetchAppCatalog(): Promise { export function getCuratedAppList(): MarketplaceApp[] { return [ { id: 'bitcoin-knots', title: 'Bitcoin Knots', version: '28.1.0', description: 'Run a full Bitcoin node. Validate and relay blocks and transactions on the Bitcoin network.', icon: '/assets/img/app-icons/bitcoin-knots.webp', author: 'Bitcoin Knots', dockerImage: `${R}/bitcoin-knots:latest`, repoUrl: 'https://github.com/bitcoinknots/bitcoin' }, + { id: 'bitcoin-core', title: 'Bitcoin Core', version: '28.4', description: 'Reference implementation of the Bitcoin protocol. Run a full node validating and relaying blocks on the Bitcoin network.', icon: '/assets/img/app-icons/bitcoin-core.svg', author: 'Bitcoin Core contributors', dockerImage: 'bitcoin/bitcoin:28.4', repoUrl: 'https://github.com/bitcoin/bitcoin' }, { id: 'btcpay-server', title: 'BTCPay Server', version: '1.13.7', description: 'Self-hosted Bitcoin payment processor. Accept Bitcoin payments without intermediaries or fees.', icon: '/assets/img/app-icons/btcpay-server.png', author: 'BTCPay Server Foundation', dockerImage: `${R}/btcpayserver:1.13.7`, repoUrl: 'https://github.com/btcpayserver/btcpayserver' }, { id: 'lnd', title: 'LND', version: '0.18.4', description: 'Lightning Network Daemon. Fast and cheap Bitcoin payments through the Lightning Network.', icon: '/assets/img/app-icons/lnd.svg', author: 'Lightning Labs', dockerImage: `${R}/lnd:v0.18.4-beta`, repoUrl: 'https://github.com/lightningnetwork/lnd' }, { id: 'mempool', title: 'Mempool Explorer', version: '3.0.0', description: 'Self-hosted Bitcoin blockchain and mempool visualizer. Monitor transactions without revealing your addresses to third parties.', icon: '/assets/img/app-icons/mempool.webp', author: 'Mempool', dockerImage: `${R}/mempool-frontend:v3.0.0`, repoUrl: 'https://github.com/mempool/mempool' }, @@ -164,6 +165,11 @@ export const FEATURED_DEFINITIONS: { desc: 'The foundation of sovereignty. Run a full Bitcoin node to validate every transaction yourself. No trusted third parties. No asking permission. Your node enforces the consensus rules that protect your wealth. Don\'t trust — verify.', tag: 'FULL VALIDATION // ZERO TRUST', }, + { + id: 'bitcoin-core', + desc: 'The reference Bitcoin implementation. Same full-node guarantees as Knots, tracking upstream releases from the Bitcoin Core maintainers. Pick this if you\'d rather run mainline Bitcoin Core than Knots — both validate every block themselves.', + tag: 'REFERENCE CLIENT // ZERO TRUST', + }, { id: 'lnd', desc: 'Lightning-fast payments over the Lightning Network. Open channels, route transactions, and earn routing fees — all from your sovereign node. Instant settlement. Near-zero fees. The future of money, running on your hardware.', diff --git a/releases/manifest.json b/releases/manifest.json index c6de6f23..d834a26a 100644 --- a/releases/manifest.json +++ b/releases/manifest.json @@ -1,28 +1,26 @@ { - "version": "1.7.35-alpha", + "version": "1.7.36-alpha", "release_date": "2026-04-22", "changelog": [ - "Apps that lose internet after a network hiccup now self-heal within 30 minutes. No restart, no reinstall — your node spots the broken egress and cycles its own containers to bring connectivity back. Rolls out automatically on the next update, no action needed.", - "One-click Update button on every app card. When a new version of an app is available, the orange badge you already saw now has a matching button right next to it — no need to open the app details page to trigger the upgrade.", - "Bitcoin Core 28.4 is now available in the App Store (upgraded from 24.0). This is a separate app from Bitcoin Knots, which remains the default Bitcoin node.", - "Your node's identity is now unified across every screen. The DID shown on the Web5 page, the identity labeled 'Node' on the Identities page, and the DID your peers see when they connect to you are guaranteed to match your seed-derived Node DID. The 'Default' entry on Identities is now labeled 'Node' so it's clear which one represents your node itself." + "Bitcoin Core 28.4 is now visible in the App Store and on the Sovereignty Stack, with the Umbrel community icon. Install it any time you'd prefer mainline Bitcoin Core over Knots — both validate every block themselves.", + "The App Store now follows the container registry you select in Settings. If you switch to a private mirror, Discover and Marketplace will pull their catalog from that mirror too — no more hardcoded URL pointing somewhere you don't control." ], "components": [ { "name": "archipelago", - "current_version": "1.7.34-alpha", - "new_version": "1.7.35-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.35-alpha/archipelago", - "sha256": "61a78a445a9b9e232460a4180d7765ad615b9bd0a2c6e99f2d610c9e909ede0c", - "size_bytes": 41101648 + "current_version": "1.7.35-alpha", + "new_version": "1.7.36-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.36-alpha/archipelago", + "sha256": "c2714ef11f0621eca93713bbfd4c3eda1053a4d18ea27be504073099dbcfe906", + "size_bytes": 41108800 }, { - "name": "archipelago-frontend-1.7.35-alpha.tar.gz", - "current_version": "1.7.34-alpha", - "new_version": "1.7.35-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.35-alpha/archipelago-frontend-1.7.35-alpha.tar.gz", - "sha256": "8866c1bb79fbcd56d230ea3fd307c9b77f556602b6b2703dff2793fd8b014534", - "size_bytes": 77005896 + "name": "archipelago-frontend-1.7.36-alpha.tar.gz", + "current_version": "1.7.35-alpha", + "new_version": "1.7.36-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.36-alpha/archipelago-frontend-1.7.36-alpha.tar.gz", + "sha256": "4af6360a0a5f09272685442d90f02f0e47bd887e953946ecd81a11ad3ff8e578", + "size_bytes": 77031992 } ] } diff --git a/releases/v1.7.36-alpha/archipelago b/releases/v1.7.36-alpha/archipelago new file mode 100755 index 00000000..ebcfe7a8 Binary files /dev/null and b/releases/v1.7.36-alpha/archipelago differ diff --git a/releases/v1.7.36-alpha/archipelago-frontend-1.7.36-alpha.tar.gz b/releases/v1.7.36-alpha/archipelago-frontend-1.7.36-alpha.tar.gz new file mode 100644 index 00000000..dd28acd4 Binary files /dev/null and b/releases/v1.7.36-alpha/archipelago-frontend-1.7.36-alpha.tar.gz differ