diff --git a/src/components/sections/DeploySection.astro b/src/components/sections/DeploySection.astro index 36f3b8a..9b023f2 100644 --- a/src/components/sections/DeploySection.astro +++ b/src/components/sections/DeploySection.astro @@ -13,7 +13,10 @@ const targetsByCategory = (id: string) => deployTargets.filter((t) => t.category === id).sort((a, b) => STATUS_ORDER[a.status] - STATUS_ORDER[b.status]); const official = deployTargets.filter((t) => t.status === 'official'); -const installMethodCount = deployTargets.filter((t) => t.category === 'registry').length; +// Install methods = the artifacts you pull plus the package managers you install +// with; the PaaS/Kubernetes/cloud cards are ways to run those, not extra methods. +const INSTALL_CATEGORIES = ['registry', 'packages']; +const installMethodCount = deployTargets.filter((t) => INSTALL_CATEGORIES.includes(t.category)).length; ---
diff --git a/src/components/sections/FaqSection.astro b/src/components/sections/FaqSection.astro index 8bc2ded..f5019de 100644 --- a/src/components/sections/FaqSection.astro +++ b/src/components/sections/FaqSection.astro @@ -51,7 +51,7 @@ const faqs: QA[] = [ }, { q: 'Why sponsor LibreDB?', - a: 'Studio is MIT-licensed and free forever — no premium tier is coming to paywall it. Sponsorship (github.com/sponsors/libredb) directly funds what you already use: maintenance across seven database engines, security reviews, the release pipeline that ships Docker, Helm, npm, Homebrew and Snap packages on every release, and development of the open-source LibreDB engine. If Studio saves your team an hour a month, a sponsorship is the cheapest way to keep it alive and independent.', + a: 'Studio is MIT-licensed and free forever — no premium tier is coming to paywall it. Sponsorship (github.com/sponsors/libredb) directly funds what you already use: maintenance across seven database engines, security reviews, the release pipeline that ships Docker, Helm, npm, Homebrew, Snap, winget and Chocolatey packages on every release, and development of the open-source LibreDB engine. If Studio saves your team an hour a month, a sponsorship is the cheapest way to keep it alive and independent.', }, ]; --- diff --git a/src/data/deploy-categories.ts b/src/data/deploy-categories.ts index 57245ef..9330f40 100644 --- a/src/data/deploy-categories.ts +++ b/src/data/deploy-categories.ts @@ -1,4 +1,4 @@ -export type CategoryId = 'registry' | 'oss-paas' | 'kubernetes' | 'managed-paas'; +export type CategoryId = 'registry' | 'packages' | 'oss-paas' | 'kubernetes' | 'managed-paas'; export interface DeployCategory { id: CategoryId; @@ -14,22 +14,28 @@ export const deployCategories: DeployCategory[] = [ tagline: 'The published artifacts every deploy builds on — pull, helm install, or npx.', order: 1, }, + { + id: 'packages', + title: 'Desktop apps & package managers', + tagline: 'Install on your own machine with the package manager you already use.', + order: 2, + }, { id: 'oss-paas', title: 'Open-source & self-hosted PaaS', tagline: 'Run LibreDB Studio inside the open-source platforms you already self-host.', - order: 2, + order: 3, }, { id: 'kubernetes', title: 'Kubernetes & orchestration', tagline: 'Install the published Helm chart on any cluster — including enterprise distributions.', - order: 3, + order: 4, }, { id: 'managed-paas', title: 'Managed & commercial PaaS', tagline: 'One-click deploys on hosted platforms — no servers to manage.', - order: 4, + order: 5, }, ]; diff --git a/src/data/deploy-targets.test.ts b/src/data/deploy-targets.test.ts index e8598c2..c7225e3 100644 --- a/src/data/deploy-targets.test.ts +++ b/src/data/deploy-targets.test.ts @@ -20,8 +20,13 @@ test('slugs are unique', () => { test('registries mirror the live channels in distribution/channels.yaml', () => { const registries = deployTargets.filter((t) => t.category === 'registry'); const available = registries.filter((t) => t.status === 'available').map((t) => t.slug); - expect(available.toSorted()).toEqual( - ['ghcr', 'docker', 'helm', 'artifacthub', 'npm', 'homebrew', 'snap', 'github-releases'].toSorted(), + expect(available.toSorted()).toEqual(['ghcr', 'docker', 'helm', 'artifacthub', 'npm', 'github-releases'].toSorted()); +}); + +test('package managers and desktop packages mirror the live channels', () => { + const packages = deployTargets.filter((t) => t.category === 'packages').map((t) => t.slug); + expect(packages.toSorted()).toEqual( + ['homebrew', 'snap', 'winget', 'chocolatey', 'flatpark', 'desktop-app', 'linux-deb-rpm'].toSorted(), ); }); @@ -29,6 +34,25 @@ test('only live targets are listed — planned platforms stay off the page', () expect(deployTargets.every((t) => t.status !== 'planned')).toBe(true); }); +test('channels that are pending or deprecated upstream are not listed', () => { + // Flathub is deprecated (submission declined — FlatPark is our Flatpak + // channel); the rest are status: pending in distribution/channels.yaml. + const offThePage = [ + 'flathub', + 'casaos', + 'umbrel', + 'easypanel', + 'portainer', + 'operatorhub', + 'koyeb-catalog', + 'appimagehub', + ]; + const slugs = deployTargets.map((t) => t.slug); + for (const slug of offThePage) { + expect(slugs).not.toContain(slug); + } +}); + test('only open-source platforms declare a github repo (stars constraint)', () => { const starCategories = ['oss-paas', 'kubernetes']; const withGithub = deployTargets.filter((t) => t.github); @@ -40,8 +64,9 @@ test('rancher is listed under kubernetes and points at our Rancher docs', () => const rancher = deployTargets.find((t) => t.slug === 'rancher'); expect(rancher).toBeDefined(); expect(rancher?.category).toBe('kubernetes'); - // Stays 'available' until rancher/partner-charts#1158 merges and the chart - // ships in Rancher's own Partners repository. + // rancher/partner-charts#1158 is merged, so the chart ships in Rancher + // Partner Charts — but a partner catalog is not one of our own one-click + // listings, so the status stays 'available'. expect(rancher?.status).toBe('available'); expect(rancher?.docsUrl).toContain('docs/RANCHER.md'); }); @@ -52,3 +77,17 @@ test('official integrations are present', () => { expect(official).toContain(slug); } }); + +test('official is reserved for our own one-click listings', () => { + const official = deployTargets.filter((t) => t.status === 'official').map((t) => t.slug); + expect(official.toSorted()).toEqual(['railway', 'caprover', 'dokploy', 'cosmos', 'kubero'].toSorted()); +}); + +test('every target links somewhere useful', () => { + for (const t of deployTargets) { + expect(t.url.startsWith('https://')).toBe(true); + for (const link of [t.deployUrl, t.docsUrl]) { + if (link) expect(link.startsWith('https://')).toBe(true); + } + } +}); diff --git a/src/data/deploy-targets.ts b/src/data/deploy-targets.ts index 4fb86f4..972dc4c 100644 --- a/src/data/deploy-targets.ts +++ b/src/data/deploy-targets.ts @@ -35,9 +35,13 @@ const KOYEB_DEPLOY_URL = // not an official Render catalog listing. const RENDER_DEPLOY_URL = 'https://render.com/deploy?repo=https://github.com/libredb/libredb-studio'; +const RELEASES_URL = 'https://github.com/libredb/libredb-studio/releases/latest'; + export const deployTargets: DeployTarget[] = [ // ① Install primitives / registries — mirrors distribution/channels.yaml in // the studio repo (the "visibility matrix"); every live channel gets a card. + // 'official' is reserved for platforms where a listing of ours makes the + // install one click in their own UI — catalog-only listings stay 'available'. { name: 'GitHub Container Registry', slug: 'ghcr', @@ -83,10 +87,22 @@ export const deployTargets: DeployTarget[] = [ logo: '/logos/deploy/npm.svg', blurb: 'npx @libredb/studio', }, + { + name: 'GitHub Releases', + slug: 'github-releases', + category: 'registry', + status: 'available', + url: 'https://github.com/libredb/libredb-studio/releases', + blurb: 'Standalone tarballs on every release', + }, + + // ② Desktop apps & package managers — the os-desktop and package-managers + // channels. Flathub is deprecated upstream (submission declined), so FlatPark + // is the only Flatpak channel; never list Flathub here. { name: 'Homebrew', slug: 'homebrew', - category: 'registry', + category: 'packages', status: 'available', url: 'https://github.com/libredb/homebrew-tap', blurb: 'brew install libredb/tap/libredb-studio', @@ -94,19 +110,54 @@ export const deployTargets: DeployTarget[] = [ { name: 'Snap Store', slug: 'snap', - category: 'registry', + category: 'packages', status: 'available', url: 'https://snapcraft.io/libredb-studio', blurb: 'snap install libredb-studio', }, { - name: 'GitHub Releases', - slug: 'github-releases', - category: 'registry', + name: 'winget', + slug: 'winget', + category: 'packages', status: 'available', - url: 'https://github.com/libredb/libredb-studio/releases', - blurb: 'Standalone tarballs + .deb / .rpm on every release', + url: 'https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LibreDB/Studio', + blurb: 'winget install LibreDB.Studio', + }, + { + name: 'Chocolatey', + slug: 'chocolatey', + category: 'packages', + status: 'available', + url: 'https://community.chocolatey.org/packages/libredb-studio', + blurb: 'choco install libredb-studio', + }, + { + name: 'FlatPark', + slug: 'flatpark', + category: 'packages', + status: 'available', + url: 'https://flatpark.org/', + docsUrl: 'https://github.com/libredb/libredb-studio/tree/main/packaging/flatpark', + blurb: 'Signed Flatpak remote — org.libredb.Studio', + }, + { + name: 'Desktop app', + slug: 'desktop-app', + category: 'packages', + status: 'available', + url: RELEASES_URL, + docsUrl: 'https://github.com/libredb/libredb-studio/blob/main/desktop/README.md', + blurb: 'AppImage + GUI .deb, x64 and arm64', }, + { + name: 'Linux .deb / .rpm', + slug: 'linux-deb-rpm', + category: 'packages', + status: 'available', + url: RELEASES_URL, + blurb: 'apt / dnf install from the release assets', + }, + { name: 'CapRover', slug: 'caprover', @@ -140,6 +191,31 @@ export const deployTargets: DeployTarget[] = [ docsUrl: 'https://github.com/libredb/libredb-studio/tree/main/deploy/cosmos', blurb: 'Official servapp — one-click marketplace install', }, + { + name: 'Sealos', + slug: 'sealos', + category: 'oss-paas', + status: 'available', + url: 'https://sealos.io/products/app-store/libredb-studio', + github: 'labring/sealos', + blurb: 'App Store template — SQLite on a PVC by default', + }, + { + name: 'Unraid', + slug: 'unraid', + category: 'oss-paas', + status: 'available', + url: 'https://ca.unraid.net/apps/libredb-studio-0a5x41a1cy1kay', + blurb: 'Community Applications template', + }, + { + name: 'TrueNAS SCALE', + slug: 'truenas-scale', + category: 'oss-paas', + status: 'available', + url: 'https://apps.truenas.com/catalog/libredb-studio_community/', + blurb: 'Community apps catalog listing', + }, // ③ Kubernetes & orchestration — Helm chart install; stars shown (open-source) { @@ -153,10 +229,11 @@ export const deployTargets: DeployTarget[] = [ logo: '/logos/deploy/kubernetes.svg', blurb: 'helm install from the published OCI chart', }, - // Listed in the SUSE Partner Certification & Solutions Catalog. Install today - // is a ClusterRepo pointing at our chart repo; once rancher/partner-charts#1158 - // lands, the chart also ships in Rancher's own Partners repository — bump the - // status to 'official' then, not before. + // rancher/partner-charts#1158 merged (17 Aug 2026): the chart ships in + // Rancher Partner Charts and is listed in the SUSE Solutions Catalog. Stays + // 'available' rather than 'official' because a partner catalog is not a + // one-click deploy of ours — the install is still an Apps catalog / ClusterRepo + // step. 'official' is reserved for our own one-click listings. { name: 'Rancher', slug: 'rancher', @@ -166,7 +243,7 @@ export const deployTargets: DeployTarget[] = [ github: 'rancher/rancher', docsUrl: 'https://github.com/libredb/libredb-studio/blob/main/docs/RANCHER.md', logo: '/logos/deploy/rancher.svg', - blurb: 'Apps catalog install via ClusterRepo — SUSE catalog listed', + blurb: 'In Rancher Partner Charts — SUSE catalog listed', }, { name: 'Kubero', @@ -211,6 +288,26 @@ export const deployTargets: DeployTarget[] = [ logo: '/logos/deploy/render.svg', blurb: 'One-click deploy via render.yaml Blueprint', }, + { + name: 'Fly.io', + slug: 'fly', + category: 'managed-paas', + status: 'available', + url: 'https://fly.io', + docsUrl: 'https://github.com/libredb/libredb-studio/blob/main/docs/FLY.md', + logo: '/logos/deploy/fly.svg', + blurb: 'fly launch from the repo fly.toml', + }, + { + name: 'DigitalOcean', + slug: 'digitalocean', + category: 'managed-paas', + status: 'available', + url: 'https://marketplace.digitalocean.com/apps/libredb-studio', + docsUrl: 'https://github.com/libredb/libredb-studio/tree/main/deploy/digitalocean', + logo: '/logos/deploy/digitalocean.svg', + blurb: 'Marketplace app — 1-Click Droplet', + }, ]; /** Categories whose targets are open-source platforms — we show live star counts there. */ diff --git a/src/data/sections.ts b/src/data/sections.ts index 5c6cdde..63259a6 100644 --- a/src/data/sections.ts +++ b/src/data/sections.ts @@ -312,11 +312,11 @@ export const sections: SectionMeta[] = [ { name: 'category', type: 'VARCHAR' }, { name: 'method', type: 'VARCHAR' }, ], - explain: `Every place LibreDB Studio ships today — ${deployTargets.length} live targets across registries, self-hosted PaaS, Kubernetes and managed PaaS — from one open-source image.`, + explain: `Every place LibreDB Studio ships today — ${deployTargets.length} live targets across registries, package managers, self-hosted PaaS, Kubernetes and managed PaaS — from one open-source image.`, slug: 'deploy', pageTitle: 'Deploy LibreDB Studio Anywhere — One-Click Apps, Helm, Docker & Cloud', pageDescription: - 'Run the open-source LibreDB Studio SQL IDE anywhere: official Railway, CapRover, Dokploy, Cosmos and Kubero one-click apps, Docker Hub & GHCR images, a Helm chart on Artifact Hub, npm, Homebrew, Snap, .deb/.rpm, and every major open-source PaaS, managed PaaS, and cloud.', + 'Run the open-source LibreDB Studio SQL IDE anywhere: official Railway, CapRover, Dokploy, Cosmos and Kubero one-click apps, Docker Hub & GHCR images, a Helm chart on Artifact Hub and Rancher Partner Charts, npm, Homebrew, Snap, winget, Chocolatey, Flatpak, AppImage and .deb/.rpm packages, Unraid, TrueNAS SCALE, Sealos, Fly.io and the DigitalOcean Marketplace.', schema: 'studio', }, { diff --git a/src/lib/github-stars.ts b/src/lib/github-stars.ts index 41f6298..5961f31 100644 --- a/src/lib/github-stars.ts +++ b/src/lib/github-stars.ts @@ -13,6 +13,7 @@ export const FALLBACK_STARS: Record = { 'kubernetes/kubernetes': 123000, 'rancher/rancher': 25800, 'azukaar/Cosmos-Server': 6000, + 'labring/sealos': 18300, }; /** 41200 -> "41.2k", 132000 -> "132k", 980 -> "980". */