archy/neode-ui/src/views/marketplace/marketplaceData.ts
Dorian b0907c48b2 feat: NostrVPN mesh + VPN card UI + nvpn v0.3.7
- VPN card: relay URLs, device management, invite QR, add participant
- Backend: vpn.invite, vpn.add-participant, vpn.peer-config RPCs
- nvpn v0.3.7 system service (fixes event processing bug in v0.3.4)
- First-boot: auto-configure nvpn with node identity and endpoint
- Service: AF_NETLINK for WireGuard, NoNewPrivileges=no for sudo wg
- TASK-50: networking stack reliability from first install

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 15:00:00 +02:00

561 lines
21 KiB
TypeScript

/**
* Marketplace data: curated app list, categorization, aliases, and tier logic.
* Extracted from Marketplace.vue to keep the view under 500 lines.
*/
export interface MarketplaceApp {
id: string
title?: string
version?: string
description?: string | { short?: string; long?: string }
icon?: string
author?: string
dockerImage?: string
manifestUrl?: string
repoUrl?: string
webUrl?: string
category?: string
source?: string
url?: string
s9pkUrl?: string
trustScore?: number
trustTier?: string
relayCount?: number
}
export interface InstallProgress {
id: string
title: string
status: 'downloading' | 'installing' | 'starting' | 'complete' | 'error'
progress: number
message: string
attempt: number
}
/** Archipelago app registry — all app images are mirrored here */
const REGISTRY = '80.71.235.15:3000/archipelago'
/** Marketplace app ID -> backend package keys (for "Already Installed" when first-boot/deploy created them) */
export const INSTALLED_ALIASES: Record<string, string[]> = {
mempool: ['mempool-web', 'mempool-api', 'archy-mempool-web', 'archy-mempool-db'],
bitcoin: ['bitcoin-knots'],
btcpay: ['btcpay-server', 'archy-btcpay-db', 'archy-nbxplorer'],
immich: ['immich-server', 'immich-app', 'immich_server', 'immich_postgres', 'immich_redis'],
nextcloud: ['nextcloud-aio', 'nextcloud-server'],
fedimint: ['fedimint-gateway'],
electrumx: ['electrumx', 'archy-electrs-ui'],
grafana: ['grafana'],
jellyfin: ['jellyfin'],
vaultwarden: ['vaultwarden'],
searxng: ['searxng'],
homeassistant: ['homeassistant'],
photoprism: ['photoprism'],
lnd: ['lnd', 'archy-lnd-ui'],
filebrowser: ['filebrowser'],
tailscale: ['tailscale'],
ollama: ['ollama'],
'nostr-vpn': ['nostr-vpn'],
fips: ['fips'],
routstr: ['routstr'],
}
/** Get app tier classification (matches backend get_app_tier) */
export function getAppTier(appId: string): string {
const core = ['bitcoin-knots', 'bitcoin', 'lnd', 'mempool', 'btcpay-server', 'dwn', 'filebrowser']
const recommended = ['fedimint', 'thunderhub', 'vaultwarden', 'uptime-kuma', 'grafana', 'searxng', 'tailscale', 'portainer']
if (core.includes(appId)) return 'core'
if (recommended.includes(appId)) return 'recommended'
return 'optional'
}
/** Categorize community apps based on their ID and description */
export function categorizeCommunityApp(app: MarketplaceApp): string {
if (app.category) return app.category
const id = app.id.toLowerCase()
const title = app.title?.toLowerCase() || ''
const description = (typeof app.description === 'string' ? app.description : (app.description as { short?: string })?.short ?? '').toLowerCase()
const combined = `${id} ${title} ${description}`
if (id.includes('bitcoin') || id.includes('btc') || id.includes('lightning') ||
id.includes('lnd') || id.includes('cln') || id.includes('electr') ||
id.includes('fedimint') || id.includes('cashu') || title.includes('lightning') ||
combined.includes('wallet') || combined.includes('satoshi')) {
return 'money'
}
if (id.includes('btcpay') || id.includes('commerce') || id.includes('shop') ||
id.includes('store') || id.includes('pos') || id.includes('payment') ||
combined.includes('merchant') || combined.includes('invoice')) {
return 'commerce'
}
if (id.includes('cloud') || id.includes('nextcloud') || id.includes('sync') ||
id.includes('storage') || id.includes('backup') || id.includes('file') ||
id.includes('photo') || id.includes('immich') || id.includes('jellyfin') ||
id.includes('plex') || id.includes('media') || id.includes('vault') ||
combined.includes('password manager') || combined.includes('file storage')) {
return 'data'
}
if (id.includes('home-assistant') || id.includes('homeassistant') ||
id.includes('smart-home') || id.includes('automation') || id.includes('iot') ||
combined.includes('home automation') || combined.includes('smart home')) {
return 'home'
}
if (id.includes('nostr') || (id.includes('relay') && combined.includes('nostr')) ||
combined.includes('nostr relay') || combined.includes('nostr client')) {
return 'nostr'
}
if (id.includes('vpn') || id.includes('wireguard') || id.includes('tailscale') ||
id.includes('proxy') || id.includes('dns') || id.includes('pihole') ||
id.includes('adguard') || id.includes('nginx') || id.includes('tor') ||
combined.includes('network') || combined.includes('firewall')) {
return 'networking'
}
if (id.includes('matrix') || id.includes('synapse') || id.includes('element') ||
id.includes('mastodon') || id.includes('lemmy') ||
id.includes('messenger') || id.includes('chat') || id.includes('social') ||
id.includes('cups') || combined.includes('communication') ||
combined.includes('messaging')) {
return 'community'
}
return 'other'
}
/** Curated list of apps with Docker Hub images */
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: `${REGISTRY}/bitcoin-knots:latest`,
manifestUrl: undefined,
repoUrl: 'https://github.com/bitcoinknots/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: `${REGISTRY}/btcpayserver:1.13.7`,
manifestUrl: undefined,
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: `${REGISTRY}/lnd:v0.18.4-beta`,
manifestUrl: undefined,
repoUrl: 'https://github.com/lightningnetwork/lnd'
},
{
id: 'thunderhub',
title: 'ThunderHub',
version: '0.13.31',
description: 'Lightning node management UI. Manage channels, send and receive payments, view routing fees, and monitor your Lightning node.',
icon: '/assets/img/app-icons/thunderhub.svg',
author: 'Anthony Potdevin',
dockerImage: 'docker.io/apotdevin/thunderhub:v0.13.31',
manifestUrl: undefined,
repoUrl: 'https://github.com/apotdevin/thunderhub'
},
{
id: 'mempool',
title: 'Mempool Explorer',
version: '3.0.0',
description: 'Self-hosted Bitcoin blockchain and mempool visualizer with beautiful explorer interface.',
icon: '/assets/img/app-icons/mempool.webp',
author: 'Mempool',
dockerImage: `${REGISTRY}/mempool-frontend:v3.0.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/mempool/mempool'
},
{
id: 'homeassistant',
title: 'Home Assistant',
version: '2024.1',
description: 'Open-source home automation platform. Control and automate your smart home devices privately.',
icon: '/assets/img/app-icons/homeassistant.png',
author: 'Home Assistant',
dockerImage: `${REGISTRY}/home-assistant:2024.1`,
manifestUrl: undefined,
repoUrl: 'https://github.com/home-assistant/core'
},
{
id: 'grafana',
title: 'Grafana',
version: '10.2.0',
description: 'Analytics and monitoring platform. Create dashboards and visualize data from multiple sources.',
icon: '/assets/img/app-icons/grafana.png',
author: 'Grafana Labs',
dockerImage: `${REGISTRY}/grafana:10.2.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/grafana/grafana'
},
{
id: 'searxng',
title: 'SearXNG',
version: '2024.1.0',
description: 'Privacy-respecting metasearch engine. Search without tracking or ads.',
icon: '/assets/img/app-icons/searxng.png',
author: 'SearXNG',
dockerImage: `${REGISTRY}/searxng:latest`,
manifestUrl: undefined,
repoUrl: 'https://github.com/searxng/searxng'
},
{
id: 'ollama',
title: 'Ollama',
version: '0.1.0',
description: 'Run large language models locally. Download and run AI models like Llama, Mistral on your own hardware.',
icon: '/assets/img/app-icons/ollama.png',
author: 'Ollama',
dockerImage: `${REGISTRY}/ollama:latest`,
manifestUrl: undefined,
repoUrl: 'https://github.com/ollama/ollama'
},
{
id: 'cryptpad',
title: 'CryptPad',
version: '2024.12.0',
description: 'End-to-end encrypted documents, spreadsheets, and presentations. Zero-knowledge collaboration.',
icon: '/assets/img/app-icons/cryptpad.webp',
author: 'XWiki SAS',
dockerImage: `${REGISTRY}/cryptpad:2024.12.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/cryptpad/cryptpad'
},
{
id: 'penpot',
title: 'Penpot',
version: '2.4',
description: 'Open-source design and prototyping platform. Self-hosted alternative to Figma.',
icon: '/assets/img/app-icons/penpot.webp',
author: 'Penpot',
dockerImage: 'docker.io/penpotapp/frontend:2.4',
manifestUrl: undefined,
repoUrl: 'https://github.com/penpot/penpot'
},
{
id: 'nextcloud',
title: 'Nextcloud',
version: '28.0',
description: 'Self-hosted cloud storage and collaboration platform. Your own private cloud.',
icon: '/assets/img/app-icons/nextcloud.webp',
author: 'Nextcloud',
dockerImage: `${REGISTRY}/nextcloud:28`,
manifestUrl: undefined,
repoUrl: 'https://github.com/nextcloud/server'
},
{
id: 'vaultwarden',
title: 'Vaultwarden',
version: '1.30.0',
description: 'Self-hosted password manager (Bitwarden-compatible). Secure vault for passwords and secrets.',
icon: '/assets/img/app-icons/vaultwarden.webp',
author: 'Vaultwarden',
dockerImage: `${REGISTRY}/vaultwarden:1.30.0-alpine`,
manifestUrl: undefined,
repoUrl: 'https://github.com/dani-garcia/vaultwarden'
},
{
id: 'jellyfin',
title: 'Jellyfin',
version: '10.8.0',
description: 'Free media server system. Stream your movies, music, and photos to any device.',
icon: '/assets/img/app-icons/jellyfin.webp',
author: 'Jellyfin',
dockerImage: `${REGISTRY}/jellyfin:10.8.13`,
manifestUrl: undefined,
repoUrl: 'https://github.com/jellyfin/jellyfin'
},
{
id: 'photoprism',
title: 'PhotoPrism',
version: '240915',
description: 'AI-powered photo management. Organize and browse photos with facial recognition.',
icon: '/assets/img/app-icons/photoprism.svg',
author: 'PhotoPrism',
dockerImage: `${REGISTRY}/photoprism:240915`,
manifestUrl: undefined,
repoUrl: 'https://github.com/photoprism/photoprism'
},
{
id: 'immich',
title: 'Immich',
version: '1.90.0',
description: 'High-performance self-hosted photo and video backup. Mobile-first with ML features.',
icon: '/assets/img/app-icons/immich.png',
author: 'Immich',
dockerImage: `${REGISTRY}/immich:release`,
manifestUrl: undefined,
repoUrl: 'https://github.com/immich-app/immich'
},
{
id: 'electrumx',
title: 'ElectrumX',
version: '1.18.0',
description: 'Electrum protocol server. Index the blockchain for fast wallet lookups, privately.',
icon: '/assets/img/app-icons/electrumx.webp',
author: 'Luke Childs',
dockerImage: `${REGISTRY}/electrumx:v1.18.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/spesmilo/electrumx'
},
{
id: 'filebrowser',
title: 'File Browser',
version: '2.27.0',
description: 'Web-based file manager. Browse, upload, and manage files through a web interface.',
icon: '/assets/img/app-icons/file-browser.webp',
author: 'File Browser',
dockerImage: `${REGISTRY}/filebrowser:v2.27.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/filebrowser/filebrowser'
},
{
id: 'nginx-proxy-manager',
title: 'Nginx Proxy Manager',
version: '2.11.0',
description: 'Easy proxy management with SSL. Beautiful web interface for managing reverse proxies.',
icon: '/assets/img/app-icons/nginx.svg',
author: 'Nginx Proxy Manager',
dockerImage: `${REGISTRY}/nginx-proxy-manager:latest`,
manifestUrl: undefined,
repoUrl: 'https://github.com/NginxProxyManager/nginx-proxy-manager'
},
{
id: 'portainer',
title: 'Portainer',
version: '2.19.0',
description: 'Container management UI. Manage Docker containers through a beautiful web interface.',
icon: '/assets/img/app-icons/portainer.webp',
author: 'Portainer',
dockerImage: `${REGISTRY}/portainer:latest`,
manifestUrl: undefined,
repoUrl: 'https://github.com/portainer/portainer'
},
{
id: 'uptime-kuma',
title: 'Uptime Kuma',
version: '1.23.0',
description: 'Self-hosted monitoring tool. Monitor uptime for HTTP(s), TCP, DNS, and more.',
icon: '/assets/img/app-icons/uptime-kuma.webp',
author: 'Uptime Kuma',
dockerImage: `${REGISTRY}/uptime-kuma:1`,
manifestUrl: undefined,
repoUrl: 'https://github.com/louislam/uptime-kuma'
},
{
id: 'tailscale',
title: 'Tailscale',
version: '1.78.0',
description: 'Zero-config VPN for secure remote access. Connect all your devices with WireGuard mesh network.',
icon: '/assets/img/app-icons/tailscale.webp',
author: 'Tailscale',
dockerImage: `${REGISTRY}/tailscale:stable`,
manifestUrl: undefined,
repoUrl: 'https://github.com/tailscale/tailscale'
},
{
id: 'fedimint',
title: 'Fedimint',
version: '0.10.0',
description: 'Federated Bitcoin mint with built-in Guardian UI. Private, scalable Bitcoin through federated guardians.',
icon: '/assets/img/app-icons/fedimint.png',
author: 'Fedimint',
dockerImage: `${REGISTRY}/fedimintd:v0.10.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/fedimint/fedimint'
},
{
id: 'indeedhub',
title: 'Indeehub',
version: '0.1.0',
description: 'Bitcoin documentary streaming platform with Nostr identity sign-in. Stream God Bless Bitcoin and other educational content about sovereignty and decentralized technology.',
icon: '/assets/img/app-icons/indeedhub.png',
author: 'Indeehub Team',
dockerImage: 'localhost/indeedhub:latest',
manifestUrl: undefined,
repoUrl: 'https://github.com/indeedhub/indeedhub'
},
{
id: 'dwn',
title: 'Decentralized Web Node',
version: '0.4.0',
description: 'Store and sync your personal data across devices using decentralized web node protocols. Own your data with DID-based access control.',
icon: '/assets/img/app-icons/dwn.svg',
author: 'TBD',
dockerImage: `${REGISTRY}/dwn-server:main`,
manifestUrl: undefined,
repoUrl: 'https://github.com/TBD54566975/dwn-server'
},
{
id: 'nostr-vpn',
title: 'Nostr VPN',
version: '0.3.7',
category: 'networking',
description: 'Tailscale-style mesh VPN with Nostr control plane. Peer discovery and key exchange over relays, WireGuard tunnels.',
icon: '/assets/img/app-icons/nostr-vpn.svg',
author: 'Martti Malmi',
dockerImage: `${REGISTRY}/nostr-vpn:v0.3.7`,
manifestUrl: undefined,
repoUrl: 'https://github.com/mmalmi/nostr-vpn'
},
{
id: 'fips',
title: 'FIPS',
version: '0.1.0',
category: 'networking',
description: 'Free Internetworking Peering System. Self-organizing encrypted mesh network with Nostr identity.',
icon: '/assets/img/app-icons/fips.svg',
author: 'Jim Corgan',
dockerImage: `${REGISTRY}/fips:v0.1.0`,
manifestUrl: undefined,
repoUrl: 'https://github.com/jmcorgan/fips'
},
{
id: 'routstr',
title: 'Routstr',
version: '0.4.3',
category: 'community',
description: 'Decentralized AI inference proxy. Pay-per-request with Cashu ecash, provider discovery via Nostr.',
icon: '/assets/img/app-icons/routstr.svg',
author: 'Routstr',
dockerImage: `${REGISTRY}/routstr:v0.4.3`,
manifestUrl: undefined,
repoUrl: 'https://github.com/routstr/routstr-core'
},
{
id: 'nostrudel',
title: 'noStrudel',
version: '0.40.0',
category: 'nostr',
description: 'A feature-rich Nostr web client with NIP-07 signer support. Browse your feed, post notes, manage relays, and interact with the Nostr network — all signed with your node\'s Nostr identity.',
icon: '/assets/img/app-icons/nostrudel.svg',
author: 'hzrd149',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://github.com/hzrd149/nostrudel',
webUrl: 'https://nostrudel.ninja'
},
{
id: 'nostr-rs-relay',
title: 'Nostr Relay',
version: '0.9.0',
category: 'nostr',
description: 'Run your own Nostr relay. Store your events locally, relay for friends, and publish over Tor. A sovereign relay for your sovereign node.',
icon: '/assets/img/app-icons/nostr-rs-relay.svg',
author: 'scsiblade',
dockerImage: 'docker.io/scsibug/nostr-rs-relay:0.9.0',
manifestUrl: undefined,
repoUrl: 'https://sr.ht/~gheartsfield/nostr-rs-relay/'
},
{
id: 'botfights',
title: 'BotFights',
version: '1.0.0',
description: 'AI bot arena — build, train, and battle autonomous agents. Compete in strategy tournaments with your own coded bots.',
icon: '/assets/img/app-icons/botfights.svg',
author: 'BotFights',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://botfights.net',
webUrl: 'https://botfights.net'
},
{
id: 'nwnn',
title: 'Next Web News Network',
version: '1.0.0',
category: 'l484',
description: 'Decentralized news and link aggregator, synchronized from Telegram. Community-curated content on Bitcoin, sovereignty, and decentralized tech.',
icon: '/assets/img/app-icons/nwnn.png',
author: 'L484',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://nwnn.l484.com',
webUrl: 'https://nwnn.l484.com'
},
{
id: '484-kitchen',
title: '484 Kitchen',
version: '1.0.0',
category: 'l484',
description: 'K484 application platform — an internal tool for the L484 network.',
icon: '/assets/img/app-icons/484-kitchen.png',
author: 'L484',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://484.kitchen',
webUrl: 'https://484.kitchen'
},
{
id: 'call-the-operator',
title: 'Call the Operator',
version: '1.0.0',
category: 'l484',
description: 'Escape the Matrix — a portal for exploring decentralized alternatives and reclaiming digital sovereignty.',
icon: '/assets/img/app-icons/call-the-operator.png',
author: 'TX1138',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://cta.tx1138.com',
webUrl: 'https://cta.tx1138.com'
},
{
id: 'arch-presentation',
title: 'Arch Presentation',
version: '1.0.0',
category: 'l484',
description: 'Archipelago: The Future of Decentralized Infrastructure — an interactive presentation about the Archipelago project vision.',
icon: '/assets/img/app-icons/arch-presentation.png',
author: 'L484',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://present.l484.com',
webUrl: 'https://present.l484.com'
},
{
id: 'syntropy-institute',
title: 'Syntropy Institute',
version: '1.0.0',
category: 'l484',
description: 'Medicine Reimagined — Manual Kinetics, Syntropy Frequency analysis-therapy, digital homeopathy, and concierge protocols.',
icon: '/assets/img/app-icons/syntropy-institute.png',
author: 'Syntropy Institute',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://syntropy.institute',
webUrl: 'https://syntropy.institute'
},
{
id: 't-zero',
title: 'T-0',
version: '1.0.0',
category: 'l484',
description: 'Documentary series exploring decentralization, Bitcoin, and the mavericks building the ungovernable future. Conversations with the builders, powered by Nostr.',
icon: '/assets/img/app-icons/t-zero.png',
author: 'T-0',
dockerImage: '',
manifestUrl: undefined,
repoUrl: 'https://teeminuszero.net',
webUrl: 'https://teeminuszero.net'
}
]
}