[grade=pending] fix: add 17 missing app templates to showcase, update count 76→93

This commit is contained in:
Krystie
2026-08-13 17:23:06 -07:00
parent e51419a302
commit fbb6db24d2
10 changed files with 38 additions and 22 deletions
+1 -1
View File
@@ -140,7 +140,7 @@ export default function AboutPage() {
</h2> </h2>
<div className="grid grid-cols-2 md:grid-cols-4 gap-8"> <div className="grid grid-cols-2 md:grid-cols-4 gap-8">
{[ {[
{ value: "76", label: "App Templates" }, { value: "93", label: "App Templates" },
{ value: "1770+", label: "Test Cases" }, { value: "1770+", label: "Test Cases" },
{ value: "260+", label: "API Endpoints" }, { value: "260+", label: "API Endpoints" },
{ value: "31", label: "Languages" }, { value: "31", label: "Languages" },
+2 -2
View File
@@ -34,7 +34,7 @@ export default function DocsFirstServicePage() {
<h2>Three ways to add a service</h2> <h2>Three ways to add a service</h2>
<h3>1. Pick from 76 one-click templates</h3> <h3>1. Pick from 93 one-click templates</h3>
<p> <p>
The template library covers the most popular self-hosted applications media servers, dashboards, The template library covers the most popular self-hosted applications media servers, dashboards,
databases, note apps, automation tools, and more. Each template bundles sane defaults for ports, databases, note apps, automation tools, and more. Each template bundles sane defaults for ports,
@@ -62,7 +62,7 @@ export default function DocsFirstServicePage() {
<h3>Step 1: Open the template library</h3> <h3>Step 1: Open the template library</h3>
<p> <p>
From the dashboard sidebar, click <strong>New Service From Template</strong>. The template library From the dashboard sidebar, click <strong>New Service From Template</strong>. The template library
opens with a searchable grid of 76 applications. opens with a searchable grid of 93 applications.
</p> </p>
<h3>Step 2: Find Plex</h3> <h3>Step 2: Find Plex</h3>
+1 -1
View File
@@ -27,7 +27,7 @@ export default function DocsIntegrationsPage() {
Docker (and Docker Compose) is the runtime foundation for every deployment workflow, container lifecycle action, Docker (and Docker Compose) is the runtime foundation for every deployment workflow, container lifecycle action,
service discovery sweep, and template-based launch. DashCaddy communicates with the Docker daemon over the service discovery sweep, and template-based launch. DashCaddy communicates with the Docker daemon over the
Unix socket (<code>/var/run/docker.sock</code>) to start, stop, restart, inspect, and adopt containers, and to Unix socket (<code>/var/run/docker.sock</code>) to start, stop, restart, inspect, and adopt containers, and to
deploy the <strong>76 one-click application templates</strong> from the catalog. deploy the <strong>93 one-click application templates</strong> from the catalog.
</p> </p>
<p> <p>
The daemon connection is established at startup. If the socket is missing or permissioned for a different user, The daemon connection is established at startup. If the socket is missing or permissioned for a different user,
+1 -1
View File
@@ -162,7 +162,7 @@ export default function DocsOverviewPage() {
<tr className="border-b border-surface-800"> <tr className="border-b border-surface-800">
<td className="py-3 pr-4">Docker deployment</td> <td className="py-3 pr-4">Docker deployment</td>
<td className="py-3 pr-4">Manual compose files</td> <td className="py-3 pr-4">Manual compose files</td>
<td className="py-3 pr-4">76 one-click templates</td> <td className="py-3 pr-4">93 one-click templates</td>
<td className="py-3">Templates + Recipes</td> <td className="py-3">Templates + Recipes</td>
</tr> </tr>
<tr className="border-b border-surface-800"> <tr className="border-b border-surface-800">
+1 -1
View File
@@ -39,7 +39,7 @@ export default function DocsPremiumPage() {
</thead> </thead>
<tbody> <tbody>
<tr><td>Dashboard &amp; web UI</td><td></td><td></td></tr> <tr><td>Dashboard &amp; web UI</td><td></td><td></td></tr>
<tr><td>76 application templates</td><td></td><td></td></tr> <tr><td>93 application templates</td><td></td><td></td></tr>
<tr><td>Caddy reverse proxy + auto HTTPS</td><td></td><td></td></tr> <tr><td>Caddy reverse proxy + auto HTTPS</td><td></td><td></td></tr>
<tr><td>Caddyfile-as-Code builder</td><td></td><td></td></tr> <tr><td>Caddyfile-as-Code builder</td><td></td><td></td></tr>
<tr><td>Technitium DNS automation</td><td></td><td></td></tr> <tr><td>Technitium DNS automation</td><td></td><td></td></tr>
+3 -3
View File
@@ -40,11 +40,11 @@ export default function FeaturesPage() {
id: 'app-deployment', id: 'app-deployment',
title: 'App Deployment', title: 'App Deployment',
description: description:
'Deploy from a library of 76 pre-configured Docker templates with one click. Automatic configuration, smart defaults, and service discovery that auto-detects running containers and lets you adopt them instantly. From zero to live in seconds.', 'Deploy from a library of 93 pre-configured Docker templates with one click. Automatic configuration, smart defaults, and service discovery that auto-detects running containers and lets you adopt them instantly. From zero to live in seconds.',
icon: '🚀', icon: '🚀',
features: [ features: [
{ icon: '⚡', label: 'One-click deployment' }, { icon: '⚡', label: 'One-click deployment' },
{ icon: '📦', label: '76 app templates' }, { icon: '📦', label: '93 app templates' },
{ icon: '⚙️', label: 'Automatic configuration' }, { icon: '⚙️', label: 'Automatic configuration' },
{ icon: '🔍', label: 'Service Discovery & auto-adopt' }, { icon: '🔍', label: 'Service Discovery & auto-adopt' },
{ icon: '🧙', label: 'Smart Defaults Wizard' }, { icon: '🧙', label: 'Smart Defaults Wizard' },
@@ -350,7 +350,7 @@ export default function FeaturesPage() {
</div> </div>
<ul className="space-y-3"> <ul className="space-y-3">
{[ {[
'76 one-click app templates', '93 one-click app templates',
'Automatic SSL certificates', 'Automatic SSL certificates',
'Technitium DNS automation', 'Technitium DNS automation',
'Reverse proxy + Caddyfile builder', 'Reverse proxy + Caddyfile builder',
+3 -3
View File
@@ -4,7 +4,7 @@ import "./globals.css";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "DashCaddy - Self-Hosting Made Beautiful", title: "DashCaddy - Self-Hosting Made Beautiful",
description: description:
"Deploy 76 Docker apps with one click. AI-powered self-hosting with automatic SSL, DNS, reverse proxy, security center, and fleet management.", "Deploy 93 Docker apps with one click. AI-powered self-hosting with automatic SSL, DNS, reverse proxy, security center, and fleet management.",
keywords: [ keywords: [
"self-hosting", "self-hosting",
"docker", "docker",
@@ -19,7 +19,7 @@ export const metadata: Metadata = {
openGraph: { openGraph: {
title: "DashCaddy - Self-Hosting Made Beautiful", title: "DashCaddy - Self-Hosting Made Beautiful",
description: description:
"Deploy 76 Docker apps with one click. AI-powered self-hosting with automatic SSL, DNS, and reverse proxy.", "Deploy 93 Docker apps with one click. AI-powered self-hosting with automatic SSL, DNS, and reverse proxy.",
url: "https://dashcaddy.net", url: "https://dashcaddy.net",
siteName: "DashCaddy", siteName: "DashCaddy",
type: "website", type: "website",
@@ -28,7 +28,7 @@ export const metadata: Metadata = {
card: "summary_large_image", card: "summary_large_image",
title: "DashCaddy - Self-Hosting Made Beautiful", title: "DashCaddy - Self-Hosting Made Beautiful",
description: description:
"Deploy 76 Docker apps with one click. AI-powered self-hosting.", "Deploy 93 Docker apps with one click. AI-powered self-hosting.",
}, },
}; };
+4 -4
View File
@@ -44,7 +44,7 @@ export default function Home() {
<p className="text-xl text-surface-300 max-w-lg leading-relaxed"> <p className="text-xl text-surface-300 max-w-lg leading-relaxed">
Just say &ldquo;deploy Plex&rdquo; DashCaddy&rsquo;s AI Intent Router handles the rest. Just say &ldquo;deploy Plex&rdquo; DashCaddy&rsquo;s AI Intent Router handles the rest.
Deploy Docker apps with one click, automatic SSL, DNS, and reverse proxy. Deploy Docker apps with one click, automatic SSL, DNS, and reverse proxy.
76 templates, fleet management, and an MCP control plane for AI assistants. 93 templates, fleet management, and an MCP control plane for AI assistants.
Everything you need for self-hosted perfection. Everything you need for self-hosted perfection.
</p> </p>
</div> </div>
@@ -206,8 +206,8 @@ export default function Home() {
/> />
<FeatureCard <FeatureCard
icon="🚀" icon="🚀"
title="76 App Templates" title="93 App Templates"
description="Choose from 76 pre-configured Docker app templates. Deploy your favorite applications instantly without manual configuration." description="Choose from 93 pre-configured Docker app templates. Deploy your favorite applications instantly without manual configuration."
/> />
<FeatureCard <FeatureCard
icon="🛡️" icon="🛡️"
@@ -396,7 +396,7 @@ export default function Home() {
<span className="text-surface-500">Write your own compose files</span> <span className="text-surface-500">Write your own compose files</span>
</td> </td>
<td className="px-6 py-4 text-center text-sm"> <td className="px-6 py-4 text-center text-sm">
<span className="text-green-400 font-semibold"> 76 pre-configured</span> <span className="text-green-400 font-semibold"> 93 pre-configured</span>
</td> </td>
</tr> </tr>
<tr className="hover:bg-surface-800/30 transition-colors"> <tr className="hover:bg-surface-800/30 transition-colors">
+3 -3
View File
@@ -36,7 +36,7 @@ export default function PricingPage() {
const coreFeatures = [ const coreFeatures = [
'Dashboard & real-time service monitoring', 'Dashboard & real-time service monitoring',
'76 pre-configured app templates', '93 pre-configured app templates',
'Automatic SSL via Caddy internal CA', 'Automatic SSL via Caddy internal CA',
'DNS automation via Technitium DNS', 'DNS automation via Technitium DNS',
'Reverse proxy management + Caddyfile-as-Code', 'Reverse proxy management + Caddyfile-as-Code',
@@ -78,7 +78,7 @@ export default function PricingPage() {
}, },
{ {
question: 'Can I use DashCaddy without Premium?', question: 'Can I use DashCaddy without Premium?',
answer: 'Absolutely. The core platform is fully functional without a license — including AI commands, the Security Center, service discovery, monitoring, backup, and all 76 app templates. Premium unlocks SSO, Recipes, Swarm orchestration, and Fleet Management for advanced multi-node setups.', answer: 'Absolutely. The core platform is fully functional without a license — including AI commands, the Security Center, service discovery, monitoring, backup, and all 93 app templates. Premium unlocks SSO, Recipes, Swarm orchestration, and Fleet Management for advanced multi-node setups.',
}, },
{ {
question: 'How many machines can I activate?', question: 'How many machines can I activate?',
@@ -110,7 +110,7 @@ export default function PricingPage() {
Simple, Transparent <span className="text-brand-400">Pricing</span> Simple, Transparent <span className="text-brand-400">Pricing</span>
</h1> </h1>
<p className="text-xl text-surface-300 mb-8 max-w-2xl mx-auto"> <p className="text-xl text-surface-300 mb-8 max-w-2xl mx-auto">
The core platform is completely free including AI commands, Security Center, and all 76 app templates. Premium unlocks advanced orchestration with a one-time payment. The core platform is completely free including AI commands, Security Center, and all 93 app templates. Premium unlocks advanced orchestration with a one-time payment.
</p> </p>
</div> </div>
</section> </section>
+19 -3
View File
@@ -9,7 +9,7 @@ interface App {
} }
// All apps below have real deployable templates in DashCaddy. // All apps below have real deployable templates in DashCaddy.
// Verified against src/docker/app-templates.js (76 templates, Aug 2026). // Verified against src/docker/app-templates.js (93 templates, Aug 2026).
const apps: App[] = [ const apps: App[] = [
// Media // Media
{ name: 'Plex', icon: '🎬', category: 'Media' }, { name: 'Plex', icon: '🎬', category: 'Media' },
@@ -21,6 +21,7 @@ const apps: App[] = [
{ name: 'Calibre-Web', icon: '📖', category: 'Media' }, { name: 'Calibre-Web', icon: '📖', category: 'Media' },
{ name: 'Komga', icon: '📚', category: 'Media' }, { name: 'Komga', icon: '📚', category: 'Media' },
{ name: 'Kavita', icon: '📖', category: 'Media' }, { name: 'Kavita', icon: '📖', category: 'Media' },
{ name: 'Subsonic', icon: '🎵', category: 'Media' },
// Media Management // Media Management
{ name: 'Sonarr', icon: '📺', category: 'Media Mgmt' }, { name: 'Sonarr', icon: '📺', category: 'Media Mgmt' },
@@ -49,6 +50,10 @@ const apps: App[] = [
{ name: 'Paperless-ngx', icon: '📚', category: 'Productivity' }, { name: 'Paperless-ngx', icon: '📚', category: 'Productivity' },
{ name: 'Trilium Notes', icon: '🗒️', category: 'Productivity' }, { name: 'Trilium Notes', icon: '🗒️', category: 'Productivity' },
{ name: 'Excalidraw', icon: '🎨', category: 'Productivity' }, { name: 'Excalidraw', icon: '🎨', category: 'Productivity' },
{ name: 'HedgeDoc', icon: '📝', category: 'Productivity' },
{ name: 'OpenProject', icon: '📋', category: 'Productivity' },
{ name: 'Plane', icon: '✈️', category: 'Productivity' },
{ name: 'Vikunja', icon: '✅', category: 'Productivity' },
// Photos // Photos
{ name: 'Immich', icon: '📸', category: 'Photos' }, { name: 'Immich', icon: '📸', category: 'Photos' },
@@ -62,28 +67,38 @@ const apps: App[] = [
// Management // Management
{ name: 'Portainer', icon: '🐳', category: 'Management' }, { name: 'Portainer', icon: '🐳', category: 'Management' },
{ name: 'Watchtower', icon: '👓', category: 'Management' }, { name: 'Watchtower', icon: '👓', category: 'Management' },
{ name: 'Yacht', icon: '⛵', category: 'Management' },
// Security // Security
{ name: 'Vaultwarden', icon: '🔑', category: 'Security' }, { name: 'Vaultwarden', icon: '🔑', category: 'Security' },
{ name: 'DashCA', icon: '🔐', category: 'Security' }, { name: 'DashCA', icon: '🔐', category: 'Security' },
{ name: 'Authentik', icon: '🔐', category: 'Security' }, { name: 'Authentik', icon: '🔐', category: 'Security' },
{ name: 'CrowdSec', icon: '🛡️', category: 'Security' }, { name: 'CrowdSec', icon: '🛡️', category: 'Security' },
{ name: 'Authelia', icon: '🔐', category: 'Security' },
{ name: 'Bitwarden', icon: '🔑', category: 'Security' },
{ name: 'Keycloak', icon: '🔑', category: 'Security' },
// Development // Development
{ name: 'VS Code Server', icon: '💻', category: 'Development' }, { name: 'VS Code Server', icon: '💻', category: 'Development' },
{ name: 'Gitea', icon: '🦊', category: 'Development' }, { name: 'Gitea', icon: '🦊', category: 'Development' },
{ name: 'Jenkins', icon: '🔧', category: 'Development' }, { name: 'Jenkins', icon: '🔧', category: 'Development' },
{ name: 'Drone CI', icon: '🐝', category: 'Development' }, { name: 'Drone CI', icon: '🐝', category: 'Development' },
{ name: 'Forgejo', icon: '🦊', category: 'Development' },
{ name: 'GitLab', icon: '🦊', category: 'Development' },
// Monitoring // Monitoring
{ name: 'Grafana', icon: '📊', category: 'Monitoring' }, { name: 'Grafana', icon: '📊', category: 'Monitoring' },
{ name: 'Uptime Kuma', icon: '📈', category: 'Monitoring' }, { name: 'Uptime Kuma', icon: '📈', category: 'Monitoring' },
{ name: 'Speedtest Tracker', icon: '⚡', category: 'Monitoring' }, { name: 'Speedtest Tracker', icon: '⚡', category: 'Monitoring' },
{ name: 'Dozzle', icon: '📜', category: 'Monitoring' }, { name: 'Dozzle', icon: '📜', category: 'Monitoring' },
{ name: 'Kibana', icon: '📊', category: 'Monitoring' },
{ name: 'Netdata', icon: '📈', category: 'Monitoring' },
{ name: 'Prometheus', icon: '🔥', category: 'Monitoring' },
// Networking // Networking
{ name: 'Pi-hole', icon: '🛡️', category: 'Networking' }, { name: 'Pi-hole', icon: '🛡️', category: 'Networking' },
{ name: 'WireGuard VPN', icon: '🔒', category: 'Networking' }, { name: 'WireGuard VPN', icon: '🔒', category: 'Networking' },
{ name: 'OpenVPN', icon: '🔒', category: 'Networking' },
// DNS // DNS
{ name: 'Technitium DNS Server', icon: '🌐', category: 'DNS' }, { name: 'Technitium DNS Server', icon: '🌐', category: 'DNS' },
@@ -110,6 +125,7 @@ const apps: App[] = [
// Home Automation // Home Automation
{ name: 'Home Assistant', icon: '🏠', category: 'Home Automation' }, { name: 'Home Assistant', icon: '🏠', category: 'Home Automation' },
{ name: 'Node-RED', icon: '🔴', category: 'Home Automation' }, { name: 'Node-RED', icon: '🔴', category: 'Home Automation' },
{ name: 'OpenHAB', icon: '🏠', category: 'Home Automation' },
// Utilities // Utilities
{ name: 'Weather', icon: '🌤️', category: 'Utilities' }, { name: 'Weather', icon: '🌤️', category: 'Utilities' },
@@ -158,7 +174,7 @@ export default function AppShowcase() {
{/* Header */} {/* Header */}
<div className="mb-12 text-center"> <div className="mb-12 text-center">
<h2 className="text-3xl sm:text-4xl font-bold text-surface-50 mb-4"> <h2 className="text-3xl sm:text-4xl font-bold text-surface-50 mb-4">
76 One-Click App Templates 93 One-Click App Templates
</h2> </h2>
<p className="text-lg text-surface-400 max-w-2xl mx-auto"> <p className="text-lg text-surface-400 max-w-2xl mx-auto">
Deploy your favorite apps instantly with pre-configured templates, automatic SSL certificates, and integrated DNS management. Deploy your favorite apps instantly with pre-configured templates, automatic SSL certificates, and integrated DNS management.
@@ -216,7 +232,7 @@ export default function AppShowcase() {
<div className="mt-16 grid grid-cols-3 gap-4 sm:gap-8"> <div className="mt-16 grid grid-cols-3 gap-4 sm:gap-8">
<div className="text-center"> <div className="text-center">
<div className="text-3xl sm:text-4xl font-bold text-brand-400 mb-2"> <div className="text-3xl sm:text-4xl font-bold text-brand-400 mb-2">
76 93
</div> </div>
<p className="text-sm text-surface-400">App Templates</p> <p className="text-sm text-surface-400">App Templates</p>
</div> </div>