Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/components/sections/DeploySection.astro
Original file line number Diff line number Diff line change
Expand Up @@ -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;
---

<div class="mx-auto max-w-6xl">
Expand Down
2 changes: 1 addition & 1 deletion src/components/sections/FaqSection.astro
Original file line number Diff line number Diff line change
Expand Up @@ -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.',
},
];
---
Expand Down
14 changes: 10 additions & 4 deletions src/data/deploy-categories.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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,
},
];
47 changes: 43 additions & 4 deletions src/data/deploy-targets.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,39 @@ 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(),
);
});

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);
Expand All @@ -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');
});
Expand All @@ -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);
}
}
});
121 changes: 109 additions & 12 deletions src/data/deploy-targets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -83,30 +87,77 @@ 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',
},
{
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',
Expand Down Expand Up @@ -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)
{
Expand All @@ -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',
Expand All @@ -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',
Expand Down Expand Up @@ -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. */
Expand Down
4 changes: 2 additions & 2 deletions src/data/sections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
},
{
Expand Down
1 change: 1 addition & 0 deletions src/lib/github-stars.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const FALLBACK_STARS: Record<string, number> = {
'kubernetes/kubernetes': 123000,
'rancher/rancher': 25800,
'azukaar/Cosmos-Server': 6000,
'labring/sealos': 18300,
};

/** 41200 -> "41.2k", 132000 -> "132k", 980 -> "980". */
Expand Down
Loading