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". */