From f818f1dcc12caaa851b70ef86344d3e43bcffd84 Mon Sep 17 00:00:00 2001 From: archipelago Date: Thu, 11 Jun 2026 01:16:21 -0400 Subject: [PATCH] app-platform: remove unsupported saleor release surface --- app-catalog/catalog.json | 26 -------- .../src/container/image_versions.rs | 15 ----- core/archipelago/src/crash_recovery.rs | 35 ----------- docs/APP-PACKAGING-MIGRATION-PLAN.md | 35 +++++------ neode-ui/public/catalog.json | 26 -------- .../composables/useCollapsingHeaderTabs.ts | 7 ++- neode-ui/src/style.css | 36 ++++++++++- neode-ui/src/views/Apps.vue | 61 ++++++++++++------- neode-ui/src/views/Discover.vue | 11 +++- neode-ui/src/views/Marketplace.vue | 11 +++- .../src/views/settings/AccountInfoSection.vue | 19 +----- release-manifest.json | 7 +-- releases/manifest.json | 7 +-- scripts/check-app-catalog-drift.py | 1 - scripts/image-versions.sh | 8 --- scripts/sync-npm-public-hosts.sh | 34 +---------- 16 files changed, 122 insertions(+), 217 deletions(-) diff --git a/app-catalog/catalog.json b/app-catalog/catalog.json index e55d4b0d..cd4088f0 100644 --- a/app-catalog/catalog.json +++ b/app-catalog/catalog.json @@ -64,32 +64,6 @@ "bitcoin-knots" ] }, - { - "id": "saleor", - "title": "Saleor", - "version": "3.23", - "description": "Composable commerce platform with customer storefront, GraphQL API, dashboard, worker, mail testing, and tracing.", - "icon": "/assets/img/app-icons/saleor.svg", - "author": "Saleor", - "category": "commerce", - "tier": "recommended", - "dockerImage": "ghcr.io/saleor/saleor:3.23", - "repoUrl": "https://github.com/saleor/saleor", - "containerConfig": { - "ports": [ - "9011:80", - "9010:80", - "8000:8000", - "8025:8025", - "16686:16686" - ], - "volumes": [ - "/var/lib/archipelago/saleor:/app/media", - "/var/lib/archipelago/saleor-db:/var/lib/postgresql/data" - ], - "notes": "Installed as a Saleor stack: customer storefront on 9011, admin dashboard on 9010, API on 8000, Mailpit on 8025, and Jaeger on 16686. Supporting containers include PostgreSQL, Valkey, Celery worker, and services required by Saleor." - } - }, { "id": "mempool", "title": "Mempool Explorer", diff --git a/core/archipelago/src/container/image_versions.rs b/core/archipelago/src/container/image_versions.rs index 5d68f967..47812fcb 100644 --- a/core/archipelago/src/container/image_versions.rs +++ b/core/archipelago/src/container/image_versions.rs @@ -171,12 +171,6 @@ fn image_var_for_app(app_id: &str) -> Option<&'static str> { "netbird" => Some("NETBIRD_DASHBOARD_IMAGE"), "netbird-dashboard" => Some("NETBIRD_DASHBOARD_IMAGE"), "netbird-server" => Some("NETBIRD_SERVER_IMAGE"), - "saleor" => Some("SALEOR_DASHBOARD_IMAGE"), - "saleor-api" | "saleor-worker" => Some("SALEOR_API_IMAGE"), - "saleor-db" => Some("SALEOR_POSTGRES_IMAGE"), - "saleor-cache" => Some("SALEOR_VALKEY_IMAGE"), - "saleor-jaeger" => Some("SALEOR_JAEGER_IMAGE"), - "saleor-mailpit" => Some("SALEOR_MAILPIT_IMAGE"), // Fedimint "fedimint" | "fedimintd" => Some("FEDIMINT_IMAGE"), @@ -317,15 +311,6 @@ pub fn containers_for_stack(app_id: &str) -> Vec<(&'static str, &'static str)> { ("netbird-dashboard", "NETBIRD_DASHBOARD_IMAGE"), ("netbird-server", "NETBIRD_SERVER_IMAGE"), ], - "saleor" => vec![ - ("saleor-db", "SALEOR_POSTGRES_IMAGE"), - ("saleor-cache", "SALEOR_VALKEY_IMAGE"), - ("saleor-api", "SALEOR_API_IMAGE"), - ("saleor-worker", "SALEOR_API_IMAGE"), - ("saleor-jaeger", "SALEOR_JAEGER_IMAGE"), - ("saleor-mailpit", "SALEOR_MAILPIT_IMAGE"), - ("saleor", "SALEOR_DASHBOARD_IMAGE"), - ], _ => vec![], } } diff --git a/core/archipelago/src/crash_recovery.rs b/core/archipelago/src/crash_recovery.rs index 56f3f391..3f2cbe1a 100644 --- a/core/archipelago/src/crash_recovery.rs +++ b/core/archipelago/src/crash_recovery.rs @@ -549,15 +549,6 @@ fn should_auto_start_stopped_container(name: &str, include_stack_members: bool) | "netbird-server" | "netbird-dashboard" | "netbird" - | "saleor-db" - | "saleor-cache" - | "saleor-jaeger" - | "saleor-mailpit" - | "saleor-api" - | "saleor-worker" - | "saleor" - | "saleor-storefront" - | "saleor-storefront-app" ) } @@ -611,32 +602,6 @@ fn stack_recovery_specs() -> &'static [StackRecoverySpec] { ], containers: &["netbird-server", "netbird-dashboard", "netbird"], }, - StackRecoverySpec { - name: "saleor", - network: "saleor-net", - aliases: &[ - ("saleor-db", "db"), - ("saleor-cache", "cache"), - ("saleor-jaeger", "jaeger"), - ("saleor-mailpit", "mailpit"), - ("saleor-api", "api"), - ("saleor-worker", "worker"), - ("saleor", "saleor"), - ("saleor-storefront", "storefront"), - ("saleor-storefront-app", "storefront-app"), - ], - containers: &[ - "saleor-db", - "saleor-cache", - "saleor-jaeger", - "saleor-mailpit", - "saleor-api", - "saleor-worker", - "saleor", - "saleor-storefront", - "saleor-storefront-app", - ], - }, ] } diff --git a/docs/APP-PACKAGING-MIGRATION-PLAN.md b/docs/APP-PACKAGING-MIGRATION-PLAN.md index bfa145a7..3743e8c6 100644 --- a/docs/APP-PACKAGING-MIGRATION-PLAN.md +++ b/docs/APP-PACKAGING-MIGRATION-PLAN.md @@ -50,7 +50,7 @@ The remaining migration work is mostly orchestration quality: post-reboot adopti Use a StartOS-inspired package model with Umbrel-like app folders. ```text -apps/saleor/ +apps/example-commerce/ manifest.yml Dockerfile icon.svg @@ -109,12 +109,12 @@ Example `manifest.yml`: ```yaml app: - id: saleor - name: Saleor + id: example-commerce + name: Example Commerce version: 3.23.0 description: Composable commerce platform container: - image: docker.io/myorg/saleor:3.23.0 + image: docker.io/myorg/example-commerce:1.0.0 pull_policy: if-not-present network: archy-net entrypoint: ["sh", "-lc"] @@ -125,7 +125,7 @@ app: template: https://{{HOST_MDNS}}:9010 secret_env: - key: SALEOR_SECRET_KEY - secret_file: saleor-secret-key + secret_file: example-commerce-secret-key dependencies: - storage: 20Gi resources: @@ -142,7 +142,7 @@ app: protocol: tcp volumes: - type: bind - source: /var/lib/archipelago/saleor + source: /var/lib/archipelago/example-commerce target: /data options: [rw] environment: @@ -293,7 +293,6 @@ Then moderate apps: Then complex apps: -- Saleor - Mempool - BTCPay Server - NetBird only if safe @@ -307,9 +306,11 @@ Leave for later: - System update - Mesh/Web5/FIPS core services -## Saleor Reference Goal +## Complex Stack Reference Goal -Saleor should become the showcase package. It should prove: +Saleor has been removed from the supported release catalog until it has a real +manifest-owned package. A future complex stack should become the showcase +package and prove: - Multi-container stack support. - Generated secrets. @@ -322,7 +323,7 @@ Saleor should become the showcase package. It should prove: - Public domain support. - Alpha-node adoption. -Once Saleor is clean, the app system is credible. +Once a complex stack is clean, the app system is credible. ## Implementation Phases @@ -364,7 +365,7 @@ Once Saleor is clean, the app system is credible. - Add adoption logic for existing containers. - Add migration metadata. - Migrate simple apps. -- Migrate Saleor. +- Migrate a serious multi-container app once the stack model is stable. - Keep rollback. - Prove reboot recovery with repeated clean post-reboot lifecycle passes. - Preserve Nostr signer bridges, Bitcoin dependency wait states, and public launch ports during adoption. @@ -382,10 +383,10 @@ Once Saleor is clean, the app system is credible. Add commands like: ```bash -archy app validate apps/saleor -archy app render apps/saleor -archy app install apps/saleor -archy app test apps/saleor +archy app validate apps/example-commerce +archy app render apps/example-commerce +archy app install apps/example-commerce +archy app test apps/example-commerce ``` Developers should be able to package an app without understanding Archipelago internals. @@ -405,7 +406,7 @@ Public explanation: - Routing/public proxy integration: 1-2 weeks. - Hooks/secrets/backups: 2-3 weeks. - First migrations: 2-4 weeks. -- Saleor reference migration: 1-2 weeks. +- Complex stack reference migration: 1-2 weeks. - Cleanup/docs/tooling: 2-3 weeks. Total estimate: 8-14 weeks of serious work for an excellent system. @@ -438,5 +439,5 @@ Minimum viable version: 3-5 weeks. 3. Finish post-reboot adoption and stale scanner-state handling for migrated apps. 4. Convert remaining multi-container legacy stacks to a manifest-owned model without deleting data. 5. Add developer tooling around the current `manifest.yml` contract: validate, render, local install, lifecycle test. -6. Migrate Saleor or another serious multi-container app as the proof package once the stack model is stable. +6. Migrate a serious multi-container app as the proof package once the stack model is stable. 7. Leave Bitcoin/LND/core services as managed infrastructure until the package system is proven for normal apps. diff --git a/neode-ui/public/catalog.json b/neode-ui/public/catalog.json index e55d4b0d..cd4088f0 100644 --- a/neode-ui/public/catalog.json +++ b/neode-ui/public/catalog.json @@ -64,32 +64,6 @@ "bitcoin-knots" ] }, - { - "id": "saleor", - "title": "Saleor", - "version": "3.23", - "description": "Composable commerce platform with customer storefront, GraphQL API, dashboard, worker, mail testing, and tracing.", - "icon": "/assets/img/app-icons/saleor.svg", - "author": "Saleor", - "category": "commerce", - "tier": "recommended", - "dockerImage": "ghcr.io/saleor/saleor:3.23", - "repoUrl": "https://github.com/saleor/saleor", - "containerConfig": { - "ports": [ - "9011:80", - "9010:80", - "8000:8000", - "8025:8025", - "16686:16686" - ], - "volumes": [ - "/var/lib/archipelago/saleor:/app/media", - "/var/lib/archipelago/saleor-db:/var/lib/postgresql/data" - ], - "notes": "Installed as a Saleor stack: customer storefront on 9011, admin dashboard on 9010, API on 8000, Mailpit on 8025, and Jaeger on 16686. Supporting containers include PostgreSQL, Valkey, Celery worker, and services required by Saleor." - } - }, { "id": "mempool", "title": "Mempool Explorer", diff --git a/neode-ui/src/composables/useCollapsingHeaderTabs.ts b/neode-ui/src/composables/useCollapsingHeaderTabs.ts index b048683f..75255626 100644 --- a/neode-ui/src/composables/useCollapsingHeaderTabs.ts +++ b/neode-ui/src/composables/useCollapsingHeaderTabs.ts @@ -4,7 +4,8 @@ export function useCollapsingHeaderTabs( headerRef: Ref, primaryRef: Ref, tabsProbeRef: Ref, - minSearchWidth = 176 + minSearchWidth = 176, + minTabsWidth = 260 ) { const collapsed = ref(false) let resizeObserver: ResizeObserver | null = null @@ -17,7 +18,9 @@ export function useCollapsingHeaderTabs( const primaryWidth = primaryRef.value?.getBoundingClientRect().width ?? 0 const tabsWidth = probe.getBoundingClientRect().width const gapWidth = 48 - collapsed.value = primaryWidth + tabsWidth + minSearchWidth + gapWidth > header.clientWidth + const fullTabsFit = primaryWidth + tabsWidth + minSearchWidth + gapWidth <= header.clientWidth + const usableTabsFit = primaryWidth + minTabsWidth + minSearchWidth + gapWidth <= header.clientWidth + collapsed.value = !fullTabsFit && !usableTabsFit } function scheduleMeasure() { diff --git a/neode-ui/src/style.css b/neode-ui/src/style.css index 4a140693..ab52226a 100644 --- a/neode-ui/src/style.css +++ b/neode-ui/src/style.css @@ -269,12 +269,46 @@ input[type="radio"]:active + * { max-width: min(360px, 34vw); } + .app-header-desktop { + display: none; + } + + .app-header-mobile { + display: block; + } + + .app-header-inline-tabs { + display: none; + } + + @media (min-width: 768px) and (max-width: 920px) { + .app-header-inline-tabs { + display: flex; + } + } + + @media (min-width: 921px) { + .app-header-desktop { + display: flex; + } + + .app-header-mobile { + display: none; + } + } + .category-tabs-wide { flex: 0 1 auto; min-width: 0; width: max-content; max-width: 100%; - overflow: visible; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + } + + .category-tabs-wide::-webkit-scrollbar { + display: none; } .category-tabs-wide .mode-switcher-btn { diff --git a/neode-ui/src/views/Apps.vue b/neode-ui/src/views/Apps.vue index b036e0e7..394ea18b 100644 --- a/neode-ui/src/views/Apps.vue +++ b/neode-ui/src/views/Apps.vue @@ -3,7 +3,7 @@
-