From 918fec0af7322ddf013068f84aae1176a8efef91 Mon Sep 17 00:00:00 2001 From: Dorian Date: Sat, 11 Apr 2026 19:59:36 +0100 Subject: [PATCH] feat: promote botfights from web-only to container app Convert botfights from external link to real container app on port 9100. Add manifest, update marketplace/discover/kiosk/session configs, switch registry URLs to git.tx1138.com. Co-Authored-By: Claude Opus 4.6 --- apps/botfights/manifest.yml | 73 +++++++++++++++++++ neode-ui/src/utils/dummyApps.ts | 2 +- neode-ui/src/views/Kiosk.vue | 2 +- .../src/views/appDetails/appDetailsData.ts | 3 +- .../src/views/appSession/appSessionConfig.ts | 2 +- neode-ui/src/views/apps/appsConfig.ts | 10 +-- neode-ui/src/views/discover/curatedApps.ts | 2 +- .../src/views/marketplace/marketplaceData.ts | 6 +- 8 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 apps/botfights/manifest.yml diff --git a/apps/botfights/manifest.yml b/apps/botfights/manifest.yml new file mode 100644 index 00000000..8ab3dd5d --- /dev/null +++ b/apps/botfights/manifest.yml @@ -0,0 +1,73 @@ +app: + id: botfights + name: BotFights + version: 1.0.0 + description: Bot competition arena with 2-player arcade fighting mode. AI bots battle in trivia challenges while humans duke it out with controllers. Built for Bitcoiners. + category: community + + container: + image: git.tx1138.com/lfg2025/botfights:1.0.0 + pull_policy: always + + dependencies: + - storage: 500Mi + + resources: + cpu_limit: 2 + memory_limit: 512Mi + disk_limit: 500Mi + + security: + capabilities: [] + readonly_root: true + no_new_privileges: true + user: 1001 + seccomp_profile: default + network_policy: bridge + apparmor_profile: default + + ports: + - host: 9100 + container: 9100 + protocol: tcp # Web UI + API + + volumes: + - type: bind + source: botfights-data + target: /app/server/data + - type: tmpfs + target: /tmp + options: [rw,noexec,nosuid,size=64m] + + environment: + - NODE_ENV=production + + health_check: + type: http + endpoint: http://localhost:9100 + path: /api/health + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + + interfaces: + main: + name: Web UI + description: Bot arena and arcade fighter with controller support + type: ui + port: 9100 + protocol: http + path: / + + metadata: + author: Dorian + license: MIT + tags: + - bitcoin + - gaming + - arcade + - fighter + - bots + - competition + - controller diff --git a/neode-ui/src/utils/dummyApps.ts b/neode-ui/src/utils/dummyApps.ts index f4dcd596..5494a79e 100644 --- a/neode-ui/src/utils/dummyApps.ts +++ b/neode-ui/src/utils/dummyApps.ts @@ -575,7 +575,7 @@ export const dummyApps: Record = { 'current-dependencies': {}, 'last-backup': null, 'interface-addresses': { - main: { 'tor-address': '', 'lan-address': 'https://botfights.net' } + main: { 'tor-address': '', 'lan-address': 'http://localhost:9100' } }, status: ServiceStatus.Running } diff --git a/neode-ui/src/views/Kiosk.vue b/neode-ui/src/views/Kiosk.vue index 35e48308..08472cd1 100644 --- a/neode-ui/src/views/Kiosk.vue +++ b/neode-ui/src/views/Kiosk.vue @@ -110,7 +110,7 @@ const launchableApps = computed(() => { 'dwn': '/app/dwn/', 'nostr-rs-relay': '/app/nostr-rs-relay/', 'indeedhub': 'http://localhost:8190', - 'botfights': 'https://botfights.net', + 'botfights': 'http://localhost:9100', 'nwnn': 'https://nwnn.l484.com', '484-kitchen': 'https://484.kitchen', 'call-the-operator': 'https://cta.tx1138.com', diff --git a/neode-ui/src/views/appDetails/appDetailsData.ts b/neode-ui/src/views/appDetails/appDetailsData.ts index 828b3e9d..775f5980 100644 --- a/neode-ui/src/views/appDetails/appDetailsData.ts +++ b/neode-ui/src/views/appDetails/appDetailsData.ts @@ -7,7 +7,6 @@ import { PackageState } from '@/types/api' /** Web-only app detection (no container -- external websites) */ export const WEB_ONLY_APP_URLS: Record = { 'indeedhub': `${window.location.protocol}//${window.location.hostname}:7777`, - 'botfights': 'https://botfights.net', 'nwnn': 'https://nwnn.l484.com', '484-kitchen': 'https://484.kitchen', 'call-the-operator': 'https://cta.tx1138.com', @@ -93,7 +92,7 @@ export const APP_URLS: Record = { 'tailscale': { dev: 'http://localhost:8240', prod: 'http://localhost:8240' }, 'lnd': { dev: 'http://localhost:8081', prod: 'http://localhost:8081' }, 'bitcoin-knots': { dev: 'http://localhost:8334', prod: 'http://localhost:8334' }, - 'botfights': { dev: 'https://botfights.net', prod: 'https://botfights.net' }, + 'botfights': { dev: 'http://localhost:9100', prod: 'http://localhost:9100' }, 'nwnn': { dev: 'https://nwnn.l484.com', prod: 'https://nwnn.l484.com' }, '484-kitchen': { dev: 'https://484.kitchen', prod: 'https://484.kitchen' }, 'call-the-operator': { dev: 'https://cta.tx1138.com', prod: 'https://cta.tx1138.com' }, diff --git a/neode-ui/src/views/appSession/appSessionConfig.ts b/neode-ui/src/views/appSession/appSessionConfig.ts index c3609db0..4edfbc8e 100644 --- a/neode-ui/src/views/appSession/appSessionConfig.ts +++ b/neode-ui/src/views/appSession/appSessionConfig.ts @@ -42,6 +42,7 @@ export const APP_PORTS: Record = { 'fips': 8202, 'routstr': 8200, 'indeedhub': 7777, + 'botfights': 9100, 'dwn': 3100, 'endurain': 8080, } @@ -93,7 +94,6 @@ export const HTTPS_PROXY_PATHS: Record = { /** External HTTPS apps -- always loaded directly */ export const EXTERNAL_URLS: Record = { - 'botfights': 'https://botfights.net', 'nwnn': 'https://nwnn.l484.com', '484-kitchen': 'https://484.kitchen', 'call-the-operator': 'https://cta.tx1138.com', diff --git a/neode-ui/src/views/apps/appsConfig.ts b/neode-ui/src/views/apps/appsConfig.ts index 5f3abb30..01164d97 100644 --- a/neode-ui/src/views/apps/appsConfig.ts +++ b/neode-ui/src/views/apps/appsConfig.ts @@ -18,7 +18,7 @@ export const SERVICE_NAMES = new Set([ 'indeedhub-build_postgres_1', 'indeedhub-build_redis_1', 'indeedhub-build_minio_1', 'indeedhub-build_minio-init_1', 'indeedhub-build_relay_1', // L484 web-only apps — parked in Services for now - 'botfights', 'nwnn', '484-kitchen', 'call-the-operator', + 'nwnn', '484-kitchen', 'call-the-operator', 'syntropy-institute', 't-zero', 'arch-presentation', ]) @@ -43,7 +43,7 @@ export const APP_CATEGORY_MAP: Record = { 'nostr-vpn': 'networking', 'fips': 'networking', 'routstr': 'community', 'tailscale': 'networking', 'nginx-proxy-manager': 'networking', 'portainer': 'networking', 'uptime-kuma': 'networking', 'dwn': 'data', - 'botfights': 'l484', 'nwnn': 'l484', '484-kitchen': 'l484', + 'botfights': 'community', 'nwnn': 'l484', '484-kitchen': 'l484', 'call-the-operator': 'l484', 'syntropy-institute': 'l484', 't-zero': 'l484', } @@ -55,7 +55,6 @@ export function getAppCategory(id: string, pkg: PackageDataEntry): string { // Web-only app IDs and their URLs export const WEB_ONLY_APP_URLS: Record = { - 'botfights': 'https://botfights.net', 'nwnn': 'https://nwnn.l484.com', '484-kitchen': 'https://484.kitchen', 'call-the-operator': 'https://cta.tx1138.com', @@ -69,11 +68,6 @@ export function isWebOnlyApp(id: string): boolean { // Web-only apps (no container) -- always show as installed bookmarks export const WEB_ONLY_APPS: Record = { - 'botfights': { - state: 'running' as PackageState, - manifest: { id: 'botfights', title: 'BotFights', version: '1.0.0', description: { short: 'AI bot arena — build, train, and battle autonomous agents', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null }, - 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/botfights.svg' }, - }, 'nwnn': { state: 'running' as PackageState, manifest: { id: 'nwnn', title: 'Next Web News Network', version: '1.0.0', description: { short: 'Decentralized news aggregator, synced from Telegram', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null }, diff --git a/neode-ui/src/views/discover/curatedApps.ts b/neode-ui/src/views/discover/curatedApps.ts index 4a4a8a37..3d28a92b 100644 --- a/neode-ui/src/views/discover/curatedApps.ts +++ b/neode-ui/src/views/discover/curatedApps.ts @@ -33,7 +33,7 @@ export function getCuratedAppList(): MarketplaceApp[] { { 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: `${R}/fips:v0.1.0`, 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: `${R}/routstr:v0.4.3`, repoUrl: 'https://github.com/routstr/routstr-core' }, { id: 'nostrudel', title: 'noStrudel', version: '0.40.0', category: 'nostr', description: 'Feature-rich Nostr web client. Browse feeds, post notes, manage relays with NIP-07.', icon: '/assets/img/app-icons/nostrudel.svg', author: 'hzrd149', dockerImage: '', repoUrl: 'https://github.com/hzrd149/nostrudel', webUrl: 'https://nostrudel.ninja' }, - { id: 'botfights', title: 'BotFights', version: '1.0.0', description: 'AI bot arena — build, train, and battle autonomous agents in strategy tournaments.', icon: '/assets/img/app-icons/botfights.svg', author: 'BotFights', dockerImage: '', repoUrl: 'https://botfights.net', webUrl: 'https://botfights.net' }, + { id: 'botfights', title: 'BotFights', version: '1.0.0', category: 'community', description: 'Bot arena + 2-player arcade fighter with controller support. AI bots battle in trivia, humans duke it out with controllers.', icon: '/assets/img/app-icons/botfights.svg', author: 'BotFights', dockerImage: `${R}/botfights:1.0.0`, repoUrl: 'https://botfights.net' }, { id: 'nwnn', title: 'Next Web News Network', version: '1.0.0', category: 'l484', description: 'Decentralized news aggregator. Community-curated Bitcoin and sovereignty content.', icon: '/assets/img/app-icons/nwnn.png', author: 'L484', dockerImage: '', 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 for the L484 network.', icon: '/assets/img/app-icons/484-kitchen.png', author: 'L484', dockerImage: '', 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 — explore decentralized alternatives and reclaim sovereignty.', icon: '/assets/img/app-icons/call-the-operator.png', author: 'TX1138', dockerImage: '', repoUrl: 'https://cta.tx1138.com', webUrl: 'https://cta.tx1138.com' }, diff --git a/neode-ui/src/views/marketplace/marketplaceData.ts b/neode-ui/src/views/marketplace/marketplaceData.ts index ee12ac31..245c65d2 100644 --- a/neode-ui/src/views/marketplace/marketplaceData.ts +++ b/neode-ui/src/views/marketplace/marketplaceData.ts @@ -470,13 +470,13 @@ export function getCuratedAppList(): MarketplaceApp[] { 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.', + category: 'community', + description: 'Bot arena + 2-player arcade fighter with controller support. AI bots battle in trivia, humans duke it out with controllers.', icon: '/assets/img/app-icons/botfights.svg', author: 'BotFights', - dockerImage: '', + dockerImage: `${REGISTRY}/botfights:1.0.0`, manifestUrl: undefined, repoUrl: 'https://botfights.net', - webUrl: 'https://botfights.net' }, { id: 'nwnn',