Skip to content

Commit cdfc07f

Browse files
cevhericlaude
andcommitted
feat(deploy): sync the channel list with the live distribution matrix
The /deploy page had drifted from distribution/channels.yaml in the studio repo (the visibility matrix, and the only source of truth for what actually ships). Ten live channels were missing and one had a stale status. Added, all status: live upstream — winget, Chocolatey, FlatPark (Flatpak), the desktop app (AppImage + GUI .deb), Linux .deb/.rpm, Fly.io, the DigitalOcean Marketplace, Unraid Community Apps, TrueNAS SCALE and Sealos. Homebrew, Snap and the new package/desktop channels move out of the registries grid into a new "Desktop apps & package managers" category: registries stays the artifacts you pull, packages is what you install with. GitHub Releases loses the ".deb / .rpm" half of its blurb now that those have their own card. Rancher keeps status 'available' but the copy and code comment are no longer stale — rancher/partner-charts#1158 merged, so the chart ships in Rancher Partner Charts and is listed in the SUSE catalog. 'official' stays reserved for our own one-click listings, which is what the hero section renders; a partner catalog install is still an Apps catalog / ClusterRepo step. Pending and deprecated channels stay off the page (Flathub is deprecated — the submission was declined and FlatPark is the Flatpak channel now), with a test guarding that so they cannot creep back in. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 9381121 commit cdfc07f

7 files changed

Lines changed: 170 additions & 24 deletions

File tree

‎src/components/sections/DeploySection.astro‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ const targetsByCategory = (id: string) =>
1313
deployTargets.filter((t) => t.category === id).sort((a, b) => STATUS_ORDER[a.status] - STATUS_ORDER[b.status]);
1414
1515
const official = deployTargets.filter((t) => t.status === 'official');
16-
const installMethodCount = deployTargets.filter((t) => t.category === 'registry').length;
16+
// Install methods = the artifacts you pull plus the package managers you install
17+
// with; the PaaS/Kubernetes/cloud cards are ways to run those, not extra methods.
18+
const INSTALL_CATEGORIES = ['registry', 'packages'];
19+
const installMethodCount = deployTargets.filter((t) => INSTALL_CATEGORIES.includes(t.category)).length;
1720
---
1821

1922
<div class="mx-auto max-w-6xl">

‎src/components/sections/FaqSection.astro‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const faqs: QA[] = [
5151
},
5252
{
5353
q: 'Why sponsor LibreDB?',
54-
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.',
54+
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.',
5555
},
5656
];
5757
---

‎src/data/deploy-categories.ts‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type CategoryId = 'registry' | 'oss-paas' | 'kubernetes' | 'managed-paas';
1+
export type CategoryId = 'registry' | 'packages' | 'oss-paas' | 'kubernetes' | 'managed-paas';
22

33
export interface DeployCategory {
44
id: CategoryId;
@@ -14,22 +14,28 @@ export const deployCategories: DeployCategory[] = [
1414
tagline: 'The published artifacts every deploy builds on — pull, helm install, or npx.',
1515
order: 1,
1616
},
17+
{
18+
id: 'packages',
19+
title: 'Desktop apps & package managers',
20+
tagline: 'Install on your own machine with the package manager you already use.',
21+
order: 2,
22+
},
1723
{
1824
id: 'oss-paas',
1925
title: 'Open-source & self-hosted PaaS',
2026
tagline: 'Run LibreDB Studio inside the open-source platforms you already self-host.',
21-
order: 2,
27+
order: 3,
2228
},
2329
{
2430
id: 'kubernetes',
2531
title: 'Kubernetes & orchestration',
2632
tagline: 'Install the published Helm chart on any cluster — including enterprise distributions.',
27-
order: 3,
33+
order: 4,
2834
},
2935
{
3036
id: 'managed-paas',
3137
title: 'Managed & commercial PaaS',
3238
tagline: 'One-click deploys on hosted platforms — no servers to manage.',
33-
order: 4,
39+
order: 5,
3440
},
3541
];

‎src/data/deploy-targets.test.ts‎

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,39 @@ test('slugs are unique', () => {
2020
test('registries mirror the live channels in distribution/channels.yaml', () => {
2121
const registries = deployTargets.filter((t) => t.category === 'registry');
2222
const available = registries.filter((t) => t.status === 'available').map((t) => t.slug);
23-
expect(available.toSorted()).toEqual(
24-
['ghcr', 'docker', 'helm', 'artifacthub', 'npm', 'homebrew', 'snap', 'github-releases'].toSorted(),
23+
expect(available.toSorted()).toEqual(['ghcr', 'docker', 'helm', 'artifacthub', 'npm', 'github-releases'].toSorted());
24+
});
25+
26+
test('package managers and desktop packages mirror the live channels', () => {
27+
const packages = deployTargets.filter((t) => t.category === 'packages').map((t) => t.slug);
28+
expect(packages.toSorted()).toEqual(
29+
['homebrew', 'snap', 'winget', 'chocolatey', 'flatpark', 'desktop-app', 'linux-deb-rpm'].toSorted(),
2530
);
2631
});
2732

2833
test('only live targets are listed — planned platforms stay off the page', () => {
2934
expect(deployTargets.every((t) => t.status !== 'planned')).toBe(true);
3035
});
3136

37+
test('channels that are pending or deprecated upstream are not listed', () => {
38+
// Flathub is deprecated (submission declined — FlatPark is our Flatpak
39+
// channel); the rest are status: pending in distribution/channels.yaml.
40+
const offThePage = [
41+
'flathub',
42+
'casaos',
43+
'umbrel',
44+
'easypanel',
45+
'portainer',
46+
'operatorhub',
47+
'koyeb-catalog',
48+
'appimagehub',
49+
];
50+
const slugs = deployTargets.map((t) => t.slug);
51+
for (const slug of offThePage) {
52+
expect(slugs).not.toContain(slug);
53+
}
54+
});
55+
3256
test('only open-source platforms declare a github repo (stars constraint)', () => {
3357
const starCategories = ['oss-paas', 'kubernetes'];
3458
const withGithub = deployTargets.filter((t) => t.github);
@@ -40,8 +64,9 @@ test('rancher is listed under kubernetes and points at our Rancher docs', () =>
4064
const rancher = deployTargets.find((t) => t.slug === 'rancher');
4165
expect(rancher).toBeDefined();
4266
expect(rancher?.category).toBe('kubernetes');
43-
// Stays 'available' until rancher/partner-charts#1158 merges and the chart
44-
// ships in Rancher's own Partners repository.
67+
// rancher/partner-charts#1158 is merged, so the chart ships in Rancher
68+
// Partner Charts — but a partner catalog is not one of our own one-click
69+
// listings, so the status stays 'available'.
4570
expect(rancher?.status).toBe('available');
4671
expect(rancher?.docsUrl).toContain('docs/RANCHER.md');
4772
});
@@ -52,3 +77,17 @@ test('official integrations are present', () => {
5277
expect(official).toContain(slug);
5378
}
5479
});
80+
81+
test('official is reserved for our own one-click listings', () => {
82+
const official = deployTargets.filter((t) => t.status === 'official').map((t) => t.slug);
83+
expect(official.toSorted()).toEqual(['railway', 'caprover', 'dokploy', 'cosmos', 'kubero'].toSorted());
84+
});
85+
86+
test('every target links somewhere useful', () => {
87+
for (const t of deployTargets) {
88+
expect(t.url.startsWith('https://')).toBe(true);
89+
for (const link of [t.deployUrl, t.docsUrl]) {
90+
if (link) expect(link.startsWith('https://')).toBe(true);
91+
}
92+
}
93+
});

‎src/data/deploy-targets.ts‎

Lines changed: 109 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,13 @@ const KOYEB_DEPLOY_URL =
3535
// not an official Render catalog listing.
3636
const RENDER_DEPLOY_URL = 'https://render.com/deploy?repo=https://github.com/libredb/libredb-studio';
3737

38+
const RELEASES_URL = 'https://github.com/libredb/libredb-studio/releases/latest';
39+
3840
export const deployTargets: DeployTarget[] = [
3941
// ① Install primitives / registries — mirrors distribution/channels.yaml in
4042
// the studio repo (the "visibility matrix"); every live channel gets a card.
43+
// 'official' is reserved for platforms where a listing of ours makes the
44+
// install one click in their own UI — catalog-only listings stay 'available'.
4145
{
4246
name: 'GitHub Container Registry',
4347
slug: 'ghcr',
@@ -83,30 +87,77 @@ export const deployTargets: DeployTarget[] = [
8387
logo: '/logos/deploy/npm.svg',
8488
blurb: 'npx @libredb/studio',
8589
},
90+
{
91+
name: 'GitHub Releases',
92+
slug: 'github-releases',
93+
category: 'registry',
94+
status: 'available',
95+
url: 'https://github.com/libredb/libredb-studio/releases',
96+
blurb: 'Standalone tarballs on every release',
97+
},
98+
99+
// ② Desktop apps & package managers — the os-desktop and package-managers
100+
// channels. Flathub is deprecated upstream (submission declined), so FlatPark
101+
// is the only Flatpak channel; never list Flathub here.
86102
{
87103
name: 'Homebrew',
88104
slug: 'homebrew',
89-
category: 'registry',
105+
category: 'packages',
90106
status: 'available',
91107
url: 'https://github.com/libredb/homebrew-tap',
92108
blurb: 'brew install libredb/tap/libredb-studio',
93109
},
94110
{
95111
name: 'Snap Store',
96112
slug: 'snap',
97-
category: 'registry',
113+
category: 'packages',
98114
status: 'available',
99115
url: 'https://snapcraft.io/libredb-studio',
100116
blurb: 'snap install libredb-studio',
101117
},
102118
{
103-
name: 'GitHub Releases',
104-
slug: 'github-releases',
105-
category: 'registry',
119+
name: 'winget',
120+
slug: 'winget',
121+
category: 'packages',
106122
status: 'available',
107-
url: 'https://github.com/libredb/libredb-studio/releases',
108-
blurb: 'Standalone tarballs + .deb / .rpm on every release',
123+
url: 'https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LibreDB/Studio',
124+
blurb: 'winget install LibreDB.Studio',
125+
},
126+
{
127+
name: 'Chocolatey',
128+
slug: 'chocolatey',
129+
category: 'packages',
130+
status: 'available',
131+
url: 'https://community.chocolatey.org/packages/libredb-studio',
132+
blurb: 'choco install libredb-studio',
133+
},
134+
{
135+
name: 'FlatPark',
136+
slug: 'flatpark',
137+
category: 'packages',
138+
status: 'available',
139+
url: 'https://flatpark.org/',
140+
docsUrl: 'https://github.com/libredb/libredb-studio/tree/main/packaging/flatpark',
141+
blurb: 'Signed Flatpak remote — org.libredb.Studio',
142+
},
143+
{
144+
name: 'Desktop app',
145+
slug: 'desktop-app',
146+
category: 'packages',
147+
status: 'available',
148+
url: RELEASES_URL,
149+
docsUrl: 'https://github.com/libredb/libredb-studio/blob/main/desktop/README.md',
150+
blurb: 'AppImage + GUI .deb, x64 and arm64',
109151
},
152+
{
153+
name: 'Linux .deb / .rpm',
154+
slug: 'linux-deb-rpm',
155+
category: 'packages',
156+
status: 'available',
157+
url: RELEASES_URL,
158+
blurb: 'apt / dnf install from the release assets',
159+
},
160+
110161
{
111162
name: 'CapRover',
112163
slug: 'caprover',
@@ -140,6 +191,31 @@ export const deployTargets: DeployTarget[] = [
140191
docsUrl: 'https://github.com/libredb/libredb-studio/tree/main/deploy/cosmos',
141192
blurb: 'Official servapp — one-click marketplace install',
142193
},
194+
{
195+
name: 'Sealos',
196+
slug: 'sealos',
197+
category: 'oss-paas',
198+
status: 'available',
199+
url: 'https://sealos.io/products/app-store/libredb-studio',
200+
github: 'labring/sealos',
201+
blurb: 'App Store template — SQLite on a PVC by default',
202+
},
203+
{
204+
name: 'Unraid',
205+
slug: 'unraid',
206+
category: 'oss-paas',
207+
status: 'available',
208+
url: 'https://ca.unraid.net/apps/libredb-studio-0a5x41a1cy1kay',
209+
blurb: 'Community Applications template',
210+
},
211+
{
212+
name: 'TrueNAS SCALE',
213+
slug: 'truenas-scale',
214+
category: 'oss-paas',
215+
status: 'available',
216+
url: 'https://apps.truenas.com/catalog/libredb-studio_community/',
217+
blurb: 'Community apps catalog listing',
218+
},
143219

144220
// ③ Kubernetes & orchestration — Helm chart install; stars shown (open-source)
145221
{
@@ -153,10 +229,11 @@ export const deployTargets: DeployTarget[] = [
153229
logo: '/logos/deploy/kubernetes.svg',
154230
blurb: 'helm install from the published OCI chart',
155231
},
156-
// Listed in the SUSE Partner Certification & Solutions Catalog. Install today
157-
// is a ClusterRepo pointing at our chart repo; once rancher/partner-charts#1158
158-
// lands, the chart also ships in Rancher's own Partners repository — bump the
159-
// status to 'official' then, not before.
232+
// rancher/partner-charts#1158 merged (17 Aug 2026): the chart ships in
233+
// Rancher Partner Charts and is listed in the SUSE Solutions Catalog. Stays
234+
// 'available' rather than 'official' because a partner catalog is not a
235+
// one-click deploy of ours — the install is still an Apps catalog / ClusterRepo
236+
// step. 'official' is reserved for our own one-click listings.
160237
{
161238
name: 'Rancher',
162239
slug: 'rancher',
@@ -166,7 +243,7 @@ export const deployTargets: DeployTarget[] = [
166243
github: 'rancher/rancher',
167244
docsUrl: 'https://github.com/libredb/libredb-studio/blob/main/docs/RANCHER.md',
168245
logo: '/logos/deploy/rancher.svg',
169-
blurb: 'Apps catalog install via ClusterRepo — SUSE catalog listed',
246+
blurb: 'In Rancher Partner Charts — SUSE catalog listed',
170247
},
171248
{
172249
name: 'Kubero',
@@ -211,6 +288,26 @@ export const deployTargets: DeployTarget[] = [
211288
logo: '/logos/deploy/render.svg',
212289
blurb: 'One-click deploy via render.yaml Blueprint',
213290
},
291+
{
292+
name: 'Fly.io',
293+
slug: 'fly',
294+
category: 'managed-paas',
295+
status: 'available',
296+
url: 'https://fly.io',
297+
docsUrl: 'https://github.com/libredb/libredb-studio/blob/main/docs/FLY.md',
298+
logo: '/logos/deploy/fly.svg',
299+
blurb: 'fly launch from the repo fly.toml',
300+
},
301+
{
302+
name: 'DigitalOcean',
303+
slug: 'digitalocean',
304+
category: 'managed-paas',
305+
status: 'available',
306+
url: 'https://marketplace.digitalocean.com/apps/libredb-studio',
307+
docsUrl: 'https://github.com/libredb/libredb-studio/tree/main/deploy/digitalocean',
308+
logo: '/logos/deploy/digitalocean.svg',
309+
blurb: 'Marketplace app — 1-Click Droplet',
310+
},
214311
];
215312

216313
/** Categories whose targets are open-source platforms — we show live star counts there. */

‎src/data/sections.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,11 +312,11 @@ export const sections: SectionMeta[] = [
312312
{ name: 'category', type: 'VARCHAR' },
313313
{ name: 'method', type: 'VARCHAR' },
314314
],
315-
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.`,
315+
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.`,
316316
slug: 'deploy',
317317
pageTitle: 'Deploy LibreDB Studio Anywhere — One-Click Apps, Helm, Docker & Cloud',
318318
pageDescription:
319-
'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.',
319+
'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.',
320320
schema: 'studio',
321321
},
322322
{

‎src/lib/github-stars.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export const FALLBACK_STARS: Record<string, number> = {
1313
'kubernetes/kubernetes': 123000,
1414
'rancher/rancher': 25800,
1515
'azukaar/Cosmos-Server': 6000,
16+
'labring/sealos': 18300,
1617
};
1718

1819
/** 41200 -> "41.2k", 132000 -> "132k", 980 -> "980". */

0 commit comments

Comments
 (0)