diff --git a/apps/README.md b/apps/README.md
index 9cc55b76..05f1cacd 100644
--- a/apps/README.md
+++ b/apps/README.md
@@ -31,7 +31,7 @@ Containerized applications for the Archipelago Bitcoin Node OS. All apps run in
### Custom & External
- **indeedhub** — Bitcoin documentary streaming (custom build)
- **router** — Mesh routing and network management
-- **botfights**, **nwnn**, **484-kitchen**, **call-the-operator**, **arch-presentation**, **syntropy-institute**, **t-zero** — External web apps
+- **botfights** — External web app
## Manifest Format
diff --git a/core/archipelago/src/container/docker_packages.rs b/core/archipelago/src/container/docker_packages.rs
index f99ceb32..5cd5f7cb 100644
--- a/core/archipelago/src/container/docker_packages.rs
+++ b/core/archipelago/src/container/docker_packages.rs
@@ -540,48 +540,6 @@ fn get_app_metadata(app_id: &str) -> AppMetadata {
repo: "https://botfights.net".to_string(),
tier: "",
},
- "nwnn" => AppMetadata {
- title: "Next Web News Network".to_string(),
- description: "Decentralized news and link aggregator, synced from Telegram".to_string(),
- icon: "/assets/img/app-icons/nwnn.png".to_string(),
- repo: "https://nwnn.l484.com".to_string(),
- tier: "",
- },
- "484-kitchen" => AppMetadata {
- title: "484 Kitchen".to_string(),
- description: "K484 application platform".to_string(),
- icon: "/assets/img/app-icons/484-kitchen.png".to_string(),
- repo: "https://484.kitchen".to_string(),
- tier: "",
- },
- "call-the-operator" => AppMetadata {
- title: "Call the Operator".to_string(),
- description: "Escape the Matrix — explore decentralized alternatives".to_string(),
- icon: "/assets/img/app-icons/call-the-operator.png".to_string(),
- repo: "https://cta.tx1138.com".to_string(),
- tier: "",
- },
- "arch-presentation" => AppMetadata {
- title: "Arch Presentation".to_string(),
- description: "Archipelago: The Future of Decentralized Infrastructure".to_string(),
- icon: "/assets/img/app-icons/arch-presentation.png".to_string(),
- repo: "https://present.l484.com".to_string(),
- tier: "",
- },
- "syntropy-institute" => AppMetadata {
- title: "Syntropy Institute".to_string(),
- description: "Medicine Reimagined — frequency analysis-therapy and digital homeopathy".to_string(),
- icon: "/assets/img/app-icons/syntropy-institute.png".to_string(),
- repo: "https://syntropy.institute".to_string(),
- tier: "",
- },
- "t-zero" => AppMetadata {
- title: "T-0".to_string(),
- description: "Documentary series on decentralization, Bitcoin, and the ungovernable future".to_string(),
- icon: "/assets/img/app-icons/t-zero.png".to_string(),
- repo: "https://teeminuszero.net".to_string(),
- tier: "",
- },
_ => AppMetadata {
title: app_id.to_string(),
description: format!("{} application", app_id),
diff --git a/image-recipe/configs/external-app-proxies.conf b/image-recipe/configs/external-app-proxies.conf
deleted file mode 100644
index aa413de1..00000000
--- a/image-recipe/configs/external-app-proxies.conf
+++ /dev/null
@@ -1,63 +0,0 @@
-# External web-only apps — reverse proxy to strip X-Frame-Options for iframe embedding
-# Used by appLauncher.ts EXTERNAL_PROXY_PORT mapping
-# Deployed to /etc/nginx/conf.d/external-app-proxies.conf
-
-# 484 Kitchen (484.kitchen) → port 8902
-server {
- listen 8902;
- server_name _;
- resolver 1.1.1.1 8.8.8.8 valid=300s;
- resolver_timeout 5s;
-
- location / {
- set $upstream_484 https://484.kitchen;
- proxy_pass $upstream_484;
- proxy_http_version 1.1;
- proxy_set_header Host 484.kitchen;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_ssl_name 484.kitchen;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- proxy_connect_timeout 60s;
- proxy_read_timeout 60s;
-
- proxy_redirect https://484.kitchen/ /;
- sub_filter_once off;
- sub_filter_types text/html text/css application/javascript;
- }
-}
-
-# Arch Presentation (present.l484.com) → port 8903
-server {
- listen 8903;
- server_name _;
- resolver 1.1.1.1 8.8.8.8 valid=300s;
- resolver_timeout 5s;
-
- location / {
- set $upstream_present https://present.l484.com;
- proxy_pass $upstream_present;
- proxy_http_version 1.1;
- proxy_set_header Host present.l484.com;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_ssl_name present.l484.com;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- proxy_connect_timeout 60s;
- proxy_read_timeout 60s;
-
- proxy_redirect https://present.l484.com/ /;
- sub_filter_once off;
- sub_filter_types text/html text/css application/javascript;
- }
-}
diff --git a/image-recipe/configs/nginx-archipelago.conf b/image-recipe/configs/nginx-archipelago.conf
index 8ed58f45..2471e875 100644
--- a/image-recipe/configs/nginx-archipelago.conf
+++ b/image-recipe/configs/nginx-archipelago.conf
@@ -844,48 +844,6 @@ server {
# External site proxies — strip X-Frame-Options so iframe embedding works.
# add_header here prevents inheritance of server-level X-Frame-Options.
- location /ext/484-kitchen/ {
- set $upstream_3 "https://484.kitchen/";
-
- proxy_pass $upstream_3;
- proxy_http_version 1.1;
- proxy_set_header Host 484.kitchen;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- add_header X-Content-Type-Options "nosniff" always;
- sub_filter_once off;
- sub_filter_types text/css application/javascript;
- sub_filter 'href="/' 'href="/ext/484-kitchen/';
- sub_filter 'src="/' 'src="/ext/484-kitchen/';
- sub_filter 'action="/' 'action="/ext/484-kitchen/';
- sub_filter "href='/" "href='/ext/484-kitchen/";
- sub_filter "src='/" "src='/ext/484-kitchen/";
- sub_filter '' '';
- }
- location /ext/arch-presentation/ {
- set $upstream_4 "https://present.l484.com/";
-
- proxy_pass $upstream_4;
- proxy_http_version 1.1;
- proxy_set_header Host present.l484.com;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- add_header X-Content-Type-Options "nosniff" always;
- sub_filter_once off;
- sub_filter_types text/css application/javascript;
- sub_filter 'href="/' 'href="/ext/arch-presentation/';
- sub_filter 'src="/' 'src="/ext/arch-presentation/';
- sub_filter 'action="/' 'action="/ext/arch-presentation/';
- sub_filter "href='/" "href='/ext/arch-presentation/";
- sub_filter "src='/" "src='/ext/arch-presentation/";
- sub_filter '' '';
- }
location /ext/nostrudel/ {
set $upstream_5 "https://nostrudel.ninja/";
@@ -1294,48 +1252,6 @@ server {
# External site proxies — strip X-Frame-Options so iframe embedding works.
# add_header here prevents inheritance of server-level X-Frame-Options.
- location /ext/484-kitchen/ {
- set $upstream_8 "https://484.kitchen/";
-
- proxy_pass $upstream_8;
- proxy_http_version 1.1;
- proxy_set_header Host 484.kitchen;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- add_header X-Content-Type-Options "nosniff" always;
- sub_filter_once off;
- sub_filter_types text/css application/javascript;
- sub_filter 'href="/' 'href="/ext/484-kitchen/';
- sub_filter 'src="/' 'src="/ext/484-kitchen/';
- sub_filter 'action="/' 'action="/ext/484-kitchen/';
- sub_filter "href='/" "href='/ext/484-kitchen/";
- sub_filter "src='/" "src='/ext/484-kitchen/";
- sub_filter '' '';
- }
- location /ext/arch-presentation/ {
- set $upstream_9 "https://present.l484.com/";
-
- proxy_pass $upstream_9;
- proxy_http_version 1.1;
- proxy_set_header Host present.l484.com;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- add_header X-Content-Type-Options "nosniff" always;
- sub_filter_once off;
- sub_filter_types text/css application/javascript;
- sub_filter 'href="/' 'href="/ext/arch-presentation/';
- sub_filter 'src="/' 'src="/ext/arch-presentation/';
- sub_filter 'action="/' 'action="/ext/arch-presentation/';
- sub_filter "href='/" "href='/ext/arch-presentation/";
- sub_filter "src='/" "src='/ext/arch-presentation/";
- sub_filter '' '';
- }
location /ext/nostrudel/ {
set $upstream_10 "https://nostrudel.ninja/";
@@ -1373,51 +1289,3 @@ server {
}
}
-# External site reverse proxies — each on its own port so SPAs work at root.
-# Strips X-Frame-Options to allow iframe embedding from Archipelago UI.
-# Injects NIP-07 nostr-provider.js for Nostr login integration.
-server {
- listen 8902;
- server_name _;
- location / {
- set $upstream_12 "https://484.kitchen";
-
- proxy_pass $upstream_12;
- proxy_http_version 1.1;
- proxy_set_header Host 484.kitchen;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- add_header X-Content-Type-Options "nosniff" always;
- sub_filter '' '';
- sub_filter_once on;
- }
- location = /nostr-provider.js {
- alias /opt/archipelago/web-ui/nostr-provider.js;
- }
-}
-
-server {
- listen 8903;
- server_name _;
- location / {
- set $upstream_13 "https://present.l484.com";
-
- proxy_pass $upstream_13;
- proxy_http_version 1.1;
- proxy_set_header Host present.l484.com;
- proxy_set_header Accept-Encoding "";
- proxy_ssl_server_name on;
- proxy_hide_header X-Frame-Options;
- add_header X-Frame-Options "SAMEORIGIN" always;
- proxy_hide_header Content-Security-Policy;
- add_header X-Content-Type-Options "nosniff" always;
- sub_filter '' '';
- sub_filter_once on;
- }
- location = /nostr-provider.js {
- alias /opt/archipelago/web-ui/nostr-provider.js;
- }
-}
diff --git a/neode-ui/public/assets/img/app-icons/484-kitchen.png b/neode-ui/public/assets/img/app-icons/484-kitchen.png
deleted file mode 100644
index 11b881ef..00000000
Binary files a/neode-ui/public/assets/img/app-icons/484-kitchen.png and /dev/null differ
diff --git a/neode-ui/public/assets/img/app-icons/arch-presentation.png b/neode-ui/public/assets/img/app-icons/arch-presentation.png
deleted file mode 100644
index ab221307..00000000
Binary files a/neode-ui/public/assets/img/app-icons/arch-presentation.png and /dev/null differ
diff --git a/neode-ui/public/assets/img/app-icons/call-the-operator.png b/neode-ui/public/assets/img/app-icons/call-the-operator.png
deleted file mode 100644
index 7c1d10c1..00000000
Binary files a/neode-ui/public/assets/img/app-icons/call-the-operator.png and /dev/null differ
diff --git a/neode-ui/public/assets/img/app-icons/nwnn.png b/neode-ui/public/assets/img/app-icons/nwnn.png
deleted file mode 100644
index 45a89511..00000000
Binary files a/neode-ui/public/assets/img/app-icons/nwnn.png and /dev/null differ
diff --git a/neode-ui/public/assets/img/app-icons/syntropy-institute.png b/neode-ui/public/assets/img/app-icons/syntropy-institute.png
deleted file mode 100644
index 34d5739e..00000000
Binary files a/neode-ui/public/assets/img/app-icons/syntropy-institute.png and /dev/null differ
diff --git a/neode-ui/public/assets/img/app-icons/t-zero.png b/neode-ui/public/assets/img/app-icons/t-zero.png
deleted file mode 100644
index 24295b15..00000000
Binary files a/neode-ui/public/assets/img/app-icons/t-zero.png and /dev/null differ
diff --git a/neode-ui/src/stores/__tests__/appLauncher.test.ts b/neode-ui/src/stores/__tests__/appLauncher.test.ts
index c33a4dc3..6d3f99c4 100644
--- a/neode-ui/src/stores/__tests__/appLauncher.test.ts
+++ b/neode-ui/src/stores/__tests__/appLauncher.test.ts
@@ -262,12 +262,12 @@ describe('useAppLauncherStore', () => {
it('opens known prepackaged websites in new tab on desktop when requested', () => {
const store = useAppLauncherStore()
- store.open({ url: 'https://nwnn.l484.com', title: 'Next Web News Network', openInNewTab: true })
+ store.open({ url: 'https://botfights.net', title: 'BotFights', openInNewTab: true })
expect(store.isOpen).toBe(false)
expect(store.panelAppId).toBe(null)
expect(mockWindowOpen).toHaveBeenCalledWith(
- 'https://nwnn.l484.com',
+ 'https://botfights.net',
'_blank',
'noopener,noreferrer',
)
@@ -281,12 +281,12 @@ describe('useAppLauncherStore', () => {
})
const store = useAppLauncherStore()
- store.open({ url: 'https://present.l484.com', title: 'Arch Presentation', openInNewTab: true })
+ store.open({ url: 'https://botfights.net', title: 'BotFights', openInNewTab: true })
// Iframeable prepackaged sites stay in-app via the store panel (no route
// change, no background swap) just like every other mobile launch.
expect(store.isOpen).toBe(false)
- expect(store.panelAppId).toBe('arch-presentation')
+ expect(store.panelAppId).toBe('botfights')
expect(mockWindowOpen).not.toHaveBeenCalled()
expect(mockPush).not.toHaveBeenCalled()
})
diff --git a/neode-ui/src/stores/appLauncher.ts b/neode-ui/src/stores/appLauncher.ts
index 42c96d9f..1ddcbbe4 100644
--- a/neode-ui/src/stores/appLauncher.ts
+++ b/neode-ui/src/stores/appLauncher.ts
@@ -198,7 +198,6 @@ export interface NostrConsentRequest {
reject: () => void
}
-const DISPLAY_MODE_KEY = 'archipelago_app_display_mode'
export const useAppLauncherStore = defineStore('appLauncher', () => {
const isOpen = ref(false)
@@ -330,12 +329,6 @@ export const useAppLauncherStore = defineStore('appLauncher', () => {
// Check external URLs
const EXTERNAL_APP_HOSTS: Record = {
'botfights.net': 'botfights',
- 'nwnn.l484.com': 'nwnn',
- '484.kitchen': '484-kitchen',
- 'cta.tx1138.com': 'call-the-operator',
- 'present.l484.com': 'arch-presentation',
- 'syntropy.institute': 'syntropy-institute',
- 'teeminuszero.net': 't-zero',
'nostrudel.ninja': 'nostrudel',
}
return EXTERNAL_APP_HOSTS[u.hostname] || null
diff --git a/neode-ui/src/utils/dummyApps.ts b/neode-ui/src/utils/dummyApps.ts
index f12cbf0e..a2e9b013 100644
--- a/neode-ui/src/utils/dummyApps.ts
+++ b/neode-ui/src/utils/dummyApps.ts
@@ -508,208 +508,4 @@ export const dummyApps: Record = {
status: ServiceStatus.Running
}
},
- 'nwnn': {
- state: PackageState.Running,
- 'static-files': {
- license: 'MIT',
- instructions: 'Decentralized news aggregator',
- icon: '/assets/img/app-icons/nwnn.png'
- },
- manifest: {
- id: 'nwnn',
- title: 'Next Web News Network',
- version: '1.0.0',
- description: {
- short: 'Decentralized news aggregator, synced from Telegram',
- long: 'Next Web News Network (NWNN) is a decentralized news aggregation platform that curates and syncs content from Telegram channels. Stay informed with the latest developments in Bitcoin, decentralization, and sovereign technology. Clean reading experience with no ads or tracking.'
- },
- 'release-notes': 'Initial release',
- license: 'MIT',
- 'wrapper-repo': '',
- 'upstream-repo': '',
- 'support-site': '',
- 'marketing-site': 'https://nwnn.l484.com',
- website: 'https://nwnn.l484.com',
- 'donation-url': null
- },
- installed: {
- 'current-dependents': {},
- 'current-dependencies': {},
- 'last-backup': null,
- 'interface-addresses': {
- main: { 'tor-address': '', 'lan-address': 'https://nwnn.l484.com' }
- },
- status: ServiceStatus.Running
- }
- },
- '484-kitchen': {
- state: PackageState.Running,
- 'static-files': {
- license: 'MIT',
- instructions: 'K484 application platform',
- icon: '/assets/img/app-icons/484-kitchen.png'
- },
- manifest: {
- id: '484-kitchen',
- title: '484 Kitchen',
- version: '1.0.0',
- description: {
- short: 'K484 application platform',
- long: '484 Kitchen is a creative application platform from the K484 collective. Explore experimental tools, interactive experiences, and cutting-edge web applications built with a focus on sovereignty and decentralization.'
- },
- 'release-notes': 'Initial release',
- license: 'MIT',
- 'wrapper-repo': '',
- 'upstream-repo': '',
- 'support-site': '',
- 'marketing-site': 'https://484.kitchen',
- website: 'https://484.kitchen',
- 'donation-url': null
- },
- installed: {
- 'current-dependents': {},
- 'current-dependencies': {},
- 'last-backup': null,
- 'interface-addresses': {
- main: { 'tor-address': '', 'lan-address': 'https://484.kitchen' }
- },
- status: ServiceStatus.Running
- }
- },
- 'call-the-operator': {
- state: PackageState.Running,
- 'static-files': {
- license: 'MIT',
- instructions: 'Escape the Matrix',
- icon: '/assets/img/app-icons/call-the-operator.png'
- },
- manifest: {
- id: 'call-the-operator',
- title: 'Call the Operator',
- version: '1.0.0',
- description: {
- short: 'Escape the Matrix — explore decentralized alternatives',
- long: 'Call the Operator is an interactive guide to escaping the centralized matrix. Discover decentralized alternatives to mainstream services, learn about self-sovereignty, and take back control of your digital life. Beautiful dreamcore aesthetic with immersive 3D visuals.'
- },
- 'release-notes': 'Initial release',
- license: 'MIT',
- 'wrapper-repo': '',
- 'upstream-repo': '',
- 'support-site': '',
- 'marketing-site': 'https://cta.tx1138.com',
- website: 'https://cta.tx1138.com',
- 'donation-url': null
- },
- installed: {
- 'current-dependents': {},
- 'current-dependencies': {},
- 'last-backup': null,
- 'interface-addresses': {
- main: { 'tor-address': '', 'lan-address': 'https://cta.tx1138.com' }
- },
- status: ServiceStatus.Running
- }
- },
- 'arch-presentation': {
- state: PackageState.Running,
- 'static-files': {
- license: 'MIT',
- instructions: 'Archipelago presentation',
- icon: '/assets/img/app-icons/arch-presentation.png'
- },
- manifest: {
- id: 'arch-presentation',
- title: 'Arch Presentation',
- version: '1.0.0',
- description: {
- short: 'Archipelago: The Future of Decentralized Infrastructure',
- long: 'The official Archipelago presentation deck. Learn about the vision, architecture, and roadmap of the Archipelago Bitcoin Node OS. Interactive slides showcasing the future of decentralized personal infrastructure, self-sovereign computing, and the Web5 stack.'
- },
- 'release-notes': 'Initial release',
- license: 'MIT',
- 'wrapper-repo': '',
- 'upstream-repo': '',
- 'support-site': '',
- 'marketing-site': 'https://present.l484.com',
- website: 'https://present.l484.com',
- 'donation-url': null
- },
- installed: {
- 'current-dependents': {},
- 'current-dependencies': {},
- 'last-backup': null,
- 'interface-addresses': {
- main: { 'tor-address': '', 'lan-address': 'https://present.l484.com' }
- },
- status: ServiceStatus.Running
- }
- },
- 'syntropy-institute': {
- state: PackageState.Running,
- 'static-files': {
- license: 'MIT',
- instructions: 'Frequency analysis and therapy',
- icon: '/assets/img/app-icons/syntropy-institute.png'
- },
- manifest: {
- id: 'syntropy-institute',
- title: 'Syntropy Institute',
- version: '1.0.0',
- description: {
- short: 'Medicine Reimagined — frequency analysis and therapy',
- long: 'Syntropy Institute presents a new paradigm in health and wellness through frequency analysis and therapy. Explore cutting-edge research into bioresonance, quantum biology, and the energetic foundations of health. A bridge between ancient healing wisdom and modern technology.'
- },
- 'release-notes': 'Initial release',
- license: 'MIT',
- 'wrapper-repo': '',
- 'upstream-repo': '',
- 'support-site': '',
- 'marketing-site': 'https://syntropy.institute',
- website: 'https://syntropy.institute',
- 'donation-url': null
- },
- installed: {
- 'current-dependents': {},
- 'current-dependencies': {},
- 'last-backup': null,
- 'interface-addresses': {
- main: { 'tor-address': '', 'lan-address': 'https://syntropy.institute' }
- },
- status: ServiceStatus.Running
- }
- },
- 't-zero': {
- state: PackageState.Running,
- 'static-files': {
- license: 'MIT',
- instructions: 'Documentary series',
- icon: '/assets/img/app-icons/t-zero.png'
- },
- manifest: {
- id: 't-zero',
- title: 'T-0',
- version: '1.0.0',
- description: {
- short: 'Documentary series on decentralization and Bitcoin',
- long: 'T-0 (Tee Minus Zero) is a documentary series exploring the intersection of decentralization, Bitcoin, and personal sovereignty. Follow the stories of builders, dreamers, and freedom advocates creating the infrastructure for a more sovereign future.'
- },
- 'release-notes': 'Initial release',
- license: 'MIT',
- 'wrapper-repo': '',
- 'upstream-repo': '',
- 'support-site': '',
- 'marketing-site': 'https://teeminuszero.net',
- website: 'https://teeminuszero.net',
- 'donation-url': null
- },
- installed: {
- 'current-dependents': {},
- 'current-dependencies': {},
- 'last-backup': null,
- 'interface-addresses': {
- main: { 'tor-address': '', 'lan-address': 'https://teeminuszero.net' }
- },
- status: ServiceStatus.Running
- }
- }
}
diff --git a/neode-ui/src/views/appDetails/appDetailsData.ts b/neode-ui/src/views/appDetails/appDetailsData.ts
index fff63e15..e3af6854 100644
--- a/neode-ui/src/views/appDetails/appDetailsData.ts
+++ b/neode-ui/src/views/appDetails/appDetailsData.ts
@@ -5,14 +5,7 @@
import { PackageState } from '@/types/api'
/** Web-only app detection (no container -- external websites) */
-export const WEB_ONLY_APP_URLS: Record = {
- 'nwnn': 'https://nwnn.l484.com',
- '484-kitchen': 'https://484.kitchen',
- 'call-the-operator': 'https://cta.tx1138.com',
- 'arch-presentation': 'https://present.l484.com',
- 'syntropy-institute': 'https://syntropy.institute',
- 't-zero': 'https://teeminuszero.net',
-}
+export const WEB_ONLY_APP_URLS: Record = {}
/** Map route/marketplace app IDs to backend package keys (container names). */
export const ROUTE_TO_PACKAGE_KEY: Record = {
@@ -90,12 +83,6 @@ export const APP_URLS: Record = {
'lnd': { dev: 'http://localhost:18083', prod: 'http://localhost:18083' },
'bitcoin-knots': { dev: 'http://localhost:8334', prod: 'http://localhost:8334' },
'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' },
- 'arch-presentation': { dev: 'https://present.l484.com', prod: 'https://present.l484.com' },
- 'syntropy-institute': { dev: 'https://syntropy.institute', prod: 'https://syntropy.institute' },
- 't-zero': { dev: 'https://teeminuszero.net', prod: 'https://teeminuszero.net' },
}
/** V3 onion addresses are 56+ chars + .onion. Placeholders like "btcpay.onion" are not real. */
diff --git a/neode-ui/src/views/appSession/appSessionConfig.ts b/neode-ui/src/views/appSession/appSessionConfig.ts
index f9cb888a..9afa4b9a 100644
--- a/neode-ui/src/views/appSession/appSessionConfig.ts
+++ b/neode-ui/src/views/appSession/appSessionConfig.ts
@@ -45,12 +45,6 @@ export const HTTPS_PROXY_PATHS: Record = {
/** External HTTPS apps -- always loaded directly */
export const EXTERNAL_URLS: Record = {
- 'nwnn': 'https://nwnn.l484.com',
- '484-kitchen': 'https://484.kitchen',
- 'call-the-operator': 'https://cta.tx1138.com',
- 'arch-presentation': 'https://present.l484.com',
- 'syntropy-institute': 'https://syntropy.institute',
- 't-zero': 'https://teeminuszero.net',
'nostrudel': 'https://nostrudel.ninja',
}
@@ -58,11 +52,10 @@ export const APP_TITLES: Record = {
...GENERATED_APP_TITLES,
'bitcoin-knots': 'Bitcoin Knots', 'bitcoin-core': 'Bitcoin Core',
'btcpay-server': 'BTCPay Server', 'indeedhub': 'Indeehub',
- 'botfights': 'BotFights', 'gitea': 'Gitea', '484-kitchen': '484 Kitchen', 'arch-presentation': 'Presentation',
+ 'botfights': 'BotFights', 'gitea': 'Gitea',
'homeassistant': 'Home Assistant', 'uptime-kuma': 'Uptime Kuma',
'nginx-proxy-manager': 'Nginx Proxy Manager',
- 'call-the-operator': 'Call The Operator', 'syntropy-institute': 'Syntropy Institute',
- 't-zero': 'T-Zero', 'nostrudel': 'noStrudel',
+ 'nostrudel': 'noStrudel',
}
/** Apps that set X-Frame-Options and MUST open in a new tab (can't iframe) */
diff --git a/neode-ui/src/views/appStoreCategories.ts b/neode-ui/src/views/appStoreCategories.ts
index f5d0797c..ae98d34e 100644
--- a/neode-ui/src/views/appStoreCategories.ts
+++ b/neode-ui/src/views/appStoreCategories.ts
@@ -7,7 +7,6 @@ export const APP_STORE_CATEGORIES = [
{ id: 'data', name: 'Data' },
{ id: 'home', name: 'Home' },
{ id: 'networking', name: 'Networking' },
- { id: 'l484', name: 'L484' },
{ id: 'other', name: 'Other' },
] as const
diff --git a/neode-ui/src/views/apps/appsConfig.ts b/neode-ui/src/views/apps/appsConfig.ts
index dbd58137..ec4ca8da 100644
--- a/neode-ui/src/views/apps/appsConfig.ts
+++ b/neode-ui/src/views/apps/appsConfig.ts
@@ -26,9 +26,6 @@ export const SERVICE_NAMES = new Set([
'indeedhub-relay', 'indeedhub-build_api_1', 'indeedhub-build_ffmpeg-worker_1',
'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
- 'nwnn', '484-kitchen', 'call-the-operator',
- 'syntropy-institute', 't-zero', 'arch-presentation',
])
const INTERNAL_TOOLING_NAMES = new Set([
@@ -69,8 +66,7 @@ export const APP_CATEGORY_MAP: Record = {
'nostrudel': 'nostr',
'tailscale': 'networking', 'netbird': 'networking', 'nginx-proxy-manager': 'networking', 'portainer': 'networking',
'uptime-kuma': 'networking',
- 'botfights': 'community', 'nwnn': 'l484', '484-kitchen': 'l484',
- 'call-the-operator': 'l484', 'syntropy-institute': 'l484', 't-zero': 'l484',
+ 'botfights': 'community',
}
export function getAppCategory(id: string, pkg: PackageDataEntry): string {
@@ -154,52 +150,14 @@ export function buildServiceCategories(t: (key: string) => string): Array<{ id:
}
// Web-only app IDs and their URLs
-export const WEB_ONLY_APP_URLS: Record = {
- 'nwnn': 'https://nwnn.l484.com',
- '484-kitchen': 'https://484.kitchen',
- 'call-the-operator': 'https://cta.tx1138.com',
- 'arch-presentation': 'https://present.l484.com',
- 'syntropy-institute': 'https://syntropy.institute',
- 't-zero': 'https://teeminuszero.net',
-}
+export const WEB_ONLY_APP_URLS: Record = {}
export function isWebOnlyApp(id: string): boolean {
return id in WEB_ONLY_APP_URLS
}
// Web-only apps (no container) -- always show as installed bookmarks
-export const WEB_ONLY_APPS: Record = {
- '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 },
- 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/nwnn.png' },
- },
- '484-kitchen': {
- state: 'running' as PackageState,
- manifest: { id: '484-kitchen', title: '484 Kitchen', version: '1.0.0', description: { short: 'K484 application platform', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null },
- 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/484-kitchen.png' },
- },
- 'call-the-operator': {
- state: 'running' as PackageState,
- manifest: { id: 'call-the-operator', title: 'Call the Operator', version: '1.0.0', description: { short: 'Escape the Matrix — explore decentralized alternatives', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null },
- 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/call-the-operator.png' },
- },
- 'arch-presentation': {
- state: 'running' as PackageState,
- manifest: { id: 'arch-presentation', title: 'Arch Presentation', version: '1.0.0', description: { short: 'Archipelago: The Future of Decentralized Infrastructure', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null },
- 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/arch-presentation.png' },
- },
- 'syntropy-institute': {
- state: 'running' as PackageState,
- manifest: { id: 'syntropy-institute', title: 'Syntropy Institute', version: '1.0.0', description: { short: 'Medicine Reimagined — frequency analysis-therapy', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null },
- 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/syntropy-institute.png' },
- },
- 't-zero': {
- state: 'running' as PackageState,
- manifest: { id: 't-zero', title: 'T-0', version: '1.0.0', description: { short: 'Documentary series on decentralization and Bitcoin', long: '' }, 'release-notes': '', license: '', 'wrapper-repo': '', 'upstream-repo': '', 'support-site': '', 'marketing-site': '', 'donation-url': null },
- 'static-files': { license: '', instructions: '', icon: '/assets/img/app-icons/t-zero.png' },
- },
-}
+export const WEB_ONLY_APPS: Record = {}
/** Apps that open in a new browser tab (X-Frame-Options blocks iframe) */
export const TAB_LAUNCH_APPS = new Set([
@@ -370,7 +328,6 @@ export function buildAllCategories(t: (key: string) => string) {
{ id: 'media', name: 'Media' },
{ id: 'home', name: t('marketplace.homeCategory') },
{ id: 'networking', name: t('marketplace.networking') },
- { id: 'l484', name: 'L484' },
{ id: 'other', name: t('marketplace.other') },
]
}
diff --git a/neode-ui/src/views/discover/curatedApps.ts b/neode-ui/src/views/discover/curatedApps.ts
index b48d5757..ce038e53 100644
--- a/neode-ui/src/views/discover/curatedApps.ts
+++ b/neode-ui/src/views/discover/curatedApps.ts
@@ -109,12 +109,6 @@ export function getCuratedAppList(): MarketplaceApp[] {
{ 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', 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.1.0`, repoUrl: 'https://botfights.net' },
{ id: 'gitea', title: 'Gitea', version: '1.23', category: 'development', description: 'Self-hosted Git service with container registry, CI/CD, issue tracking, and package hosting.', icon: '/assets/img/app-icons/gitea.svg', author: 'Gitea', dockerImage: 'docker.io/gitea/gitea:1.23', repoUrl: 'https://gitea.com' },
- { 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' },
- { id: 'arch-presentation', title: 'Arch Presentation', version: '1.0.0', category: 'l484', description: 'The Future of Decentralized Infrastructure — interactive Archipelago presentation.', icon: '/assets/img/app-icons/arch-presentation.png', author: 'L484', dockerImage: '', 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, and concierge protocols.', icon: '/assets/img/app-icons/syntropy-institute.png', author: 'Syntropy Institute', dockerImage: '', 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 and the mavericks building the ungovernable future.', icon: '/assets/img/app-icons/t-zero.png', author: 'T-0', dockerImage: '', repoUrl: 'https://teeminuszero.net', webUrl: 'https://teeminuszero.net' },
]
}
diff --git a/neode-ui/src/views/marketplace/marketplaceData.ts b/neode-ui/src/views/marketplace/marketplaceData.ts
index febb9eeb..19b55307 100644
--- a/neode-ui/src/views/marketplace/marketplaceData.ts
+++ b/neode-ui/src/views/marketplace/marketplaceData.ts
@@ -431,83 +431,5 @@ export function getCuratedAppList(): MarketplaceApp[] {
manifestUrl: undefined,
repoUrl: 'https://gitea.com',
},
- {
- 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'
- }
]
}