Compare commits
12
Commits
166eb8cde8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd6f174a69 | ||
|
|
77ef6a96f6 | ||
|
|
09a97ab7fb | ||
|
|
a707816668 | ||
|
|
1d0ffaee55 | ||
|
|
2bf50e0b4e | ||
|
|
66ecab20d7 | ||
|
|
6d4a4db12d | ||
|
|
95661113c0 | ||
|
|
1637d4862d | ||
|
|
3bc5b3f90c | ||
|
|
cb2c6d6d2f |
No files matched your search
@@ -4,7 +4,9 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
|
"prebuild": "node scripts/generate-sitemap.mjs",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
|
"postbuild": "node scripts/inject-structured-data.mjs",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint"
|
"lint": "eslint"
|
||||||
},
|
},
|
||||||
|
|||||||
+150
@@ -0,0 +1,150 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>DashCaddy Blog</title>
|
||||||
|
<link>https://dashcaddy.net/blog/</link>
|
||||||
|
<description>Self-hosting deep-dives, product updates, and practical guides to running your own infrastructure.</description>
|
||||||
|
<language>en-us</language>
|
||||||
|
<atom:link href="https://dashcaddy.net/feed.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Why ShipDeck Replaced Docker: One Binary, No Disk Bloat</title>
|
||||||
|
<link>https://dashcaddy.net/blog/why-shipdeck-replaced-docker/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/why-shipdeck-replaced-docker/</guid>
|
||||||
|
<pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Docker was eating disk space with overlay filesystems and build caches, so we built ShipDeck — a single Go binary that replaces Docker, Docker Compose, and handwritten deploy scripts. No daemon, no layered filesystems, no bloat.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>HTTPS for Your Homelab Should Be Invisible</title>
|
||||||
|
<link>https://dashcaddy.net/blog/https-for-homelab-should-be-invisible/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/https-for-homelab-should-be-invisible/</guid>
|
||||||
|
<pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Self-hosted apps deserve HTTPS too — but certbot, DNS challenges, and expired certificates turn a basic need into a maintenance chore. DashCaddy's internal CA with Caddy PKI and one-click device trust makes HTTPS the default, not a side project.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>The Real Cost of Cloud Subscriptions in 2026 (And What Self-Hosting Saves)</title>
|
||||||
|
<link>https://dashcaddy.net/blog/real-cost-of-cloud-subscriptions-2026/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/real-cost-of-cloud-subscriptions-2026/</guid>
|
||||||
|
<pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Cloud subscriptions add up faster than most people realize — $80-150/month for services you could run on a $300 machine. Here's the actual math, what you can replace, and how to start.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Docker Dashboard for Self-Hosted Apps: Why DashCaddy Beats Portainer</title>
|
||||||
|
<link>https://dashcaddy.net/blog/docker-dashboard-self-hosted/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/docker-dashboard-self-hosted/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Compare DashCaddy vs Portainer for managing self-hosted Docker containers. Learn about AI-powered deployment, automatic SSL, and multi-host management.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>What is DashCaddy? The AI-Powered Self-Hosting Platform Explained</title>
|
||||||
|
<link>https://dashcaddy.net/blog/what-is-dashcaddy/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/what-is-dashcaddy/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Learn what DashCaddy is—an AI-native platform for deploying, securing, and managing self-hosted applications with plain English commands.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Self-Hosted Docker Container Management Made Simple</title>
|
||||||
|
<link>https://dashcaddy.net/blog/docker-container-management/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/docker-container-management/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Master Docker container management in your homelab. Compare methods, learn best practices, and discover how DashCaddy simplifies running containers.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Why Self-Host Your Applications? The Complete Benefits Guide</title>
|
||||||
|
<link>https://dashcaddy.net/blog/why-self-host-benefits/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/why-self-host-benefits/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Discover why self-hosting your applications saves money, improves privacy, and gives you control. Learn what's possible when you run your own services.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>How to Access Self-Hosted Apps Remotely (Without Exposing Your Network)</title>
|
||||||
|
<link>https://dashcaddy.net/blog/access-self-hosted-apps-remotely/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/access-self-hosted-apps-remotely/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Port forwarding, VPNs, and private networks compared. Learn the safe way to reach self-hosted apps from anywhere, and how to scope a service to your own devices.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>One-Click Docker Deployment: From Blank Server to Running App</title>
|
||||||
|
<link>https://dashcaddy.net/blog/one-click-docker-deployment/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/one-click-docker-deployment/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>What one-click Docker deployment really involves — image, volumes, ports, DNS, TLS, and health checks — and how to get all of it in a single action.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Self-Hosting Platform: What It Is and How to Choose One in 2026</title>
|
||||||
|
<link>https://dashcaddy.net/blog/self-hosting-platform-guide/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/self-hosting-platform-guide/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>A self-hosting platform turns a bare Linux server into somewhere you can run apps safely. Learn the categories, the questions that matter, and how to pick one.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>77 Self-Hosted Apps You Can Install in One Click (Full Catalog)</title>
|
||||||
|
<link>https://dashcaddy.net/blog/self-hosted-app-catalog-guide/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/self-hosted-app-catalog-guide/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>A complete map of the 78 apps DashCaddy can deploy in one click — media, files, photos, DNS, security, databases, automation and more, each with its own install guide.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Self-Host Your Photo Library: Immich in 10 Minutes</title>
|
||||||
|
<link>https://dashcaddy.net/blog/self-host-your-photo-library/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/self-host-your-photo-library/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Stop paying a monthly subscription to look at your own photos. Deploy Immich with one click, put it behind HTTPS, and get automatic phone backup onto hardware you own.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Self-Host Vaultwarden in 10 Minutes (Your Own Password Manager)</title>
|
||||||
|
<link>https://dashcaddy.net/blog/self-host-vaultwarden/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/self-host-vaultwarden/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Run your own Bitwarden-compatible password manager on your own server: install Vaultwarden with one click, put it on HTTPS, and keep your vaults off someone else's cloud.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Getting Started with DashCaddy: From Blank Server to a Running App</title>
|
||||||
|
<link>https://dashcaddy.net/blog/getting-started-with-dashcaddy/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/getting-started-with-dashcaddy/</guid>
|
||||||
|
<pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>A step-by-step walkthrough: pick a server, install DashCaddy with one command, open the dashboard, deploy your first self-hosted app, and get it on HTTPS.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Homelab Monitoring: Know When a Docker Service Goes Down</title>
|
||||||
|
<link>https://dashcaddy.net/blog/homelab-monitoring-guide/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/homelab-monitoring-guide/</guid>
|
||||||
|
<pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Build practical homelab monitoring across hosts, Docker, application health, DNS, HTTPS, and backups, with DashCaddy as the operating view.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Homelab Reverse Proxy Guide: HTTPS, DNS, and Caddy</title>
|
||||||
|
<link>https://dashcaddy.net/blog/homelab-reverse-proxy-guide/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/homelab-reverse-proxy-guide/</guid>
|
||||||
|
<pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Learn how a homelab reverse proxy connects DNS, HTTPS, Caddy, and private services—and how DashCaddy reduces repeated configuration work.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>15 Best Self-Hosted Apps for Your Homelab in 2026</title>
|
||||||
|
<link>https://dashcaddy.net/blog/best-self-hosted-apps-homelab/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/best-self-hosted-apps-homelab/</guid>
|
||||||
|
<pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Discover 15 useful self-hosted apps for media, photos, files, automation, monitoring, and privacy—all available in DashCaddy's app catalog.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Best Homelab Dashboard: What to Look For in 2026</title>
|
||||||
|
<link>https://dashcaddy.net/blog/best-homelab-dashboard/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/best-homelab-dashboard/</guid>
|
||||||
|
<pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Compare homelab dashboard types and learn which deployment, health, HTTPS, security, and automation features make a home server easier to manage.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>How to Build a Homelab: A Beginner's Home Server Guide</title>
|
||||||
|
<link>https://dashcaddy.net/blog/homelab-beginners-guide/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/homelab-beginners-guide/</guid>
|
||||||
|
<pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Learn how to build a homelab from spare hardware, Docker, DNS, HTTPS, monitoring, and backups—and see how DashCaddy simplifies the work.</description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Deploy Self-Hosted Apps From Plain English: DashCaddy's AI Intent Router</title>
|
||||||
|
<link>https://dashcaddy.net/blog/deploy-self-hosted-apps-with-ai/</link>
|
||||||
|
<guid isPermaLink="true">https://dashcaddy.net/blog/deploy-self-hosted-apps-with-ai/</guid>
|
||||||
|
<pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>How DashCaddy turns a plain-English request into a running, SSL-secured container — 78 one-click app templates, an MCP server for AI assistants, and 400+ registered REST route handlers.</description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
+13
-6
@@ -1,7 +1,7 @@
|
|||||||
# DashCaddy
|
# DashCaddy
|
||||||
|
|
||||||
> DashCaddy is an AI-native self-hosting platform: deploy, secure, and manage
|
> DashCaddy is an AI-native self-hosting platform: deploy, secure, and manage
|
||||||
> self-hosted apps from one dashboard. It ships 77 one-click application
|
> self-hosted apps from one dashboard. It ships 78 one-click application
|
||||||
> templates, automatic SSL, a Security Center, multi-host fleet management,
|
> templates, automatic SSL, a Security Center, multi-host fleet management,
|
||||||
> 400+ registered REST route handlers, and a built-in MCP server so AI assistants
|
> 400+ registered REST route handlers, and a built-in MCP server so AI assistants
|
||||||
> can operate it directly. Runs on any Linux host via Docker.
|
> can operate it directly. Runs on any Linux host via Docker.
|
||||||
@@ -41,16 +41,23 @@ public domain, or an internal CA for a custom TLD). Desktop apps
|
|||||||
|
|
||||||
After install, DashCaddy exposes a built-in MCP (Model Context Protocol) server
|
After install, DashCaddy exposes a built-in MCP (Model Context Protocol) server
|
||||||
with named tools — for example listing services, checking service and system
|
with named tools — for example listing services, checking service and system
|
||||||
health, searching the app catalog, and running container actions. DashCaddy exposes
|
health, searching the app catalog, running container actions, deploying apps,
|
||||||
400+ registered REST route handlers for deployment, lifecycle, health, security,
|
creating backups, and reading fleet status. The authoritative, always-current
|
||||||
backups, and fleet operations. It also exposes a WebSocket channel for live
|
list is machine-readable at runtime: **GET https://<your-dashboard>/api/v1/capabilities**
|
||||||
updates.
|
(public, no auth) returns this exact build's version, template count and
|
||||||
|
categories, MCP tool names, protocol revisions, and premium feature list —
|
||||||
|
prefer it over any static prose (including this file) when they disagree.
|
||||||
|
DashCaddy also exposes 400+ registered REST route handlers for deployment,
|
||||||
|
lifecycle, health, security, backups, and fleet operations, described by an
|
||||||
|
OpenAPI 3 spec at GET /api/v1/docs/spec (requires an API key). A WebSocket
|
||||||
|
channel provides live updates. Premium (paid) gates: SSO, Recipes, Swarm,
|
||||||
|
Multi-Host Fleet, Workflow Automation, Scheduled Backups.
|
||||||
|
|
||||||
## Key links
|
## Key links
|
||||||
|
|
||||||
- [Install guide](https://dashcaddy.net/docs/installation/): full prerequisites, hostname options, hardening, and verification steps
|
- [Install guide](https://dashcaddy.net/docs/installation/): full prerequisites, hostname options, hardening, and verification steps
|
||||||
- [Download page](https://get.dashcaddy.net): the install script plus desktop app installers (Windows, macOS, Linux)
|
- [Download page](https://get.dashcaddy.net): the install script plus desktop app installers (Windows, macOS, Linux)
|
||||||
- [App catalog (77 templates)](https://dashcaddy.net/docs/catalog/): every one-click app, by category
|
- [App catalog (78 templates)](https://dashcaddy.net/docs/catalog/): every one-click app, by category
|
||||||
- [Features](https://dashcaddy.net/features/): AI Intent Router, MCP server, Security Center, Fleet Management, Secure Share Links
|
- [Features](https://dashcaddy.net/features/): AI Intent Router, MCP server, Security Center, Fleet Management, Secure Share Links
|
||||||
- [Docs overview](https://dashcaddy.net/docs/): getting started, first service, integrations, troubleshooting
|
- [Docs overview](https://dashcaddy.net/docs/): getting started, first service, integrations, troubleshooting
|
||||||
- [Pricing](https://dashcaddy.net/pricing/): free tier plus fixed-duration premium licenses
|
- [Pricing](https://dashcaddy.net/pricing/): free tier plus fixed-duration premium licenses
|
||||||
|
|||||||
@@ -2,3 +2,4 @@ User-Agent: *
|
|||||||
Allow: /
|
Allow: /
|
||||||
Sitemap: https://dashcaddy.net/sitemap.xml
|
Sitemap: https://dashcaddy.net/sitemap.xml
|
||||||
Host: https://dashcaddy.net
|
Host: https://dashcaddy.net
|
||||||
|
LLMs-Txt: https://dashcaddy.net/llms.txt
|
||||||
+595
-14
@@ -1,17 +1,598 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url><loc>https://dashcaddy.net/</loc><changefreq>weekly</changefreq><priority>1.0</priority></url>
|
<url>
|
||||||
<url><loc>https://dashcaddy.net/features/</loc><changefreq>monthly</changefreq><priority>0.9</priority></url>
|
<loc>https://dashcaddy.net/</loc>
|
||||||
<url><loc>https://dashcaddy.net/pricing/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
<changefreq>weekly</changefreq>
|
||||||
<url><loc>https://dashcaddy.net/docs/</loc><changefreq>weekly</changefreq><priority>0.9</priority></url>
|
<priority>1.0</priority>
|
||||||
<url><loc>https://dashcaddy.net/docs/installation/</loc><changefreq>monthly</changefreq><priority>0.9</priority></url>
|
</url>
|
||||||
<url><loc>https://dashcaddy.net/docs/catalog/</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
<url>
|
||||||
<url><loc>https://dashcaddy.net/about/</loc><changefreq>monthly</changefreq><priority>0.7</priority></url>
|
<loc>https://dashcaddy.net/about/</loc>
|
||||||
<url><loc>https://dashcaddy.net/blog/</loc><changefreq>weekly</changefreq><priority>0.9</priority></url>
|
<changefreq>monthly</changefreq>
|
||||||
<url><loc>https://dashcaddy.net/blog/deploy-self-hosted-apps-with-ai/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
<priority>0.6</priority>
|
||||||
<url><loc>https://dashcaddy.net/blog/homelab-beginners-guide/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
</url>
|
||||||
<url><loc>https://dashcaddy.net/blog/best-homelab-dashboard/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
<url>
|
||||||
<url><loc>https://dashcaddy.net/blog/best-self-hosted-apps-homelab/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
<loc>https://dashcaddy.net/blog/</loc>
|
||||||
<url><loc>https://dashcaddy.net/blog/homelab-reverse-proxy-guide/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
<changefreq>weekly</changefreq>
|
||||||
<url><loc>https://dashcaddy.net/blog/homelab-monitoring-guide/</loc><changefreq>monthly</changefreq><priority>0.8</priority></url>
|
<priority>0.9</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/access-self-hosted-apps-remotely/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/best-homelab-dashboard/</loc>
|
||||||
|
<lastmod>2026-10-06</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/best-self-hosted-apps-homelab/</loc>
|
||||||
|
<lastmod>2026-10-06</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/deploy-self-hosted-apps-with-ai/</loc>
|
||||||
|
<lastmod>2026-10-05</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/docker-container-management/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/docker-dashboard-self-hosted/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/getting-started-with-dashcaddy/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/homelab-beginners-guide/</loc>
|
||||||
|
<lastmod>2026-10-06</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/homelab-monitoring-guide/</loc>
|
||||||
|
<lastmod>2026-10-06</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/homelab-reverse-proxy-guide/</loc>
|
||||||
|
<lastmod>2026-10-06</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/https-for-homelab-should-be-invisible/</loc>
|
||||||
|
<lastmod>2026-10-08</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/one-click-docker-deployment/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/real-cost-of-cloud-subscriptions-2026/</loc>
|
||||||
|
<lastmod>2026-10-08</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/self-host-vaultwarden/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/self-host-your-photo-library/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/self-hosted-app-catalog-guide/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/self-hosting-platform-guide/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/what-is-dashcaddy/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/why-self-host-benefits/</loc>
|
||||||
|
<lastmod>2026-10-07</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/blog/why-shipdeck-replaced-docker/</loc>
|
||||||
|
<lastmod>2026-10-08</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.9</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/api/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/actual-budget/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/adminer/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/airsonic/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/audiobookshelf/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/authentik/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/bazarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/bind9/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/bookstack/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/calibre-web/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/changedetection/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/coredns/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/crowdsec/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/dashca/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/digital-clock/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/dozzle/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/drone/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/emby/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/excalidraw/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/filebrowser/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/gitea/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/grafana/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/homarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/homeassistant/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/homepage/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/immich/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/it-tools/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/jdownloader/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/jellyfin/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/jenkins/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/kavita/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/komga/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/lidarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/mailserver/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/matrix/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/mealie/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/minecraft/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/mongodb/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/navidrome/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/nextcloud/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/nodered/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/nzbget/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/outline/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/paperless-ngx/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/photoprism/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/pihole/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/plex/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/portainer/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/postgres/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/powerdns/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/prowlarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/qbittorrent/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/radarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/radicale/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/readarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/redis/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/rocketchat/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/roundcube/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/sabnzbd/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/sami-files/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/seerr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/sonarr/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/speedtest/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/standardnotes/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/stirling-pdf/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/syncthing/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/tautulli/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/technitium/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/transmission/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/trilium/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/uptime-kuma/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/valheim/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/vaultwarden/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/vintage-radio/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/vscode-server/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/watchtower/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/weather/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/whoami/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/catalog/wireguard/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/desktop-app/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/first-service/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/installation/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/integrations/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/overview/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/premium/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/docs/troubleshooting/</loc>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/features/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.9</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/policies/privacy/</loc>
|
||||||
|
<changefreq>yearly</changefreq>
|
||||||
|
<priority>0.3</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/policies/terms/</loc>
|
||||||
|
<changefreq>yearly</changefreq>
|
||||||
|
<priority>0.3</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://dashcaddy.net/pricing/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
</urlset>
|
</urlset>
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
/**
|
||||||
|
* Generate public/sitemap.xml and public/feed.xml from the real route tree
|
||||||
|
* and the blog manifest.
|
||||||
|
*
|
||||||
|
* Runs automatically before `next build` (see the "prebuild" npm script), so
|
||||||
|
* the deployed sitemap can never drift from the pages that actually exist.
|
||||||
|
* Fails loudly if the blog manifest cannot be parsed, rather than silently
|
||||||
|
* emitting a partial sitemap.
|
||||||
|
*/
|
||||||
|
import fs from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
||||||
|
const APP_DIR = path.join(root, "src", "app");
|
||||||
|
const MANIFEST = path.join(root, "src", "content", "blog", "manifest.ts");
|
||||||
|
const PUBLIC_DIR = path.join(root, "public");
|
||||||
|
const ORIGIN = "https://dashcaddy.net";
|
||||||
|
const SITE_DESCRIPTION =
|
||||||
|
"Self-hosting deep-dives, product updates, and practical guides to running your own infrastructure.";
|
||||||
|
|
||||||
|
// Pages that must never be advertised to crawlers.
|
||||||
|
const EXCLUDE = new Set(["/success/", "/404/", "/500/"]);
|
||||||
|
|
||||||
|
function walk(dir) {
|
||||||
|
const found = [];
|
||||||
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
||||||
|
const full = path.join(dir, entry.name);
|
||||||
|
if (entry.isDirectory()) found.push(...walk(full));
|
||||||
|
else if (entry.name === "page.tsx") found.push(full);
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
function routeFor(file) {
|
||||||
|
const rel = path.relative(APP_DIR, path.dirname(file));
|
||||||
|
const parts = rel
|
||||||
|
.split(path.sep)
|
||||||
|
.filter((part) => part && part !== "." && !/^\(.*\)$/.test(part));
|
||||||
|
// Dynamic segments ([slug]) are expanded from data sources, not enumerated.
|
||||||
|
if (parts.some((part) => part.startsWith("["))) return null;
|
||||||
|
return "/" + parts.join("/") + (parts.length ? "/" : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function meta(route) {
|
||||||
|
if (route === "/") return { priority: "1.0", changefreq: "weekly" };
|
||||||
|
if (route === "/blog/" || route === "/docs/" || route === "/features/")
|
||||||
|
return { priority: "0.9", changefreq: "weekly" };
|
||||||
|
if (route === "/pricing/" || route === "/docs/catalog/")
|
||||||
|
return { priority: "0.8", changefreq: "weekly" };
|
||||||
|
if (route.startsWith("/docs/catalog/")) return { priority: "0.6", changefreq: "monthly" };
|
||||||
|
if (route.startsWith("/docs/")) return { priority: "0.7", changefreq: "monthly" };
|
||||||
|
if (route === "/about/") return { priority: "0.6", changefreq: "monthly" };
|
||||||
|
if (route.startsWith("/policies/")) return { priority: "0.3", changefreq: "yearly" };
|
||||||
|
return { priority: "0.5", changefreq: "monthly" };
|
||||||
|
}
|
||||||
|
|
||||||
|
function xmlEscape(value) {
|
||||||
|
return value
|
||||||
|
.replace(/&/g, "&")
|
||||||
|
.replace(/</g, "<")
|
||||||
|
.replace(/>/g, ">")
|
||||||
|
.replace(/"/g, """);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Blog manifest ---------------------------------------------------------
|
||||||
|
const manifestSrc = fs.readFileSync(MANIFEST, "utf8");
|
||||||
|
|
||||||
|
const POSTS = [
|
||||||
|
...manifestSrc.matchAll(
|
||||||
|
/\{\s*slug:\s*"([^"]+)",\s*title:\s*"((?:[^"\\]|\\.)*)",\s*description:\s*"((?:[^"\\]|\\.)*)",\s*date:\s*"([^"]+)"/g
|
||||||
|
),
|
||||||
|
].map((m) => ({ slug: m[1], title: m[2], description: m[3], date: m[4] }));
|
||||||
|
|
||||||
|
const manifestSlugCount = [...manifestSrc.matchAll(/slug:\s*"([^"]+)"/g)].length;
|
||||||
|
if (POSTS.length === 0 || POSTS.length !== manifestSlugCount) {
|
||||||
|
throw new Error(
|
||||||
|
`generate-sitemap: parsed ${POSTS.length} posts but manifest declares ${manifestSlugCount} slugs — refusing to emit a partial sitemap`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Sitemap ---------------------------------------------------------------
|
||||||
|
const staticRoutes = [...new Set(walk(APP_DIR).map(routeFor).filter(Boolean))]
|
||||||
|
.filter((route) => !EXCLUDE.has(route))
|
||||||
|
.sort();
|
||||||
|
|
||||||
|
const urls = [
|
||||||
|
...staticRoutes.map((route) => ({ loc: ORIGIN + route, ...meta(route) })),
|
||||||
|
...POSTS.map((post) => ({
|
||||||
|
loc: `${ORIGIN}/blog/${post.slug}/`,
|
||||||
|
lastmod: post.date,
|
||||||
|
changefreq: "monthly",
|
||||||
|
priority: "0.8",
|
||||||
|
})),
|
||||||
|
].sort((a, b) => (a.loc < b.loc ? -1 : 1));
|
||||||
|
|
||||||
|
const sitemap =
|
||||||
|
`<?xml version="1.0" encoding="UTF-8"?>\n` +
|
||||||
|
`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n` +
|
||||||
|
urls
|
||||||
|
.map(
|
||||||
|
(u) =>
|
||||||
|
` <url>\n <loc>${u.loc}</loc>` +
|
||||||
|
(u.lastmod ? `\n <lastmod>${u.lastmod}</lastmod>` : "") +
|
||||||
|
`\n <changefreq>${u.changefreq}</changefreq>\n <priority>${u.priority}</priority>\n </url>`
|
||||||
|
)
|
||||||
|
.join("\n") +
|
||||||
|
`\n</urlset>\n`;
|
||||||
|
|
||||||
|
// --- RSS feed --------------------------------------------------------------
|
||||||
|
const sortedPosts = [...POSTS].sort((a, b) => (a.date < b.date ? 1 : -1));
|
||||||
|
|
||||||
|
const feed =
|
||||||
|
`<?xml version="1.0" encoding="UTF-8"?>\n` +
|
||||||
|
`<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">\n <channel>\n` +
|
||||||
|
` <title>DashCaddy Blog</title>\n` +
|
||||||
|
` <link>${ORIGIN}/blog/</link>\n` +
|
||||||
|
` <description>${xmlEscape(SITE_DESCRIPTION)}</description>\n` +
|
||||||
|
` <language>en-us</language>\n` +
|
||||||
|
` <atom:link href="${ORIGIN}/feed.xml" rel="self" type="application/rss+xml" />\n` +
|
||||||
|
sortedPosts
|
||||||
|
.map(
|
||||||
|
(p) =>
|
||||||
|
` <item>\n` +
|
||||||
|
` <title>${xmlEscape(p.title)}</title>\n` +
|
||||||
|
` <link>${ORIGIN}/blog/${p.slug}/</link>\n` +
|
||||||
|
` <guid isPermaLink="true">${ORIGIN}/blog/${p.slug}/</guid>\n` +
|
||||||
|
` <pubDate>${new Date(`${p.date}T00:00:00Z`).toUTCString()}</pubDate>\n` +
|
||||||
|
` <description>${xmlEscape(p.description)}</description>\n` +
|
||||||
|
` </item>`
|
||||||
|
)
|
||||||
|
.join("\n") +
|
||||||
|
`\n </channel>\n</rss>\n`;
|
||||||
|
|
||||||
|
fs.mkdirSync(PUBLIC_DIR, { recursive: true });
|
||||||
|
fs.writeFileSync(path.join(PUBLIC_DIR, "sitemap.xml"), sitemap);
|
||||||
|
fs.writeFileSync(path.join(PUBLIC_DIR, "feed.xml"), feed);
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
`generate-sitemap: ${urls.length} sitemap URLs (${staticRoutes.length} pages + ${POSTS.length} posts), ${sortedPosts.length} feed items`
|
||||||
|
);
|
||||||
@@ -0,0 +1,492 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
/**
|
||||||
|
* inject-structured-data.mjs
|
||||||
|
*
|
||||||
|
* Adds JSON-LD structured data to every built DashCaddy app-guide page
|
||||||
|
* (out/docs/catalog/<app>/index.html) after `next build` has produced the
|
||||||
|
* static export.
|
||||||
|
*
|
||||||
|
* Design rules:
|
||||||
|
* - Runs on npm `postbuild`, so it operates on the real rendered HTML, not on
|
||||||
|
* the TSX source. Everything it emits is therefore provably derived from
|
||||||
|
* text a visitor can already see on the page (Google's requirement for
|
||||||
|
* FAQPage / HowTo markup).
|
||||||
|
* - Emits nothing it cannot ground. A page with no category badge gets no
|
||||||
|
* applicationCategory; a page with no troubleshooting list gets no FAQPage;
|
||||||
|
* a page with no dashboard install steps gets no HowTo. Missing fields are
|
||||||
|
* reported, never invented.
|
||||||
|
* - Idempotent: an already-injected page is detected and skipped.
|
||||||
|
*
|
||||||
|
* Never hand-edit this file's OUTPUT. Re-run the build.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
|
||||||
|
import { join, dirname } from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
||||||
|
const REPO = join(HERE, "..");
|
||||||
|
const OUT = join(REPO, "out");
|
||||||
|
const CATALOG = join(OUT, "docs", "catalog");
|
||||||
|
|
||||||
|
const ORIGIN = "https://dashcaddy.net";
|
||||||
|
const MARKER = 'data-dashcaddy-jsonld="app-guide"';
|
||||||
|
const BLOG_MARKER = 'data-dashcaddy-jsonld="blog-breadcrumb-faq"';
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------ text --- */
|
||||||
|
|
||||||
|
const ENTITIES = {
|
||||||
|
amp: "&",
|
||||||
|
lt: "<",
|
||||||
|
gt: ">",
|
||||||
|
quot: '"',
|
||||||
|
apos: "'",
|
||||||
|
nbsp: " ",
|
||||||
|
"39": "'",
|
||||||
|
"x27": "'",
|
||||||
|
"x2F": "/",
|
||||||
|
"47": "/",
|
||||||
|
};
|
||||||
|
|
||||||
|
function decodeEntities(s) {
|
||||||
|
return s.replace(/&#?([a-zA-Z0-9]+);/g, (whole, code) => {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(ENTITIES, code)) return ENTITIES[code];
|
||||||
|
if (Object.prototype.hasOwnProperty.call(ENTITIES, "#" + code)) {
|
||||||
|
return ENTITIES["#" + code];
|
||||||
|
}
|
||||||
|
if (/^#?\d+$/.test(code)) {
|
||||||
|
const n = Number(code.replace("#", ""));
|
||||||
|
if (Number.isFinite(n) && n > 0 && n < 0x10ffff) return String.fromCodePoint(n);
|
||||||
|
}
|
||||||
|
if (/^#?x[0-9a-f]+$/i.test(code)) {
|
||||||
|
const n = parseInt(code.replace(/^#?x/i, ""), 16);
|
||||||
|
if (Number.isFinite(n) && n > 0 && n < 0x10ffff) return String.fromCodePoint(n);
|
||||||
|
}
|
||||||
|
return whole;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Strip tags, decode entities, collapse whitespace. */
|
||||||
|
function text(html) {
|
||||||
|
return decodeEntities(
|
||||||
|
html
|
||||||
|
.replace(/<br\s*\/?>/gi, " ")
|
||||||
|
.replace(/<[^>]+>/g, " "),
|
||||||
|
)
|
||||||
|
.replace(/\s+/g, " ")
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Tags stripped / entities decoded for the WHOLE document — used to prove that
|
||||||
|
* anything we mark up is genuinely visible to a visitor. */
|
||||||
|
function visibleText(doc) {
|
||||||
|
return text(
|
||||||
|
doc
|
||||||
|
.replace(/<script\b[\s\S]*?<\/script>/gi, " ")
|
||||||
|
.replace(/<style\b[\s\S]*?<\/style>/gi, " "),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------- extraction --- */
|
||||||
|
|
||||||
|
/** Return the inner HTML of the first <tag ...> ... </tag> starting at `from`. */
|
||||||
|
function innerOf(html, tag, from = 0) {
|
||||||
|
const open = new RegExp(`<${tag}\\b[^>]*>`, "gi");
|
||||||
|
open.lastIndex = from;
|
||||||
|
const m = open.exec(html);
|
||||||
|
if (!m) return null;
|
||||||
|
let depth = 1;
|
||||||
|
const re = new RegExp(`<${tag}\\b[^>]*>|</${tag}>`, "gi");
|
||||||
|
re.lastIndex = open.lastIndex;
|
||||||
|
let mm;
|
||||||
|
while ((mm = re.exec(html)) !== null) {
|
||||||
|
if (mm[0].startsWith("</")) depth -= 1;
|
||||||
|
else depth += 1;
|
||||||
|
if (depth === 0) {
|
||||||
|
return { inner: html.slice(open.lastIndex, mm.index), end: re.lastIndex };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** All top-level <li> entries inside an HTML fragment containing list items. */
|
||||||
|
function listItems(ulInner) {
|
||||||
|
const items = [];
|
||||||
|
let pos = 0;
|
||||||
|
for (;;) {
|
||||||
|
const li = innerOf(ulInner, "li", pos);
|
||||||
|
if (!li) break;
|
||||||
|
items.push(li.inner);
|
||||||
|
pos = li.end;
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FAQ entries, taken ONLY from the visitor-visible troubleshooting list.
|
||||||
|
*
|
||||||
|
* The question is the page's own list label, verbatim (minus the trailing list
|
||||||
|
* punctuation); the answer is the page's own explanation, verbatim. Nothing is
|
||||||
|
* rephrased, and no question is synthesised — if the label is not visible on the
|
||||||
|
* page, it does not get marked up. Pages whose troubleshooting entry has no bold
|
||||||
|
* label are skipped.
|
||||||
|
*/
|
||||||
|
function extractFaqs(html) {
|
||||||
|
const h = html.indexOf("<h2>Troubleshooting</h2>");
|
||||||
|
if (h === -1) return [];
|
||||||
|
const ul = innerOf(html, "ul", h);
|
||||||
|
if (!ul) return [];
|
||||||
|
const faqs = [];
|
||||||
|
for (const li of listItems(ul.inner)) {
|
||||||
|
// <strong>Label:</strong> answer
|
||||||
|
const m = /<strong>([\s\S]*?)<\/strong>([\s\S]*)/.exec(li);
|
||||||
|
if (!m) continue;
|
||||||
|
const q = text(m[1]).replace(/[:\s]+$/, "");
|
||||||
|
const a = text(m[2]);
|
||||||
|
if (!q || !a) continue;
|
||||||
|
faqs.push({ question: q, answer: a });
|
||||||
|
}
|
||||||
|
return faqs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractSteps(html, appName) {
|
||||||
|
const h = html.indexOf("<h2>Install via the DashCaddy dashboard</h2>");
|
||||||
|
if (h === -1) return [];
|
||||||
|
const ol = innerOf(html, "ol", h);
|
||||||
|
if (!ol) return [];
|
||||||
|
const steps = listItems(ol.inner)
|
||||||
|
.map((li) => text(li))
|
||||||
|
.filter((s) => s.length > 0);
|
||||||
|
return steps.length >= 3 ? steps : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractMeta(html) {
|
||||||
|
const title = /<title>([\s\S]*?)<\/title>/.exec(html);
|
||||||
|
let appName = title ? text(title[1]) : "";
|
||||||
|
appName = appName.replace(/\s*[—–-]\s*DashCaddy Docs\s*$/i, "").replace(/^Install\s+/i, "").trim();
|
||||||
|
|
||||||
|
let description = "";
|
||||||
|
const intro = /<p class="mt-4 max-w-3xl[^"]*">([\s\S]*?)<\/p>/.exec(html);
|
||||||
|
if (intro) description = text(intro[1]);
|
||||||
|
|
||||||
|
const cat = /Category:\s*([^<]+)</.exec(html);
|
||||||
|
const diff = /Difficulty:\s*([^<]+)</.exec(html);
|
||||||
|
const img = /Docker image:[\s\S]*?<code[^>]*>([\s\S]*?)<\/code>/.exec(html);
|
||||||
|
|
||||||
|
return {
|
||||||
|
appName,
|
||||||
|
description,
|
||||||
|
category: cat ? text(cat[1]) : null,
|
||||||
|
difficulty: diff ? text(diff[1]) : null,
|
||||||
|
dockerImage: img ? text(img[1]) : null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ blog posts --- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blog FAQ entries, taken only from a real, visible "Frequently asked questions"
|
||||||
|
* section: each `### question` heading plus the paragraphs that follow it, both
|
||||||
|
* verbatim. A post with no such section (or fewer than two entries) gets no
|
||||||
|
* FAQPage node.
|
||||||
|
*/
|
||||||
|
function extractBlogFaqs(html) {
|
||||||
|
const m = /<h2>(?:Frequently asked questions|FAQ)<\/h2>/i.exec(html);
|
||||||
|
if (!m) return [];
|
||||||
|
const rest = html.slice(m.index + m[0].length);
|
||||||
|
let end = rest.length;
|
||||||
|
for (const marker of ["<h2", "<footer", "<nav", "<aside", "<script", "<main"]) {
|
||||||
|
const i = rest.indexOf(marker);
|
||||||
|
if (i !== -1 && i < end) end = i;
|
||||||
|
}
|
||||||
|
const region = rest.slice(0, end);
|
||||||
|
|
||||||
|
const faqs = [];
|
||||||
|
const parts = region.split(/<h3>([\s\S]*?)<\/h3>/);
|
||||||
|
for (let i = 1; i < parts.length; i += 2) {
|
||||||
|
const q = text(parts[i]);
|
||||||
|
const a = text(parts[i + 1] || "");
|
||||||
|
if (q && a) faqs.push({ question: q, answer: a });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback shape: "**Question?** answer" rendered as <p><strong>…</strong>…</p>.
|
||||||
|
if (faqs.length < 2) {
|
||||||
|
const re = /<p><strong>([\s\S]*?)<\/strong>([\s\S]*?)<\/p>/g;
|
||||||
|
let m2;
|
||||||
|
while ((m2 = re.exec(region)) !== null) {
|
||||||
|
const q = text(m2[1]);
|
||||||
|
const a = text(m2[2]);
|
||||||
|
if (q && q.endsWith("?") && a) faqs.push({ question: q, answer: a });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return faqs.length >= 2 ? faqs : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildBlogGraph(slug, html, faqs) {
|
||||||
|
const h1 = /<h1[^>]*>([\s\S]*?)<\/h1>/.exec(html);
|
||||||
|
const title = h1 ? text(h1[1]) : slug;
|
||||||
|
const page = `${ORIGIN}/blog/${slug}/`;
|
||||||
|
|
||||||
|
const graph = [
|
||||||
|
{
|
||||||
|
"@type": "BreadcrumbList",
|
||||||
|
"@id": `${page}#breadcrumb`,
|
||||||
|
itemListElement: [
|
||||||
|
{ "@type": "ListItem", position: 1, name: "DashCaddy", item: `${ORIGIN}/` },
|
||||||
|
{ "@type": "ListItem", position: 2, name: "Blog", item: `${ORIGIN}/blog/` },
|
||||||
|
{ "@type": "ListItem", position: 3, name: title, item: page },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
if (faqs.length >= 2) {
|
||||||
|
graph.push({
|
||||||
|
"@type": "FAQPage",
|
||||||
|
"@id": `${page}#faq`,
|
||||||
|
mainEntity: faqs.map((f) => ({
|
||||||
|
"@type": "Question",
|
||||||
|
name: f.question,
|
||||||
|
acceptedAnswer: { "@type": "Answer", text: f.answer },
|
||||||
|
})),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return { "@context": "https://schema.org", "@graph": graph };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------ build --- */
|
||||||
|
|
||||||
|
function buildGraph(appId, meta, faqs, steps) {
|
||||||
|
const page = `${ORIGIN}/docs/catalog/${appId}/`;
|
||||||
|
const graph = [];
|
||||||
|
|
||||||
|
graph.push({
|
||||||
|
"@type": "BreadcrumbList",
|
||||||
|
"@id": `${page}#breadcrumb`,
|
||||||
|
itemListElement: [
|
||||||
|
{ "@type": "ListItem", position: 1, name: "DashCaddy", item: `${ORIGIN}/` },
|
||||||
|
{ "@type": "ListItem", position: 2, name: "Documentation", item: `${ORIGIN}/docs/` },
|
||||||
|
{ "@type": "ListItem", position: 3, name: "App Catalog", item: `${ORIGIN}/docs/catalog/` },
|
||||||
|
{ "@type": "ListItem", position: 4, name: `Install ${meta.appName}`, item: page },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const app = {
|
||||||
|
"@type": "SoftwareApplication",
|
||||||
|
"@id": `${page}#software`,
|
||||||
|
name: meta.appName,
|
||||||
|
url: page,
|
||||||
|
operatingSystem: "Linux",
|
||||||
|
applicationCategory: meta.category || "UtilitiesApplication",
|
||||||
|
};
|
||||||
|
if (meta.description) app.description = meta.description;
|
||||||
|
if (meta.dockerImage) app.softwareRequirements = `Docker image ${meta.dockerImage}`;
|
||||||
|
graph.push(app);
|
||||||
|
|
||||||
|
if (faqs.length >= 2) {
|
||||||
|
graph.push({
|
||||||
|
"@type": "FAQPage",
|
||||||
|
"@id": `${page}#faq`,
|
||||||
|
mainEntity: faqs.map((f) => ({
|
||||||
|
"@type": "Question",
|
||||||
|
name: f.question,
|
||||||
|
acceptedAnswer: { "@type": "Answer", text: f.answer },
|
||||||
|
})),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (steps.length >= 3) {
|
||||||
|
graph.push({
|
||||||
|
"@type": "HowTo",
|
||||||
|
"@id": `${page}#howto`,
|
||||||
|
name: `Install ${meta.appName} with DashCaddy`,
|
||||||
|
description: `Deploy ${meta.appName} on a DashCaddy host from the dashboard.`,
|
||||||
|
step: steps.map((s, i) => ({
|
||||||
|
"@type": "HowToStep",
|
||||||
|
position: i + 1,
|
||||||
|
name: `Step ${i + 1}`,
|
||||||
|
text: s,
|
||||||
|
})),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return { "@context": "https://schema.org", "@graph": graph };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------- main --- */
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
if (!statSync(OUT, { throwIfNoEntry: false })) {
|
||||||
|
console.error("inject-structured-data: out/ not found — run next build first");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const appIds = readdirSync(CATALOG).filter((d) => {
|
||||||
|
try {
|
||||||
|
return statSync(join(CATALOG, d)).isDirectory();
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (appIds.length < 50) {
|
||||||
|
console.error(`inject-structured-data: only ${appIds.length} app dirs found; refusing`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const report = { pages: 0, injected: 0, skipped: 0, faq: 0, howto: 0, image: 0, missing: [], ungrounded: 0 };
|
||||||
|
|
||||||
|
for (const appId of appIds) {
|
||||||
|
const file = join(CATALOG, appId, "index.html");
|
||||||
|
if (!statSync(file, { throwIfNoEntry: false })) {
|
||||||
|
report.missing.push(`${appId}: no index.html`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
report.pages += 1;
|
||||||
|
let html = readFileSync(file, "utf8");
|
||||||
|
|
||||||
|
if (html.includes(MARKER)) {
|
||||||
|
report.skipped += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const meta = extractMeta(html);
|
||||||
|
const vis = visibleText(html);
|
||||||
|
const faqs = extractFaqs(html).filter((f) => {
|
||||||
|
if (vis.includes(f.question) && vis.includes(f.answer)) return true;
|
||||||
|
report.ungrounded += 1;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
const steps = extractSteps(html, meta.appName).filter((s) => {
|
||||||
|
if (vis.includes(s)) return true;
|
||||||
|
report.ungrounded += 1;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!meta.appName) {
|
||||||
|
report.missing.push(`${appId}: no app name`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const gaps = [];
|
||||||
|
if (!meta.category) gaps.push("category");
|
||||||
|
if (!meta.difficulty) gaps.push("difficulty");
|
||||||
|
if (!meta.dockerImage) gaps.push("dockerImage");
|
||||||
|
if (gaps.length) report.missing.push(`${appId}: ${gaps.join(",")}`);
|
||||||
|
if (faqs.length >= 2) report.faq += 1;
|
||||||
|
if (steps.length >= 3) report.howto += 1;
|
||||||
|
if (meta.dockerImage) report.image += 1;
|
||||||
|
|
||||||
|
const json = JSON.stringify(buildGraph(appId, meta, faqs, steps))
|
||||||
|
.replace(/</g, "\\u003c")
|
||||||
|
.replace(/>/g, "\\u003e")
|
||||||
|
.replace(/&/g, "\\u0026");
|
||||||
|
|
||||||
|
const block =
|
||||||
|
`<script type="application/ld+json" ${MARKER}>${json}</script>\n`;
|
||||||
|
|
||||||
|
if (!html.includes("</head>")) {
|
||||||
|
report.missing.push(`${appId}: no </head>`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
html = html.replace("</head>", `${block}</head>`);
|
||||||
|
writeFileSync(file, html);
|
||||||
|
report.injected += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("inject-structured-data: app guide pages");
|
||||||
|
console.log(` pages_seen=${report.pages}`);
|
||||||
|
console.log(` pages_injected=${report.injected}`);
|
||||||
|
console.log(` pages_skipped_already=${report.skipped}`);
|
||||||
|
console.log(` pages_with_faqpage=${report.faq}`);
|
||||||
|
console.log(` pages_with_howto=${report.howto}`);
|
||||||
|
console.log(` pages_with_docker_image=${report.image}`);
|
||||||
|
console.log(` pages_with_gaps=${report.missing.length}`);
|
||||||
|
console.log(` ungrounded_strings_dropped=${report.ungrounded}`);
|
||||||
|
for (const m of report.missing) console.log(` gap: ${m}`);
|
||||||
|
|
||||||
|
if (report.injected + report.skipped !== report.pages) {
|
||||||
|
console.error("inject-structured-data: not every page was injected or skipped");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
injectBlogPosts();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------- blog pass --- */
|
||||||
|
|
||||||
|
function injectBlogPosts() {
|
||||||
|
const blogDir = join(OUT, "blog");
|
||||||
|
if (!statSync(blogDir, { throwIfNoEntry: false })) {
|
||||||
|
console.log("inject-structured-data: no out/blog dir — skipping blog pass");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const slugs = readdirSync(blogDir).filter((d) => {
|
||||||
|
try {
|
||||||
|
return statSync(join(blogDir, d)).isDirectory();
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let seen = 0;
|
||||||
|
let injected = 0;
|
||||||
|
let skipped = 0;
|
||||||
|
let withFaq = 0;
|
||||||
|
let questions = 0;
|
||||||
|
let ungrounded = 0;
|
||||||
|
const gaps = [];
|
||||||
|
|
||||||
|
for (const slug of slugs) {
|
||||||
|
const file = join(blogDir, slug, "index.html");
|
||||||
|
if (!statSync(file, { throwIfNoEntry: false })) {
|
||||||
|
gaps.push(`${slug}: no index.html`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
seen += 1;
|
||||||
|
let html = readFileSync(file, "utf8");
|
||||||
|
if (html.includes(BLOG_MARKER)) {
|
||||||
|
skipped += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const vis = visibleText(html);
|
||||||
|
const faqs = extractBlogFaqs(html).filter((f) => {
|
||||||
|
if (vis.includes(f.question) && vis.includes(f.answer)) return true;
|
||||||
|
ungrounded += 1;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
if (faqs.length >= 2) {
|
||||||
|
withFaq += 1;
|
||||||
|
questions += faqs.length;
|
||||||
|
} else {
|
||||||
|
gaps.push(`${slug}: no visible FAQ section`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const json = JSON.stringify(buildBlogGraph(slug, html, faqs))
|
||||||
|
.replace(/</g, "\\u003c")
|
||||||
|
.replace(/>/g, "\\u003e")
|
||||||
|
.replace(/&/g, "\\u0026");
|
||||||
|
const block = `<script type="application/ld+json" ${BLOG_MARKER}>${json}</script>\n`;
|
||||||
|
|
||||||
|
if (!html.includes("</head>")) {
|
||||||
|
gaps.push(`${slug}: no </head>`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
writeFileSync(file, html.replace("</head>", `${block}</head>`));
|
||||||
|
injected += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("inject-structured-data: blog posts");
|
||||||
|
console.log(` posts_seen=${seen}`);
|
||||||
|
console.log(` posts_injected=${injected}`);
|
||||||
|
console.log(` posts_skipped_already=${skipped}`);
|
||||||
|
console.log(` posts_with_faqpage=${withFaq}`);
|
||||||
|
console.log(` faq_questions=${questions}`);
|
||||||
|
console.log(` ungrounded_strings_dropped=${ungrounded}`);
|
||||||
|
console.log(` notes=${gaps.length}`);
|
||||||
|
for (const g of gaps) console.log(` note: ${g}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
@@ -17,7 +17,7 @@ export default function AboutPage() {
|
|||||||
</h1>
|
</h1>
|
||||||
<p className="text-xl text-surface-300 max-w-2xl mx-auto">
|
<p className="text-xl text-surface-300 max-w-2xl mx-auto">
|
||||||
DashCaddy was born from the frustration of managing dozens of
|
DashCaddy was born from the frustration of managing dozens of
|
||||||
Docker containers, SSL certificates, and DNS records by hand. We
|
container configs, SSL certificates, and DNS records by hand. We
|
||||||
built the tool we wished existed — and then made it AI-powered.
|
built the tool we wished existed — and then made it AI-powered.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -130,7 +130,7 @@ export default function AboutPage() {
|
|||||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-6">
|
<div className="grid grid-cols-2 md:grid-cols-4 gap-6">
|
||||||
{[
|
{[
|
||||||
{ name: "Caddy", role: "Reverse Proxy & SSL", icon: "🔒" },
|
{ name: "Caddy", role: "Reverse Proxy & SSL", icon: "🔒" },
|
||||||
{ name: "Docker", role: "Container Runtime", icon: "🐳" },
|
{ name: "Shipdeck", role: "Deploy Engine", icon: "🚢" },
|
||||||
{ name: "Node.js", role: "API Backend", icon: "🟢" },
|
{ name: "Node.js", role: "API Backend", icon: "🟢" },
|
||||||
{ name: "Technitium", role: "DNS Server", icon: "🌐" },
|
{ name: "Technitium", role: "DNS Server", icon: "🌐" },
|
||||||
{ name: "Express", role: "REST API + WebSocket", icon: "⚡" },
|
{ name: "Express", role: "REST API + WebSocket", icon: "⚡" },
|
||||||
@@ -159,7 +159,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: "77", label: "App Templates" },
|
{ value: "78", label: "App Templates" },
|
||||||
{ value: "3,000+", label: "Test Cases" },
|
{ value: "3,000+", label: "Test Cases" },
|
||||||
{ value: "400+", label: "API Endpoints" },
|
{ value: "400+", label: "API Endpoints" },
|
||||||
{ value: "31", label: "Languages" },
|
{ value: "31", label: "Languages" },
|
||||||
|
|||||||
@@ -38,10 +38,14 @@ function getPost(slug: string) {
|
|||||||
return POSTS.find((p) => p.slug === slug) ?? null;
|
return POSTS.find((p) => p.slug === slug) ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function stripFrontmatter(markdown: string): string {
|
||||||
|
return markdown.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "");
|
||||||
|
}
|
||||||
|
|
||||||
function readBody(slug: string): string | null {
|
function readBody(slug: string): string | null {
|
||||||
const file = path.join(BLOG_DIR, `${slug}.md`);
|
const file = path.join(BLOG_DIR, `${slug}.md`);
|
||||||
if (!fs.existsSync(file)) return null;
|
if (!fs.existsSync(file)) return null;
|
||||||
return fs.readFileSync(file, "utf8");
|
return stripFrontmatter(fs.readFileSync(file, "utf8"));
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatDate(iso: string): string {
|
function formatDate(iso: string): string {
|
||||||
@@ -64,7 +68,10 @@ export async function generateMetadata({
|
|||||||
return {
|
return {
|
||||||
title: `${post.title} — DashCaddy Blog`,
|
title: `${post.title} — DashCaddy Blog`,
|
||||||
description: post.description,
|
description: post.description,
|
||||||
alternates: { canonical: `https://dashcaddy.net/blog/${post.slug}/` },
|
alternates: {
|
||||||
|
canonical: `https://dashcaddy.net/blog/${post.slug}/`,
|
||||||
|
types: { "application/rss+xml": "https://dashcaddy.net/feed.xml" },
|
||||||
|
},
|
||||||
keywords: post.tags,
|
keywords: post.tags,
|
||||||
authors: [{ name: post.author }],
|
authors: [{ name: post.author }],
|
||||||
openGraph: {
|
openGraph: {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function actualBudgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function actualBudgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Actual Budget</strong> from the Productivity category.</li>
|
<li>Pick <strong>Actual Budget</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>budget</code>), host port (default: <code>5006</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>budget</code>), host port (default: <code>5006</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function actualBudgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function actualBudgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Actual Budget on my home host and expose it at budget.sami" }'</code></pre>
|
-d '{ "message": "Deploy Actual Budget on my home host and expose it at budget.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull actualbudget/actual-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull actualbudget/actual-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function adminerDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function adminerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Adminer</strong> from the Database category.</li>
|
<li>Pick <strong>Adminer</strong> from the Database category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>adminer</code>), host port (default: <code>8087</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>adminer</code>), host port (default: <code>8087</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function adminerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function adminerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Adminer on my home host and expose it at adminer.sami" }'</code></pre>
|
-d '{ "message": "Deploy Adminer on my home host and expose it at adminer.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull adminer:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull adminer:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function airsonicDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function airsonicDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Airsonic Advanced</strong> from the Media category.</li>
|
<li>Pick <strong>Airsonic Advanced</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>airsonic</code>), host port (default: <code>4040</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>airsonic</code>), host port (default: <code>4040</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function airsonicDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function airsonicDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Airsonic Advanced on my home host and expose it at airsonic.sami" }'</code></pre>
|
-d '{ "message": "Deploy Airsonic Advanced on my home host and expose it at airsonic.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/airsonic-advanced:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/airsonic-advanced:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function audiobookshelfDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media/audiobooks</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media/audiobooks</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function audiobookshelfDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Audiobookshelf</strong> from the Media category.</li>
|
<li>Pick <strong>Audiobookshelf</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>audiobooks</code>), host port (default: <code>13378</code>), and the media library path.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>audiobooks</code>), host port (default: <code>13378</code>), and the media library path.</li>
|
||||||
@@ -45,7 +45,7 @@ export default function audiobookshelfDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -70,15 +70,15 @@ export default function audiobookshelfDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Audiobookshelf on my home host and expose it at audiobooks.sami" }'</code></pre>
|
-d '{ "message": "Deploy Audiobookshelf on my home host and expose it at audiobooks.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/advplyr/audiobookshelf:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/advplyr/audiobookshelf:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function authentikDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function authentikDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Authentik</strong> from the Security category.</li>
|
<li>Pick <strong>Authentik</strong> from the Security category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>auth</code>), host port (default: <code>9010</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>auth</code>), host port (default: <code>9010</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function authentikDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function authentikDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Authentik on my home host and expose it at auth.sami" }'</code></pre>
|
-d '{ "message": "Deploy Authentik on my home host and expose it at auth.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/goauthentik/server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/goauthentik/server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function bazarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function bazarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Bazarr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Bazarr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>bazarr</code>), host port (default: <code>6767</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>bazarr</code>), host port (default: <code>6767</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function bazarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function bazarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Bazarr on my home host and expose it at bazarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Bazarr on my home host and expose it at bazarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/bazarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/bazarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function bind9DocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function bind9DocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>BIND9 DNS Server</strong> from the DNS category.</li>
|
<li>Pick <strong>BIND9 DNS Server</strong> from the DNS category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns2</code>), host port (default: <code>953</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns2</code>), host port (default: <code>953</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function bind9DocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,23 +69,23 @@ export default function bind9DocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy BIND9 DNS Server on my home host and expose it at dns2.sami" }'</code></pre>
|
-d '{ "message": "Deploy BIND9 DNS Server on my home host and expose it at dns2.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ubuntu/bind9:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ubuntu/bind9:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
<h2>Post-install: first-run checklist</h2>
|
<h2>Post-install: first-run checklist</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Configure zone files in /opt/bind9/config/</li>
|
<li>Configure zone files in /opt/bind9/config/</li>
|
||||||
<li>Create named.conf.local for your .sami zone</li>
|
<li>Create named.conf.local for your .home zone</li>
|
||||||
<li>Add zone file: /opt/bind9/records/db.sami</li>
|
<li>Add zone file: /opt/bind9/records/db.home</li>
|
||||||
<li>Restart container to apply changes</li>
|
<li>Restart container to apply changes</li>
|
||||||
<li>Test with: dig @localhost sami</li>
|
<li>Test with: dig @localhost sami</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function bookstackDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function bookstackDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>BookStack</strong> from the Productivity category.</li>
|
<li>Pick <strong>BookStack</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>wiki</code>), host port (default: <code>8091</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>wiki</code>), host port (default: <code>8091</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function bookstackDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function bookstackDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy BookStack on my home host and expose it at wiki.sami" }'</code></pre>
|
-d '{ "message": "Deploy BookStack on my home host and expose it at wiki.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/bookstack:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/bookstack:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function calibreWebDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media/books</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media/books</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function calibreWebDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Calibre-Web</strong> from the Media category.</li>
|
<li>Pick <strong>Calibre-Web</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>books</code>), host port (default: <code>8083</code>), and the media library path.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>books</code>), host port (default: <code>8083</code>), and the media library path.</li>
|
||||||
@@ -45,7 +45,7 @@ export default function calibreWebDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -70,15 +70,15 @@ export default function calibreWebDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Calibre-Web on my home host and expose it at books.sami" }'</code></pre>
|
-d '{ "message": "Deploy Calibre-Web on my home host and expose it at books.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull lscr.io/linuxserver/calibre-web:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull lscr.io/linuxserver/calibre-web:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function changedetectionDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function changedetectionDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Change Detection</strong> from the Utilities category.</li>
|
<li>Pick <strong>Change Detection</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>watch</code>), host port (default: <code>5001</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>watch</code>), host port (default: <code>5001</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function changedetectionDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function changedetectionDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Change Detection on my home host and expose it at watch.sami" }'</code></pre>
|
-d '{ "message": "Deploy Change Detection on my home host and expose it at watch.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/dgtlmoon/changedetection.io:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/dgtlmoon/changedetection.io:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function corednsDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function corednsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>CoreDNS</strong> from the DNS category.</li>
|
<li>Pick <strong>CoreDNS</strong> from the DNS category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns4</code>), host port (default: <code>53</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns4</code>), host port (default: <code>53</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function corednsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function corednsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy CoreDNS on my home host and expose it at dns4.sami" }'</code></pre>
|
-d '{ "message": "Deploy CoreDNS on my home host and expose it at dns4.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull coredns/coredns:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull coredns/coredns:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
|||||||
<li>Define .sami zone with file plugin</li>
|
<li>Define .sami zone with file plugin</li>
|
||||||
<li>Create zone file with your records</li>
|
<li>Create zone file with your records</li>
|
||||||
<li>Restart container to load config</li>
|
<li>Restart container to load config</li>
|
||||||
<li>Test with: dig @localhost test.sami</li>
|
<li>Test with: dig @localhost test.home</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h2>Volumes and persistent data</h2>
|
<h2>Volumes and persistent data</h2>
|
||||||
<p>DashCaddy creates these volume mounts in the container spec:</p>
|
<p>DashCaddy creates these volume mounts in the container spec:</p>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function crowdsecDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function crowdsecDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>CrowdSec</strong> from the Security category.</li>
|
<li>Pick <strong>CrowdSec</strong> from the Security category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>crowdsec</code>), host port (default: <code>8091</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>crowdsec</code>), host port (default: <code>8091</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function crowdsecDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function crowdsecDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy CrowdSec on my home host and expose it at crowdsec.sami" }'</code></pre>
|
-d '{ "message": "Deploy CrowdSec on my home host and expose it at crowdsec.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull crowdsecurity/crowdsec:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull crowdsecurity/crowdsec:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function dashcaDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function dashcaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>DashCA</strong> from the Security category.</li>
|
<li>Pick <strong>DashCA</strong> from the Security category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>ca</code>), host port (default: <code>32400</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>ca</code>), host port (default: <code>32400</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function dashcaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,21 +69,21 @@ export default function dashcaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy DashCA on my home host and expose it at ca.sami" }'</code></pre>
|
-d '{ "message": "Deploy DashCA on my home host and expose it at ca.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
<h2>Post-install: first-run checklist</h2>
|
<h2>Post-install: first-run checklist</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>New devices: visit http://ca.sami (HTTP, no certificate needed)</li>
|
<li>New devices: visit http://ca.home (HTTP, no certificate needed)</li>
|
||||||
<li>Click the 'Install Certificate' button for your platform</li>
|
<li>Click the 'Install Certificate' button for your platform</li>
|
||||||
<li>Follow platform-specific instructions</li>
|
<li>Follow platform-specific instructions</li>
|
||||||
<li>Verify all *.sami domains now show secure connections</li>
|
<li>Verify all *.sami domains now show secure connections</li>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function digitalClockDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function digitalClockDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Digital Clock</strong> from the Utilities category.</li>
|
<li>Pick <strong>Digital Clock</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>digital-clock</code>), host port (default: <code>32400</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>digital-clock</code>), host port (default: <code>32400</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function digitalClockDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function digitalClockDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Digital Clock on my home host and expose it at digital-clock.sami" }'</code></pre>
|
-d '{ "message": "Deploy Digital Clock on my home host and expose it at digital-clock.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function dozzleDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function dozzleDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Dozzle</strong> from the Monitoring category.</li>
|
<li>Pick <strong>Dozzle</strong> from the Monitoring category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>logs</code>), host port (default: <code>8088</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>logs</code>), host port (default: <code>8088</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function dozzleDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function dozzleDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Dozzle on my home host and expose it at logs.sami" }'</code></pre>
|
-d '{ "message": "Deploy Dozzle on my home host and expose it at logs.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull amir20/dozzle:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull amir20/dozzle:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function droneDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function droneDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Drone CI</strong> from the Development category.</li>
|
<li>Pick <strong>Drone CI</strong> from the Development category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>drone</code>), host port (default: <code>8090</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>drone</code>), host port (default: <code>8090</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function droneDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function droneDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Drone CI on my home host and expose it at drone.sami" }'</code></pre>
|
-d '{ "message": "Deploy Drone CI on my home host and expose it at drone.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull drone/drone:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull drone/drone:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function embyDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function embyDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Emby</strong> from the Media category.</li>
|
<li>Pick <strong>Emby</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>emby</code>), host port (default: <code>8096</code>), and the media library path.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>emby</code>), host port (default: <code>8096</code>), and the media library path.</li>
|
||||||
@@ -45,7 +45,7 @@ export default function embyDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -70,15 +70,15 @@ export default function embyDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Emby on my home host and expose it at emby.sami" }'</code></pre>
|
-d '{ "message": "Deploy Emby on my home host and expose it at emby.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull emby/embyserver:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull emby/embyserver:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function excalidrawDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function excalidrawDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Excalidraw</strong> from the Productivity category.</li>
|
<li>Pick <strong>Excalidraw</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>draw</code>), host port (default: <code>8086</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>draw</code>), host port (default: <code>8086</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function excalidrawDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function excalidrawDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Excalidraw on my home host and expose it at draw.sami" }'</code></pre>
|
-d '{ "message": "Deploy Excalidraw on my home host and expose it at draw.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull excalidraw/excalidraw:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull excalidraw/excalidraw:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function filebrowserDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function filebrowserDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>FileBrowser</strong> from the Files category.</li>
|
<li>Pick <strong>FileBrowser</strong> from the Files category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>files</code>), host port (default: <code>8085</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>files</code>), host port (default: <code>8085</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function filebrowserDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function filebrowserDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy FileBrowser on my home host and expose it at files.sami" }'</code></pre>
|
-d '{ "message": "Deploy FileBrowser on my home host and expose it at files.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull filebrowser/filebrowser:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull filebrowser/filebrowser:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function giteaDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function giteaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Gitea</strong> from the Development category.</li>
|
<li>Pick <strong>Gitea</strong> from the Development category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>gitea</code>), host port (default: <code>3005</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>gitea</code>), host port (default: <code>3005</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function giteaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function giteaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Gitea on my home host and expose it at gitea.sami" }'</code></pre>
|
-d '{ "message": "Deploy Gitea on my home host and expose it at gitea.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull gitea/gitea:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull gitea/gitea:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function grafanaDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function grafanaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Grafana</strong> from the Monitoring category.</li>
|
<li>Pick <strong>Grafana</strong> from the Monitoring category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>grafana</code>), host port (default: <code>3000</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>grafana</code>), host port (default: <code>3000</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function grafanaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function grafanaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Grafana on my home host and expose it at grafana.sami" }'</code></pre>
|
-d '{ "message": "Deploy Grafana on my home host and expose it at grafana.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull grafana/grafana:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull grafana/grafana:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function homarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function homarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Homarr</strong> from the Utilities category.</li>
|
<li>Pick <strong>Homarr</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>homarr</code>), host port (default: <code>7575</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>homarr</code>), host port (default: <code>7575</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function homarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function homarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Homarr on my home host and expose it at homarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Homarr on my home host and expose it at homarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/ajnart/homarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/ajnart/homarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function homeassistantDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function homeassistantDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Home Assistant</strong> from the Home Automation category.</li>
|
<li>Pick <strong>Home Assistant</strong> from the Home Automation category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>home</code>), host port (default: <code>8123</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>home</code>), host port (default: <code>8123</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function homeassistantDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function homeassistantDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Home Assistant on my home host and expose it at home.sami" }'</code></pre>
|
-d '{ "message": "Deploy Home Assistant on my home host and expose it at home.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull homeassistant/home-assistant:stable</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull homeassistant/home-assistant:stable</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function homepageDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function homepageDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Homepage</strong> from the Utilities category.</li>
|
<li>Pick <strong>Homepage</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>dashboard</code>), host port (default: <code>3008</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>dashboard</code>), host port (default: <code>3008</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function homepageDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function homepageDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Homepage on my home host and expose it at dashboard.sami" }'</code></pre>
|
-d '{ "message": "Deploy Homepage on my home host and expose it at dashboard.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/gethomepage/homepage:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/gethomepage/homepage:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function immichDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function immichDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Immich</strong> from the Photos category.</li>
|
<li>Pick <strong>Immich</strong> from the Photos category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>photos</code>), host port (default: <code>2283</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>photos</code>), host port (default: <code>2283</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function immichDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function immichDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Immich on my home host and expose it at photos.sami" }'</code></pre>
|
-d '{ "message": "Deploy Immich on my home host and expose it at photos.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/immich-app/immich-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/immich-app/immich-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function itToolsDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function itToolsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>IT Tools</strong> from the Utilities category.</li>
|
<li>Pick <strong>IT Tools</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>tools</code>), host port (default: <code>8087</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>tools</code>), host port (default: <code>8087</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function itToolsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function itToolsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy IT Tools on my home host and expose it at tools.sami" }'</code></pre>
|
-d '{ "message": "Deploy IT Tools on my home host and expose it at tools.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull corentinth/it-tools:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull corentinth/it-tools:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function jdownloaderDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function jdownloaderDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>JDownloader 2</strong> from the Downloads category.</li>
|
<li>Pick <strong>JDownloader 2</strong> from the Downloads category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>jdownloader</code>), host port (default: <code>5800</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>jdownloader</code>), host port (default: <code>5800</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function jdownloaderDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function jdownloaderDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy JDownloader 2 on my home host and expose it at jdownloader.sami" }'</code></pre>
|
-d '{ "message": "Deploy JDownloader 2 on my home host and expose it at jdownloader.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jlesage/jdownloader-2:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jlesage/jdownloader-2:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function jellyfinDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function jellyfinDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Jellyfin</strong> from the Media category.</li>
|
<li>Pick <strong>Jellyfin</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>jellyfin</code>), host port (default: <code>8096</code>), and the media library path.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>jellyfin</code>), host port (default: <code>8096</code>), and the media library path.</li>
|
||||||
@@ -45,7 +45,7 @@ export default function jellyfinDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -70,15 +70,15 @@ export default function jellyfinDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Jellyfin on my home host and expose it at jellyfin.sami" }'</code></pre>
|
-d '{ "message": "Deploy Jellyfin on my home host and expose it at jellyfin.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jellyfin/jellyfin:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jellyfin/jellyfin:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function jenkinsDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function jenkinsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Jenkins</strong> from the Development category.</li>
|
<li>Pick <strong>Jenkins</strong> from the Development category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>jenkins</code>), host port (default: <code>8089</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>jenkins</code>), host port (default: <code>8089</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function jenkinsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function jenkinsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Jenkins on my home host and expose it at jenkins.sami" }'</code></pre>
|
-d '{ "message": "Deploy Jenkins on my home host and expose it at jenkins.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jenkins/jenkins:lts</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jenkins/jenkins:lts</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function kavitaDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media/reading</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media/reading</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function kavitaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Kavita</strong> from the Media category.</li>
|
<li>Pick <strong>Kavita</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>kavita</code>), host port (default: <code>5004</code>), and the media library path.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>kavita</code>), host port (default: <code>5004</code>), and the media library path.</li>
|
||||||
@@ -45,7 +45,7 @@ export default function kavitaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -70,15 +70,15 @@ export default function kavitaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Kavita on my home host and expose it at kavita.sami" }'</code></pre>
|
-d '{ "message": "Deploy Kavita on my home host and expose it at kavita.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jvmilazz0/kavita:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull jvmilazz0/kavita:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function komgaDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media/comics</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media/comics</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function komgaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Komga</strong> from the Media category.</li>
|
<li>Pick <strong>Komga</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>komga</code>), host port (default: <code>25600</code>), and the media library path.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>komga</code>), host port (default: <code>25600</code>), and the media library path.</li>
|
||||||
@@ -45,7 +45,7 @@ export default function komgaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -70,15 +70,15 @@ export default function komgaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Komga on my home host and expose it at komga.sami" }'</code></pre>
|
-d '{ "message": "Deploy Komga on my home host and expose it at komga.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull gotson/komga:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull gotson/komga:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function lidarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function lidarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Lidarr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Lidarr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>lidarr</code>), host port (default: <code>8686</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>lidarr</code>), host port (default: <code>8686</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function lidarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function lidarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Lidarr on my home host and expose it at lidarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Lidarr on my home host and expose it at lidarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/lidarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/lidarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function mailserverDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function mailserverDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Docker Mailserver</strong> from the Communication category.</li>
|
<li>Pick <strong>Docker Mailserver</strong> from the Communication category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>mail</code>), host port (default: <code>25</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>mail</code>), host port (default: <code>25</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function mailserverDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function mailserverDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Docker Mailserver on my home host and expose it at mail.sami" }'</code></pre>
|
-d '{ "message": "Deploy Docker Mailserver on my home host and expose it at mail.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull mailserver/docker-mailserver:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull mailserver/docker-mailserver:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function matrixDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function matrixDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Matrix Synapse</strong> from the Communication category.</li>
|
<li>Pick <strong>Matrix Synapse</strong> from the Communication category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>matrix</code>), host port (default: <code>8008</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>matrix</code>), host port (default: <code>8008</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function matrixDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function matrixDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Matrix Synapse on my home host and expose it at matrix.sami" }'</code></pre>
|
-d '{ "message": "Deploy Matrix Synapse on my home host and expose it at matrix.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull matrixdotorg/synapse:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull matrixdotorg/synapse:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function mealieDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function mealieDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Mealie</strong> from the Productivity category.</li>
|
<li>Pick <strong>Mealie</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>mealie</code>), host port (default: <code>9925</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>mealie</code>), host port (default: <code>9925</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function mealieDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function mealieDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Mealie on my home host and expose it at mealie.sami" }'</code></pre>
|
-d '{ "message": "Deploy Mealie on my home host and expose it at mealie.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/mealie-recipes/mealie:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/mealie-recipes/mealie:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function minecraftDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function minecraftDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Minecraft Server</strong> from the Gaming category.</li>
|
<li>Pick <strong>Minecraft Server</strong> from the Gaming category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>mc</code>), host port (default: <code>25565</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>mc</code>), host port (default: <code>25565</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function minecraftDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function minecraftDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Minecraft Server on my home host and expose it at mc.sami" }'</code></pre>
|
-d '{ "message": "Deploy Minecraft Server on my home host and expose it at mc.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull itzg/minecraft-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull itzg/minecraft-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function mongodbDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function mongodbDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>MongoDB</strong> from the Database category.</li>
|
<li>Pick <strong>MongoDB</strong> from the Database category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>mongo</code>), host port (default: <code>27017</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>mongo</code>), host port (default: <code>27017</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function mongodbDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function mongodbDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy MongoDB on my home host and expose it at mongo.sami" }'</code></pre>
|
-d '{ "message": "Deploy MongoDB on my home host and expose it at mongo.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull mongo:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull mongo:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function navidromeDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function navidromeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Navidrome</strong> from the Media category.</li>
|
<li>Pick <strong>Navidrome</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>music</code>), host port (default: <code>4533</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>music</code>), host port (default: <code>4533</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function navidromeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function navidromeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Navidrome on my home host and expose it at music.sami" }'</code></pre>
|
-d '{ "message": "Deploy Navidrome on my home host and expose it at music.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull deluan/navidrome:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull deluan/navidrome:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function nextcloudDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function nextcloudDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Nextcloud</strong> from the Productivity category.</li>
|
<li>Pick <strong>Nextcloud</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>cloud</code>), host port (default: <code>8080</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>cloud</code>), host port (default: <code>8080</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function nextcloudDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function nextcloudDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Nextcloud on my home host and expose it at cloud.sami" }'</code></pre>
|
-d '{ "message": "Deploy Nextcloud on my home host and expose it at cloud.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull nextcloud:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull nextcloud:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function noderedDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function noderedDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Node-RED</strong> from the Home Automation category.</li>
|
<li>Pick <strong>Node-RED</strong> from the Home Automation category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>nodered</code>), host port (default: <code>1880</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>nodered</code>), host port (default: <code>1880</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function noderedDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function noderedDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Node-RED on my home host and expose it at nodered.sami" }'</code></pre>
|
-d '{ "message": "Deploy Node-RED on my home host and expose it at nodered.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull nodered/node-red:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull nodered/node-red:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function nzbgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function nzbgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>NZBGet</strong> from the Downloads category.</li>
|
<li>Pick <strong>NZBGet</strong> from the Downloads category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>nzbget</code>), host port (default: <code>6789</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>nzbget</code>), host port (default: <code>6789</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function nzbgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function nzbgetDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy NZBGet on my home host and expose it at nzbget.sami" }'</code></pre>
|
-d '{ "message": "Deploy NZBGet on my home host and expose it at nzbget.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/nzbget:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/nzbget:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function outlineDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function outlineDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Outline</strong> from the Productivity category.</li>
|
<li>Pick <strong>Outline</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>outline</code>), host port (default: <code>3006</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>outline</code>), host port (default: <code>3006</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function outlineDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function outlineDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Outline on my home host and expose it at outline.sami" }'</code></pre>
|
-d '{ "message": "Deploy Outline on my home host and expose it at outline.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull outlinewiki/outline:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull outlinewiki/outline:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import DocsLayout from '@/components/docs/DocsLayout';
|
|||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: 'App Catalog — DashCaddy Docs',
|
title: 'App Catalog — DashCaddy Docs',
|
||||||
description: 'Browse all 77 one-click installable apps supported by DashCaddy, organized by category with install instructions for each.',
|
description: 'Browse all 78 one-click installable apps supported by DashCaddy, organized by category with install instructions for each.',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function DocsCatalogPage() {
|
export default function DocsCatalogPage() {
|
||||||
@@ -13,11 +13,11 @@ export default function DocsCatalogPage() {
|
|||||||
<Navbar />
|
<Navbar />
|
||||||
<DocsLayout
|
<DocsLayout
|
||||||
title="App Catalog"
|
title="App Catalog"
|
||||||
intro="DashCaddy ships with 77 pre-configured application templates. Every template can be deployed from the dashboard, called via the REST API, or invoked through the MCP server. This page is the index — click any app for its dedicated install guide with prerequisites, the exact API payload shape, and post-install verification steps."
|
intro="DashCaddy ships with 78 pre-configured application templates. Every template can be deployed from the dashboard, called via the REST API, or invoked through the MCP server. This page is the index — click any app for its dedicated install guide with prerequisites, the exact API payload shape, and post-install verification steps."
|
||||||
>
|
>
|
||||||
<div className="mb-8 rounded-xl border border-brand-500/30 bg-brand-500/5 p-5">
|
<div className="mb-8 rounded-xl border border-brand-500/30 bg-brand-500/5 p-5">
|
||||||
<p className="text-sm text-surface-200">
|
<p className="text-sm text-surface-200">
|
||||||
<strong className="text-brand-400">77 apps</strong> across <strong>17 categories</strong>. The canonical source is <code>dashcaddy-api/src/docker/app-templates.js</code>; regenerate these pages with <code>scripts/regenerate-catalog-docs.sh</code> after editing.
|
<strong className="text-brand-400">78 apps</strong> across <strong>17 categories</strong>. The canonical source is <code>dashcaddy-api/src/docker/app-templates.js</code>; regenerate these pages with <code>scripts/regenerate-catalog-docs.sh</code> after editing.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function paperlessNgxDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function paperlessNgxDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Paperless-ngx</strong> from the Productivity category.</li>
|
<li>Pick <strong>Paperless-ngx</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>paperless</code>), host port (default: <code>8095</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>paperless</code>), host port (default: <code>8095</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function paperlessNgxDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function paperlessNgxDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Paperless-ngx on my home host and expose it at paperless.sami" }'</code></pre>
|
-d '{ "message": "Deploy Paperless-ngx on my home host and expose it at paperless.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/paperless-ngx/paperless-ngx:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/paperless-ngx/paperless-ngx:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function photoprismDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function photoprismDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>PhotoPrism</strong> from the Photos category.</li>
|
<li>Pick <strong>PhotoPrism</strong> from the Photos category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>gallery</code>), host port (default: <code>2342</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>gallery</code>), host port (default: <code>2342</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function photoprismDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function photoprismDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy PhotoPrism on my home host and expose it at gallery.sami" }'</code></pre>
|
-d '{ "message": "Deploy PhotoPrism on my home host and expose it at gallery.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull photoprism/photoprism:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull photoprism/photoprism:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function piholeDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function piholeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Pi-hole</strong> from the Networking category.</li>
|
<li>Pick <strong>Pi-hole</strong> from the Networking category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>pihole</code>), host port (default: <code>80</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>pihole</code>), host port (default: <code>80</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function piholeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function piholeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Pi-hole on my home host and expose it at pihole.sami" }'</code></pre>
|
-d '{ "message": "Deploy Pi-hole on my home host and expose it at pihole.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull pihole/pihole:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull pihole/pihole:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function plexDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>A host path containing your media. Default suggestion: <code>/media</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
<li>A host path containing your media. Default suggestion: <code>/media</code>. The deploy form / API payload <code>config.mediaPath</code> must be readable by the container UID (usually <code>1000</code>).</li>
|
||||||
<li>A <strong>Plex Claim Token</strong> — get one from <a href="https://plex.tv/claim" className="text-brand-400 underline">https://plex.tv/claim</a> right before you click Deploy.</li>
|
<li>A <strong>Plex Claim Token</strong> — get one from <a href="https://plex.tv/claim" className="text-brand-400 underline">https://plex.tv/claim</a> right before you click Deploy.</li>
|
||||||
@@ -36,7 +36,7 @@ export default function plexDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Plex</strong> from the Media category.</li>
|
<li>Pick <strong>Plex</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>plex</code>), host port (default: <code>32400</code>), and the media library path, and the claim token.</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>plex</code>), host port (default: <code>32400</code>), and the media library path, and the claim token.</li>
|
||||||
@@ -46,7 +46,7 @@ export default function plexDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -72,15 +72,15 @@ export default function plexDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Plex on my home host and expose it at plex.sami" }'</code></pre>
|
-d '{ "message": "Deploy Plex on my home host and expose it at plex.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull plexinc/pms-docker:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull plexinc/pms-docker:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function portainerDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function portainerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Portainer</strong> from the Management category.</li>
|
<li>Pick <strong>Portainer</strong> from the Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>portainer</code>), host port (default: <code>9000</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>portainer</code>), host port (default: <code>9000</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function portainerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function portainerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Portainer on my home host and expose it at portainer.sami" }'</code></pre>
|
-d '{ "message": "Deploy Portainer on my home host and expose it at portainer.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull portainer/portainer-ce:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull portainer/portainer-ce:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function postgresDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function postgresDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>PostgreSQL</strong> from the Database category.</li>
|
<li>Pick <strong>PostgreSQL</strong> from the Database category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>postgres</code>), host port (default: <code>5432</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>postgres</code>), host port (default: <code>5432</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function postgresDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function postgresDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy PostgreSQL on my home host and expose it at postgres.sami" }'</code></pre>
|
-d '{ "message": "Deploy PostgreSQL on my home host and expose it at postgres.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull postgres:16-alpine</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull postgres:16-alpine</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function powerdnsDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function powerdnsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>PowerDNS</strong> from the DNS category.</li>
|
<li>Pick <strong>PowerDNS</strong> from the DNS category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns3</code>), host port (default: <code>8081</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns3</code>), host port (default: <code>8081</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function powerdnsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,24 +69,24 @@ export default function powerdnsDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy PowerDNS on my home host and expose it at dns3.sami" }'</code></pre>
|
-d '{ "message": "Deploy PowerDNS on my home host and expose it at dns3.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull pschiffe/pdns-mysql:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull pschiffe/pdns-mysql:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
<h2>Post-install: first-run checklist</h2>
|
<h2>Post-install: first-run checklist</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Access API at https://dns3.sami:8081</li>
|
<li>Access API at https://dns3.home:8081</li>
|
||||||
<li>Use API key for authentication</li>
|
<li>Use API key for authentication</li>
|
||||||
<li>Create zone via API or PowerDNS Admin</li>
|
<li>Create zone via API or PowerDNS Admin</li>
|
||||||
<li>Add records for your .sami domain</li>
|
<li>Add records for your .home domain</li>
|
||||||
<li>Configure devices to use DNS server</li>
|
<li>Configure devices to use DNS server</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h2>Volumes and persistent data</h2>
|
<h2>Volumes and persistent data</h2>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function prowlarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function prowlarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Prowlarr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Prowlarr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>prowlarr</code>), host port (default: <code>9696</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>prowlarr</code>), host port (default: <code>9696</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function prowlarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function prowlarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Prowlarr on my home host and expose it at prowlarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Prowlarr on my home host and expose it at prowlarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/prowlarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/prowlarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function qbittorrentDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function qbittorrentDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>qBittorrent</strong> from the Downloads category.</li>
|
<li>Pick <strong>qBittorrent</strong> from the Downloads category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>torrent</code>), host port (default: <code>8080</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>torrent</code>), host port (default: <code>8080</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function qbittorrentDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function qbittorrentDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy qBittorrent on my home host and expose it at torrent.sami" }'</code></pre>
|
-d '{ "message": "Deploy qBittorrent on my home host and expose it at torrent.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/qbittorrent:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/qbittorrent:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function radarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function radarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Radarr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Radarr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>radarr</code>), host port (default: <code>7878</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>radarr</code>), host port (default: <code>7878</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function radarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function radarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Radarr on my home host and expose it at radarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Radarr on my home host and expose it at radarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/radarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/radarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,117 @@
|
|||||||
|
import Navbar from '@/components/Navbar';
|
||||||
|
import Footer from '@/components/Footer';
|
||||||
|
import DocsLayout from '@/components/docs/DocsLayout';
|
||||||
|
|
||||||
|
export const metadata = {
|
||||||
|
title: 'Install Radicale Calendar — DashCaddy Docs',
|
||||||
|
description: 'Install and configure Radicale Calendar via DashCaddy. Lightweight self-hosted calendar (CalDAV) and contacts (CardDAV) server',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function radicaleDocsPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen flex-col bg-surface-950 text-surface-50">
|
||||||
|
<Navbar />
|
||||||
|
<DocsLayout
|
||||||
|
title="Install Radicale Calendar"
|
||||||
|
intro="Lightweight self-hosted calendar (CalDAV) and contacts (CardDAV) server. Auto-connects to the DashCaddy calendar widget."
|
||||||
|
>
|
||||||
|
<div className="mb-6 flex flex-wrap gap-3 text-xs font-semibold">
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Category: Productivity</span>
|
||||||
|
<span className="rounded-full px-3 py-1" style={{ backgroundColor: '#7cf2c022', color: '#7cf2c0' }}>Difficulty: Easy</span>
|
||||||
|
<span className="rounded-full bg-surface-800 px-3 py-1 text-surface-300">Docker image: <code className="text-brand-400">tomsquest/docker-radicale:latest</code></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>What is Radicale Calendar?</h2>
|
||||||
|
<p>Lightweight self-hosted calendar (CalDAV) and contacts (CardDAV) server. Auto-connects to the DashCaddy calendar widget.</p>
|
||||||
|
<p>Radicale ships as a self-contained Docker image that DashCaddy provisions with one click. DashCaddy handles the container lifecycle, DNS record, Caddy reverse-proxy entry, and HTTPS certificate so you can focus on using Radicale, not installing it. Uniquely among catalog apps, DashCaddy also <strong>auto-wires the deployed calendar into its own dashboard widget</strong> — credentials and the CalDAV source are generated at deploy time, so upcoming appointments appear on your dashboard without any manual configuration.</p>
|
||||||
|
|
||||||
|
<h2>Prerequisites</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
|
<li>No special host paths required — DashCaddy provisions <code>/opt/radicale/config</code> and <code>/opt/radicale/data</code> on first deploy.</li>
|
||||||
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
|
<li>Pick <strong>Radicale Calendar</strong> from the Productivity category.</li>
|
||||||
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>calendar</code>), host port (default: <code>5232</code>).</li>
|
||||||
|
<li>Click <strong>Deploy</strong>. DashCaddy will write the Radicale config and credential store <em>before</em> container start, pull the image, create persistent volumes, write the Caddy route, create the DNS record, and register the calendar source with the dashboard widget automatically.</li>
|
||||||
|
<li>When the dashboard shows the service as <strong>Running</strong>, the 📅 Calendar widget in the top bar immediately shows your upcoming events — zero extra setup.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Install via the REST API</h2>
|
||||||
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \
|
||||||
|
-H "X-API-Key: dk_..." \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d {
|
||||||
|
"appId": "radicale",
|
||||||
|
"config": {
|
||||||
|
"subdomain": "calendar",
|
||||||
|
"port": 5232
|
||||||
|
}
|
||||||
|
}</code></pre>
|
||||||
|
<p>The full body schema is in <code>src/utilities/validate.js</code> (Joi schema <code>appDeploy</code>). All <code>config.*</code> fields except <code>subdomain</code> are optional. Notable options:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>config.port</code> — host port (1–65535). Defaults to the template's <code>defaultPort</code>.</li>
|
||||||
|
<li><code>config.useExisting: true</code> + <code>existingContainerId</code> — attach DashCaddy metadata to an already-running container instead of pulling a new image.</li>
|
||||||
|
<li><code>config.tailscaleOnly: true</code> — restrict the reverse-proxy entry to your Tailscale network (a sensible default for personal calendars).</li>
|
||||||
|
<li><code>config.allowedIPs</code> — array of CIDR ranges allowed past the reverse proxy.</li>
|
||||||
|
<li><code>config.createDns: false</code> — skip DNS record creation (use when the subdomain already resolves).</li>
|
||||||
|
<li><code>config.resources</code> — <code>{memory, cpus}</code> limits applied to the container.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \
|
||||||
|
-H "X-API-Key: dk_..." \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d { "message": "Deploy a calendar server I can sync my phone with" }</code></pre>
|
||||||
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container. With no LLM configured, the built-in pattern engine recognizes "calendar", "caldav", and "radicale" phrasing.</p>
|
||||||
|
|
||||||
|
<h2>Install via the MCP Server</h2>
|
||||||
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server with:</p>
|
||||||
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
|
DASHCADDY_API_KEY=dk_...</code></pre>
|
||||||
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull tomsquest/docker-radicale:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
<h2>Post-install: first-run checklist</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Add the CalDAV URL to your phone/computer calendar apps: <code>https://<your-domain>/<username>/</code> (the DashCaddy-generated user and password are stored in the dashboard credential vault).</li>
|
||||||
|
<li>Manage sharing and additional users from the Radicale web interface.</li>
|
||||||
|
<li>Check the 📅 widget on your DashCaddy dashboard — events sync within five minutes.</li>
|
||||||
|
</ol>
|
||||||
|
<h2>Volumes and persistent data</h2>
|
||||||
|
<p>DashCaddy creates these volume mounts in the container spec:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>/opt/radicale/config:/config</code></li>
|
||||||
|
<li><code>/opt/radicale/data:/data</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>All paths are host paths (left side) mapped into the container (right side). Restarting the container preserves data; the auto-wired calendar source and its credentials survive redeploys.</p>
|
||||||
|
|
||||||
|
<h2>Environment variables</h2>
|
||||||
|
<p>This template ships no custom environment variables; Radicale is configured through the generated config file at <code>/opt/radicale/config/config</code>, which DashCaddy writes at deploy time.</p>
|
||||||
|
|
||||||
|
<h2>Updating the image</h2>
|
||||||
|
<p>There is no built-in auto-update — DashCaddy does NOT poll for new image digests. To pull a new version:</p>
|
||||||
|
<ol>
|
||||||
|
<li>SSH into the DashCaddy host and run <code>docker pull tomsquest/docker-radicale:latest</code>.</li>
|
||||||
|
<li>Restart the container: <code>docker restart <containerId></code> (find the ID via <code>GET /api/v1/services</code> or the dashboard).</li>
|
||||||
|
<li>Or deploy Watchtower from this catalog (separate template that polls Docker Hub and updates other containers automatically).</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2>Troubleshooting</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Widget shows "No sources configured"</strong> after a manual (non-DashCaddy) Radicale install: use the calendar settings modal (⚙️ in the widget) to add the CalDAV URL and credentials yourself, or register the source via <code>POST /api/v1/calendar/sources</code>.</li>
|
||||||
|
<li><strong>401 from CalDAV clients</strong>: the web interface stores users under <code>/opt/radicale/config/users</code>; the DashCaddy-managed account lives in the encrypted credential vault, not a plaintext file.</li>
|
||||||
|
<li><strong>Container restarts in a loop</strong>: check <code>docker logs <containerId></code> — the most common cause is an existing nonempty <code>/opt/radicale/config</code> owned by a different uid.</li>
|
||||||
|
</ul>
|
||||||
|
</DocsLayout>
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -27,7 +27,7 @@ export default function readarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function readarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Readarr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Readarr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>readarr</code>), host port (default: <code>8787</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>readarr</code>), host port (default: <code>8787</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function readarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function readarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Readarr on my home host and expose it at readarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Readarr on my home host and expose it at readarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/readarr:develop</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/readarr:develop</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function redisDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function redisDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Redis</strong> from the Database category.</li>
|
<li>Pick <strong>Redis</strong> from the Database category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>redis</code>), host port (default: <code>6379</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>redis</code>), host port (default: <code>6379</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function redisDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function redisDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Redis on my home host and expose it at redis.sami" }'</code></pre>
|
-d '{ "message": "Deploy Redis on my home host and expose it at redis.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull redis:alpine</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull redis:alpine</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function rocketchatDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function rocketchatDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Rocket.Chat</strong> from the Communication category.</li>
|
<li>Pick <strong>Rocket.Chat</strong> from the Communication category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>chat</code>), host port (default: <code>3004</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>chat</code>), host port (default: <code>3004</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function rocketchatDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function rocketchatDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Rocket.Chat on my home host and expose it at chat.sami" }'</code></pre>
|
-d '{ "message": "Deploy Rocket.Chat on my home host and expose it at chat.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull rocket.chat:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull rocket.chat:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function roundcubeDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function roundcubeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Roundcube</strong> from the Communication category.</li>
|
<li>Pick <strong>Roundcube</strong> from the Communication category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>webmail</code>), host port (default: <code>8086</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>webmail</code>), host port (default: <code>8086</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function roundcubeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function roundcubeDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Roundcube on my home host and expose it at webmail.sami" }'</code></pre>
|
-d '{ "message": "Deploy Roundcube on my home host and expose it at webmail.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull roundcube/roundcubemail:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull roundcube/roundcubemail:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function sabnzbdDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function sabnzbdDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>SABnzbd</strong> from the Downloads category.</li>
|
<li>Pick <strong>SABnzbd</strong> from the Downloads category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>sabnzbd</code>), host port (default: <code>8092</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>sabnzbd</code>), host port (default: <code>8092</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function sabnzbdDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function sabnzbdDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy SABnzbd on my home host and expose it at sabnzbd.sami" }'</code></pre>
|
-d '{ "message": "Deploy SABnzbd on my home host and expose it at sabnzbd.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/sabnzbd:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/sabnzbd:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function samiFilesDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function samiFilesDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Sami Files</strong> from the Files category.</li>
|
<li>Pick <strong>Sami Files</strong> from the Files category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>files</code>), host port (default: <code>8765</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>files</code>), host port (default: <code>8765</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function samiFilesDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,28 +69,28 @@ export default function samiFilesDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Sami Files on my home host and expose it at files.sami" }'</code></pre>
|
-d '{ "message": "Deploy Sami Files on my home host and expose it at files.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
<h2>Post-install: first-run checklist</h2>
|
<h2>Post-install: first-run checklist</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Clone the repo: git clone http://100.81.59.99:3030/sami7777/sami-files.git /opt/sami-files</li>
|
<li>Clone the repo: clone the sami-files repository from your own source into /opt/sami-files</li>
|
||||||
<li>Create venv and install deps: /usr/local/lib/hermes-agent/venv/bin/pip install fastapi uvicorn asyncssh pyyaml python-multipart</li>
|
<li>Create a Python venv and install dependencies: <code>pip install fastapi uvicorn asyncssh pyyaml python-multipart</code></li>
|
||||||
<li>Copy deploy/sami-files.service to /etc/systemd/system/ and `systemctl daemon-reload`</li>
|
<li>Copy deploy/sami-files.service to /etc/systemd/system/ and `systemctl daemon-reload`</li>
|
||||||
<li>Enable + start: systemctl enable --now sami-files.service</li>
|
<li>Enable + start: systemctl enable --now sami-files.service</li>
|
||||||
<li>Edit /opt/sami-files/config/servers.yaml to add your SSH targets</li>
|
<li>Edit /opt/sami-files/config/servers.yaml to add your SSH targets</li>
|
||||||
<li>Add the Caddy snippet (above) to your Caddyfile and reload Caddy</li>
|
<li>Add the Caddy snippet (above) to your Caddyfile and reload Caddy</li>
|
||||||
<li>Mount the log dir into DashCaddy: add `-v /opt/sami-files/logs:/opt/sami-files/logs:ro` to start.sh, then recreate the container</li>
|
<li>Mount the log dir into DashCaddy: add `-v /opt/sami-files/logs:/opt/sami-files/logs:ro` to start.sh, then recreate the container</li>
|
||||||
<li>Browse to https://files.sami — log in via DashCaddy SSO</li>
|
<li>Browse to https://files.home — log in via DashCaddy SSO</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h2>Volumes and persistent data</h2>
|
<h2>Volumes and persistent data</h2>
|
||||||
<p>DashCaddy creates these volume mounts in the container spec:</p>
|
<p>DashCaddy creates these volume mounts in the container spec:</p>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function seerrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function seerrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Seerr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Seerr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>requests</code>), host port (default: <code>5055</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>requests</code>), host port (default: <code>5055</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function seerrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function seerrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Seerr on my home host and expose it at requests.sami" }'</code></pre>
|
-d '{ "message": "Deploy Seerr on my home host and expose it at requests.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/seerr-team/seerr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/seerr-team/seerr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function sonarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function sonarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Sonarr</strong> from the Media Management category.</li>
|
<li>Pick <strong>Sonarr</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>sonarr</code>), host port (default: <code>8989</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>sonarr</code>), host port (default: <code>8989</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function sonarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function sonarrDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Sonarr on my home host and expose it at sonarr.sami" }'</code></pre>
|
-d '{ "message": "Deploy Sonarr on my home host and expose it at sonarr.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/sonarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/sonarr:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function speedtestDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function speedtestDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Speedtest Tracker</strong> from the Monitoring category.</li>
|
<li>Pick <strong>Speedtest Tracker</strong> from the Monitoring category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>speedtest</code>), host port (default: <code>8093</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>speedtest</code>), host port (default: <code>8093</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function speedtestDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function speedtestDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Speedtest Tracker on my home host and expose it at speedtest.sami" }'</code></pre>
|
-d '{ "message": "Deploy Speedtest Tracker on my home host and expose it at speedtest.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/alexjustesen/speedtest-tracker:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull ghcr.io/alexjustesen/speedtest-tracker:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function standardnotesDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function standardnotesDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Standard Notes</strong> from the Productivity category.</li>
|
<li>Pick <strong>Standard Notes</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>notes</code>), host port (default: <code>3007</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>notes</code>), host port (default: <code>3007</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function standardnotesDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function standardnotesDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Standard Notes on my home host and expose it at notes.sami" }'</code></pre>
|
-d '{ "message": "Deploy Standard Notes on my home host and expose it at notes.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull standardnotes/server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull standardnotes/server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function stirlingPdfDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function stirlingPdfDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Stirling PDF</strong> from the Utilities category.</li>
|
<li>Pick <strong>Stirling PDF</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>pdf</code>), host port (default: <code>8084</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>pdf</code>), host port (default: <code>8084</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function stirlingPdfDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function stirlingPdfDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Stirling PDF on my home host and expose it at pdf.sami" }'</code></pre>
|
-d '{ "message": "Deploy Stirling PDF on my home host and expose it at pdf.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull frooodle/s-pdf:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull frooodle/s-pdf:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function syncthingDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function syncthingDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Syncthing</strong> from the Files category.</li>
|
<li>Pick <strong>Syncthing</strong> from the Files category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>sync</code>), host port (default: <code>8384</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>sync</code>), host port (default: <code>8384</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function syncthingDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function syncthingDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Syncthing on my home host and expose it at sync.sami" }'</code></pre>
|
-d '{ "message": "Deploy Syncthing on my home host and expose it at sync.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/syncthing:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/syncthing:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function tautulliDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function tautulliDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Tautulli</strong> from the Media Management category.</li>
|
<li>Pick <strong>Tautulli</strong> from the Media Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>tautulli</code>), host port (default: <code>8181</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>tautulli</code>), host port (default: <code>8181</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function tautulliDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function tautulliDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Tautulli on my home host and expose it at tautulli.sami" }'</code></pre>
|
-d '{ "message": "Deploy Tautulli on my home host and expose it at tautulli.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/tautulli:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/tautulli:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function technitiumDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function technitiumDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Technitium DNS Server</strong> from the DNS category.</li>
|
<li>Pick <strong>Technitium DNS Server</strong> from the DNS category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns1</code>), host port (default: <code>5380</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>dns1</code>), host port (default: <code>5380</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function technitiumDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,24 +69,24 @@ export default function technitiumDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Technitium DNS Server on my home host and expose it at dns1.sami" }'</code></pre>
|
-d '{ "message": "Deploy Technitium DNS Server on my home host and expose it at dns1.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull technitium/dns-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull technitium/dns-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
<h2>Post-install: first-run checklist</h2>
|
<h2>Post-install: first-run checklist</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Access web interface at https://dns1.sami</li>
|
<li>Access web interface at https://dns1.home</li>
|
||||||
<li>Login with admin credentials</li>
|
<li>Login with admin credentials</li>
|
||||||
<li>Create a primary zone for 'sami' domain</li>
|
<li>Create a primary zone for 'sami' domain</li>
|
||||||
<li>Add A records for your services (e.g., plex.sami -> 192.168.1.100)</li>
|
<li>Add A records for your services (e.g., plex.home -> 192.168.1.100)</li>
|
||||||
<li>Configure your devices to use this DNS server</li>
|
<li>Configure your devices to use this DNS server</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h2>Volumes and persistent data</h2>
|
<h2>Volumes and persistent data</h2>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function transmissionDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function transmissionDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Transmission</strong> from the Downloads category.</li>
|
<li>Pick <strong>Transmission</strong> from the Downloads category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>transmission</code>), host port (default: <code>9092</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>transmission</code>), host port (default: <code>9092</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function transmissionDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function transmissionDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Transmission on my home host and expose it at transmission.sami" }'</code></pre>
|
-d '{ "message": "Deploy Transmission on my home host and expose it at transmission.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/transmission:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/transmission:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function triliumDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function triliumDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Trilium Notes</strong> from the Productivity category.</li>
|
<li>Pick <strong>Trilium Notes</strong> from the Productivity category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>notes</code>), host port (default: <code>8085</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>notes</code>), host port (default: <code>8085</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function triliumDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function triliumDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Trilium Notes on my home host and expose it at notes.sami" }'</code></pre>
|
-d '{ "message": "Deploy Trilium Notes on my home host and expose it at notes.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull zadam/trilium:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull zadam/trilium:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function uptimeKumaDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function uptimeKumaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Uptime Kuma</strong> from the Monitoring category.</li>
|
<li>Pick <strong>Uptime Kuma</strong> from the Monitoring category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>uptime</code>), host port (default: <code>3002</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>uptime</code>), host port (default: <code>3002</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function uptimeKumaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function uptimeKumaDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Uptime Kuma on my home host and expose it at uptime.sami" }'</code></pre>
|
-d '{ "message": "Deploy Uptime Kuma on my home host and expose it at uptime.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull louislam/uptime-kuma:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull louislam/uptime-kuma:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function valheimDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function valheimDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Valheim Server</strong> from the Gaming category.</li>
|
<li>Pick <strong>Valheim Server</strong> from the Gaming category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>valheim</code>), host port (default: <code>2456</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>valheim</code>), host port (default: <code>2456</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function valheimDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function valheimDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Valheim Server on my home host and expose it at valheim.sami" }'</code></pre>
|
-d '{ "message": "Deploy Valheim Server on my home host and expose it at valheim.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull lloesche/valheim-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull lloesche/valheim-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function vaultwardenDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function vaultwardenDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Vaultwarden</strong> from the Security category.</li>
|
<li>Pick <strong>Vaultwarden</strong> from the Security category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>vault</code>), host port (default: <code>8088</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>vault</code>), host port (default: <code>8088</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function vaultwardenDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function vaultwardenDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Vaultwarden on my home host and expose it at vault.sami" }'</code></pre>
|
-d '{ "message": "Deploy Vaultwarden on my home host and expose it at vault.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull vaultwarden/server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull vaultwarden/server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function vintageRadioDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function vintageRadioDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Vintage Stereo</strong> from the Media category.</li>
|
<li>Pick <strong>Vintage Stereo</strong> from the Media category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>radio</code>), host port (default: <code>8090</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>radio</code>), host port (default: <code>8090</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function vintageRadioDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,22 +69,22 @@ export default function vintageRadioDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Vintage Stereo on my home host and expose it at radio.sami" }'</code></pre>
|
-d '{ "message": "Deploy Vintage Stereo on my home host and expose it at radio.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull nginx:alpine</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull nginx:alpine</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
<h2>Post-install: first-run checklist</h2>
|
<h2>Post-install: first-run checklist</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Run `bash /usr/local/bin/vintage-radio-install.sh` once before starting the container — copies the bundled web assets (index.html, radio.css, radio.js, stations.json) from the DashCaddy repo (dashcaddy-api/static-sites/vintage-radio/web) into /opt/vintage-radio/web</li>
|
<li>Run `bash /usr/local/bin/vintage-radio-install.sh` once before starting the container — copies the bundled web assets (index.html, radio.css, radio.js, stations.json) from the DashCaddy repo (dashcaddy-api/static-sites/vintage-radio/web) into /opt/vintage-radio/web</li>
|
||||||
<li>Open radio.sami (or your configured subdomain)</li>
|
<li>Open radio.home (or your configured subdomain)</li>
|
||||||
<li>Press the PWR knob, drag the dial or click a station card</li>
|
<li>Press the PWR knob, drag the dial or click a station card</li>
|
||||||
<li>Cycle the MODE knob to filter by genre (ALL / AMBIENT / ROCK / MIXED)</li>
|
<li>Cycle the MODE knob to filter by genre (ALL / AMBIENT / ROCK / MIXED)</li>
|
||||||
<li>To add stations, edit /opt/vintage-radio/web/stations.json on the host and restart the container</li>
|
<li>To add stations, edit /opt/vintage-radio/web/stations.json on the host and restart the container</li>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function vscodeServerDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function vscodeServerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>VS Code Server</strong> from the Development category.</li>
|
<li>Pick <strong>VS Code Server</strong> from the Development category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>code</code>), host port (default: <code>8443</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>code</code>), host port (default: <code>8443</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function vscodeServerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function vscodeServerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy VS Code Server on my home host and expose it at code.sami" }'</code></pre>
|
-d '{ "message": "Deploy VS Code Server on my home host and expose it at code.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull codercom/code-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull codercom/code-server:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function watchtowerDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function watchtowerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Watchtower</strong> from the Management category.</li>
|
<li>Pick <strong>Watchtower</strong> from the Management category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>watchtower</code>), host port (default: <code>8089</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>watchtower</code>), host port (default: <code>8089</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function watchtowerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function watchtowerDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Watchtower on my home host and expose it at watchtower.sami" }'</code></pre>
|
-d '{ "message": "Deploy Watchtower on my home host and expose it at watchtower.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull containrrr/watchtower:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull containrrr/watchtower:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function weatherDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function weatherDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Weather</strong> from the Utilities category.</li>
|
<li>Pick <strong>Weather</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>weather</code>), host port (default: <code>32400</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>weather</code>), host port (default: <code>32400</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function weatherDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function weatherDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Weather on my home host and expose it at weather.sami" }'</code></pre>
|
-d '{ "message": "Deploy Weather on my home host and expose it at weather.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull N/A</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function whoamiDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function whoamiDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>Whoami</strong> from the Utilities category.</li>
|
<li>Pick <strong>Whoami</strong> from the Utilities category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>whoami</code>), host port (default: <code>8094</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>whoami</code>), host port (default: <code>8094</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function whoamiDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function whoamiDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy Whoami on my home host and expose it at whoami.sami" }'</code></pre>
|
-d '{ "message": "Deploy Whoami on my home host and expose it at whoami.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull traefik/whoami:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull traefik/whoami:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function wireguardDocsPage() {
|
|||||||
|
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://status.sami</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
<li>A running DashCaddy host with the dashboard accessible (default URL: <code>https://dashcaddy.local</code>; configurable via the <code>dashboardHost</code> setting in <code>config.json</code>).</li>
|
||||||
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
<li>You must be signed in to the dashboard with an admin session, or have an API key with admin scope (<code>POST /api/v1/auth/keys</code> to create one).</li>
|
||||||
<li>No special host paths required.</li>
|
<li>No special host paths required.</li>
|
||||||
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
<li>For HTTPS with a real certificate, Technitium DNS must be configured and the host must have port 80/443 reachable from the internet. Otherwise DashCaddy will fall back to direct-IP access or a self-signed certificate.</li>
|
||||||
@@ -35,7 +35,7 @@ export default function wireguardDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the DashCaddy dashboard</h2>
|
<h2>Install via the DashCaddy dashboard</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Sign in at <code>https://status.sami</code> (or your host's dashboard URL).</li>
|
<li>Sign in at <code>https://dashcaddy.local</code> (or your host's dashboard URL).</li>
|
||||||
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
<li>Click the <strong>📱 App Selector</strong> button on the dashboard home page.</li>
|
||||||
<li>Pick <strong>WireGuard VPN</strong> from the Networking category.</li>
|
<li>Pick <strong>WireGuard VPN</strong> from the Networking category.</li>
|
||||||
<li>Fill in the deployment form: subdomain (default suggestion: <code>vpn</code>), host port (default: <code>51820</code>).</li>
|
<li>Fill in the deployment form: subdomain (default suggestion: <code>vpn</code>), host port (default: <code>51820</code>).</li>
|
||||||
@@ -45,7 +45,7 @@ export default function wireguardDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the REST API</h2>
|
<h2>Install via the REST API</h2>
|
||||||
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
<p>Authenticate with an API key (or a JWT minted via <code>POST /api/v1/auth/jwt</code>). Send as <code>X-API-Key: dk_...</code> or <code>Authorization: Bearer <jwt></code>.</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/apps/deploy \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/apps/deploy \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{
|
-d '{
|
||||||
@@ -69,15 +69,15 @@ export default function wireguardDocsPage() {
|
|||||||
|
|
||||||
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
<h2>Install via the AI Intent Router (returns a structured intent)</h2>
|
||||||
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
<p>The Intent Router returns a structured intent, not a deployed container. To deploy via AI, send natural language to:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://status.sami/api/v1/ai/intent \\
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>curl -X POST https://dashcaddy.local/api/v1/ai/intent \\
|
||||||
-H "X-API-Key: dk_your_api_key" \\
|
-H "X-API-Key: dk_your_api_key" \\
|
||||||
-H "Content-Type: application/json" \\
|
-H "Content-Type: application/json" \\
|
||||||
-d '{ "message": "Deploy WireGuard VPN on my home host and expose it at vpn.sami" }'</code></pre>
|
-d '{ "message": "Deploy WireGuard VPN on my home host and expose it at vpn.home" }'</code></pre>
|
||||||
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
<p>The response includes <code>intent</code>, <code>action</code>, <code>parameters</code>, and <code>followup</code> — your client (or the MCP server) must then call <code>POST /api/v1/apps/deploy</code> with those parameters to actually provision the container.</p>
|
||||||
|
|
||||||
<h2>Install via the MCP Server</h2>
|
<h2>Install via the MCP Server</h2>
|
||||||
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
<p>For AI agents (Claude Desktop, Hermes, etc.) configure the MCP server (<code>src/mcp/mcp-server.js</code>) with:</p>
|
||||||
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://status.sami:3001 # internal API URL, may differ from dashboard URL
|
<pre className="overflow-x-auto rounded-lg bg-surface-900 p-4 text-sm"><code>DASHCADDY_URL=https://dashcaddy.local:3001 # internal API URL, may differ from dashboard URL
|
||||||
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
DASHCADDY_API_KEY=dk_your_api_key</code></pre>
|
||||||
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/wireguard:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
<p>The server exposes <code>dashcaddy_deploy_app</code>. Note: this tool writes the Caddy route and creates the <code>services.json</code> entry, but it does NOT pull the Docker image or start the container. You must run <code>docker pull linuxserver/wireguard:latest</code> and start the container yourself for the URL to actually serve traffic. For a fully-managed deployment, call <code>POST /api/v1/apps/deploy</code> directly from your agent.</p>
|
||||||
|
|
||||||
|
|||||||
@@ -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 77 one-click templates</h3>
|
<h3>1. Pick from 78 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 77 applications.
|
opens with a searchable grid of 78 applications.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>Step 2: Find Plex</h3>
|
<h3>Step 2: Find Plex</h3>
|
||||||
|
|||||||
@@ -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>77 one-click application templates</strong> from the catalog.
|
deploy the <strong>78 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,
|
||||||
|
|||||||
@@ -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">77 one-click templates</td>
|
<td className="py-3 pr-4">78 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">
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export default function DocsPremiumPage() {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>Dashboard & web UI</td><td>✓</td><td>✓</td></tr>
|
<tr><td>Dashboard & web UI</td><td>✓</td><td>✓</td></tr>
|
||||||
<tr><td>77 application templates</td><td>✓</td><td>✓</td></tr>
|
<tr><td>78 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>
|
||||||
@@ -61,6 +61,8 @@ export default function DocsPremiumPage() {
|
|||||||
<tr><td><strong>Recipes (multi-container stacks)</strong></td><td>—</td><td>✓</td></tr>
|
<tr><td><strong>Recipes (multi-container stacks)</strong></td><td>—</td><td>✓</td></tr>
|
||||||
<tr><td><strong>Docker Swarm orchestration</strong></td><td>—</td><td>✓</td></tr>
|
<tr><td><strong>Docker Swarm orchestration</strong></td><td>—</td><td>✓</td></tr>
|
||||||
<tr><td><strong>Multi-Host Fleet Management</strong></td><td>—</td><td>✓</td></tr>
|
<tr><td><strong>Multi-Host Fleet Management</strong></td><td>—</td><td>✓</td></tr>
|
||||||
|
<tr><td><strong>Workflow Automation</strong></td><td>—</td><td>✓</td></tr>
|
||||||
|
<tr><td><strong>Scheduled Backups</strong> (manual one-click backup is free)</td><td>—</td><td>✓</td></tr>
|
||||||
<tr><td>Priority support</td><td>—</td><td>✓</td></tr>
|
<tr><td>Priority support</td><td>—</td><td>✓</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -159,6 +161,25 @@ curl -X POST -H "Authorization: Bearer ***" \\
|
|||||||
of hosts, some of which are themselves Swarm clusters.
|
of hosts, some of which are themselves Swarm clusters.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h3>Workflow Automation</h3>
|
||||||
|
<p>
|
||||||
|
<strong>Workflow Automation</strong> bundles five maintenance workflows that run against your own
|
||||||
|
infrastructure: <strong>Auto-Restart on Crash</strong> (restarts a container when it goes down),
|
||||||
|
<strong>Backup Before Update</strong> (snapshots an app ahead of any update), <strong>Periodic Health
|
||||||
|
Check</strong> (health probes every 15 minutes with degraded alerts), <strong>Disk Space Alert</strong>
|
||||||
|
(notifies past 80% usage), and <strong>Weekly Container Report</strong> (a summary of container status
|
||||||
|
and resource usage). Each workflow can be enabled, disabled, run on demand, and reviewed via per-run
|
||||||
|
history from the dashboard or the REST API (<code>/api/v1/workflows</code>).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>Scheduled Backups</h3>
|
||||||
|
<p>
|
||||||
|
<strong>Scheduled Backups</strong> automates the backup manager: per-app schedules with configurable
|
||||||
|
interval, retention (count or age), storage cap, destination, and run-now semantics (<code>/api/v1/backups/schedule</code>
|
||||||
|
endpoints). Manual one-click backup and full Disaster Recovery — SHA-256 checksummed snapshots with verified
|
||||||
|
one-click restore — stay in the free tier; Premium adds the <em>automation</em> layer on top.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2>Pricing</h2>
|
<h2>Pricing</h2>
|
||||||
<p>
|
<p>
|
||||||
Premium is sold as a fixed-duration license. You pick the duration that fits your needs; the license unlocks
|
Premium is sold as a fixed-duration license. You pick the duration that fits your needs; the license unlocks
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ export default function FeaturesPage() {
|
|||||||
features: [
|
features: [
|
||||||
{ icon: '🎯', label: 'AI Intent Router — natural language commands' },
|
{ icon: '🎯', label: 'AI Intent Router — natural language commands' },
|
||||||
{ icon: '🔌', label: 'MCP Server for Claude & GPT control' },
|
{ icon: '🔌', label: 'MCP Server for Claude & GPT control' },
|
||||||
|
{ icon: '🤝', label: 'Connect AI — one click mints an MCP key + client config' },
|
||||||
{ icon: '💬', label: '"deploy Plex", "check SSL status", "restart jellyfin"' },
|
{ icon: '💬', label: '"deploy Plex", "check SSL status", "restart jellyfin"' },
|
||||||
{ icon: '🧠', label: 'Context-aware infrastructure reasoning' },
|
{ icon: '🧠', label: 'Context-aware infrastructure reasoning' },
|
||||||
],
|
],
|
||||||
@@ -40,13 +41,14 @@ export default function FeaturesPage() {
|
|||||||
id: 'app-deployment',
|
id: 'app-deployment',
|
||||||
title: 'App Deployment',
|
title: 'App Deployment',
|
||||||
description:
|
description:
|
||||||
'Deploy from a library of 77 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 78 pre-configured templates with one click — automatic configuration, smart defaults, and service discovery that auto-detects running services 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: '77 app templates' },
|
{ icon: '📦', label: '78 app templates' },
|
||||||
{ icon: '⚙️', label: 'Automatic configuration' },
|
{ icon: '⚙️', label: 'Automatic configuration' },
|
||||||
{ icon: '🔍', label: 'Service Discovery & auto-adopt' },
|
{ icon: '🔍', label: 'Service Discovery & auto-adopt' },
|
||||||
|
{ icon: '📅', label: 'Calendar widget — hosted Radicale auto-connects' },
|
||||||
{ icon: '🧙', label: 'Smart Defaults Wizard' },
|
{ icon: '🧙', label: 'Smart Defaults Wizard' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -123,12 +125,12 @@ export default function FeaturesPage() {
|
|||||||
id: 'premium',
|
id: 'premium',
|
||||||
title: 'Premium Features',
|
title: 'Premium Features',
|
||||||
description:
|
description:
|
||||||
'Power features for production and multi-host deployments. Auto-Login SSO across your apps, multi-container Recipes, Docker Swarm orchestration, and Fleet Management to register remote instances with parallel health probes and multi-host deploy plans.',
|
'Power features for production and multi-host deployments. Auto-Login SSO across your apps, multi-service Recipes, Swarm orchestration, and Fleet Management to register remote instances with parallel health probes and multi-host Shipdeck deploy plans.',
|
||||||
icon: '⭐',
|
icon: '⭐',
|
||||||
features: [
|
features: [
|
||||||
{ icon: '🔑', label: 'Auto-Login SSO', premium: true },
|
{ icon: '🔑', label: 'Auto-Login SSO', premium: true },
|
||||||
{ icon: '📚', label: 'Recipes (multi-container stacks)', premium: true },
|
{ icon: '📚', label: 'Recipes (multi-container stacks)', premium: true },
|
||||||
{ icon: '🐳', label: 'Docker Swarm orchestration', premium: true },
|
{ icon: '🚢', label: 'Swarm orchestration', premium: true },
|
||||||
{ icon: '📡', label: 'Multi-Host Fleet Management', premium: true },
|
{ icon: '📡', label: 'Multi-Host Fleet Management', premium: true },
|
||||||
{ icon: '🔗', label: 'Secure Share Links (public + Tailscale)', premium: true },
|
{ icon: '🔗', label: 'Secure Share Links (public + Tailscale)', premium: true },
|
||||||
{ icon: '🚀', label: 'Priority support', premium: true },
|
{ icon: '🚀', label: 'Priority support', premium: true },
|
||||||
@@ -352,7 +354,7 @@ export default function FeaturesPage() {
|
|||||||
</div>
|
</div>
|
||||||
<ul className="space-y-3">
|
<ul className="space-y-3">
|
||||||
{[
|
{[
|
||||||
'77 one-click app templates',
|
'78 one-click app templates',
|
||||||
'Automatic SSL certificates',
|
'Automatic SSL certificates',
|
||||||
'Technitium DNS automation',
|
'Technitium DNS automation',
|
||||||
'Reverse proxy + Caddyfile builder',
|
'Reverse proxy + Caddyfile builder',
|
||||||
@@ -396,7 +398,8 @@ export default function FeaturesPage() {
|
|||||||
{[
|
{[
|
||||||
'Auto-Login SSO for deployed apps',
|
'Auto-Login SSO for deployed apps',
|
||||||
'Recipes — multi-container stack deployment',
|
'Recipes — multi-container stack deployment',
|
||||||
'Docker Swarm orchestration',
|
'Shipdeck deploys \u2014 GitHub to production in one command',
|
||||||
|
'Swarm orchestration',
|
||||||
'Multi-Host Fleet Management (remote instances, parallel health probes, multi-host deploy plans)',
|
'Multi-Host Fleet Management (remote instances, parallel health probes, multi-host deploy plans)',
|
||||||
'Disaster Recovery (full-system backup w/ checksums)',
|
'Disaster Recovery (full-system backup w/ checksums)',
|
||||||
'Priority support',
|
'Priority support',
|
||||||
|
|||||||
+10
-3
@@ -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 77 Docker apps with one click. AI-powered self-hosting with automatic SSL, DNS, reverse proxy, security center, and fleet management.",
|
"Deploy 78 apps with one click \u2014 or ship your own code straight from GitHub with built-in Shipdeck deploys. 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 77 Docker apps with one click. AI-powered self-hosting with automatic SSL, DNS, and reverse proxy.",
|
"Deploy 78 apps with one click \u2014 or ship your own code straight from GitHub with built-in Shipdeck deploys. 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,10 @@ 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 77 Docker apps with one click. AI-powered self-hosting.",
|
"Deploy 78 apps with one click. AI-powered self-hosting, GitHub-to-production deploys with Shipdeck.",
|
||||||
|
},
|
||||||
|
alternates: {
|
||||||
|
types: { "application/rss+xml": "https://dashcaddy.net/feed.xml" },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -56,6 +59,10 @@ export default function RootLayout({
|
|||||||
</head>
|
</head>
|
||||||
<body className="min-h-full flex flex-col bg-surface-950 text-surface-100" style={{ fontFamily: "'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif" }}>
|
<body className="min-h-full flex flex-col bg-surface-950 text-surface-100" style={{ fontFamily: "'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif" }}>
|
||||||
{children}
|
{children}
|
||||||
|
{/* Plausible custom-events queue bootstrap (documented pattern): events fired
|
||||||
|
before the deferred tracker loads are queued and sent once it initializes. */}
|
||||||
|
<script dangerouslySetInnerHTML={{ __html: `window.plausible=window.plausible||function(){(window.plausible.q=window.plausible.q||[]).push(arguments)};` }} />
|
||||||
|
<script defer src="https://stats.dashcaddy.net/js/script.outbound-links.tagged-events.js" data-domain="dashcaddy.net" />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
|
|||||||
+8
-8
@@ -46,8 +46,8 @@ export default function Home() {
|
|||||||
</h1>
|
</h1>
|
||||||
<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 “deploy Plex” — DashCaddy’s AI Intent Router handles the rest.
|
Just say “deploy Plex” — DashCaddy’s AI Intent Router handles the rest.
|
||||||
Deploy Docker apps with one click, automatic SSL, DNS, and reverse proxy.
|
Deploy apps with one click, automatic SSL, DNS, and reverse proxy — or ship your own code straight from GitHub with built-in Shipdeck deploys.
|
||||||
77 templates, fleet management, and an MCP control plane for AI assistants.
|
78 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>
|
||||||
@@ -208,17 +208,17 @@ export default function Home() {
|
|||||||
<FeatureCard
|
<FeatureCard
|
||||||
icon="🧩"
|
icon="🧩"
|
||||||
title="MCP Server"
|
title="MCP Server"
|
||||||
description="Model Context Protocol integration turns DashCaddy into an AI-native control plane. Let your AI assistant manage your entire self-hosted infrastructure."
|
description="Model Context Protocol integration turns DashCaddy into an AI-native control plane. Your AI assistant deploys apps, checks health, manages containers, backups, and DNS through one MCP endpoint — and the public /api/v1/capabilities manifest tells it exactly what the running build supports."
|
||||||
/>
|
/>
|
||||||
<FeatureCard
|
<FeatureCard
|
||||||
icon="🚀"
|
icon="🚀"
|
||||||
title="77 App Templates"
|
title="78 App Templates"
|
||||||
description="Choose from 77 pre-configured Docker app templates. Deploy your favorite applications instantly without manual configuration."
|
description="Choose from 78 pre-configured app templates with smart defaults — deploy your favorite applications in one click, no manual configuration, no compose files to write."
|
||||||
/>
|
/>
|
||||||
<FeatureCard
|
<FeatureCard
|
||||||
icon="🛡️"
|
icon="🛡️"
|
||||||
title="Security Center"
|
title="Security Center"
|
||||||
description="Unified event pipeline aggregates Docker, Caddy, DNS, Tailscale, audit log, and health checker events into one real-time security dashboard — with per-IP perimeter analytics and automatic PII masking on every log."
|
description="Unified event pipeline aggregates deploys, Caddy, DNS, Tailscale, audit log, and health checker events into one real-time security dashboard — with per-IP perimeter analytics and automatic PII masking on every log."
|
||||||
/>
|
/>
|
||||||
<FeatureCard
|
<FeatureCard
|
||||||
icon="🖥️"
|
icon="🖥️"
|
||||||
@@ -364,7 +364,7 @@ export default function Home() {
|
|||||||
Feature
|
Feature
|
||||||
</th>
|
</th>
|
||||||
<th className="px-6 py-4 text-center text-sm font-semibold text-surface-300 bg-surface-900/50">
|
<th className="px-6 py-4 text-center text-sm font-semibold text-surface-300 bg-surface-900/50">
|
||||||
Manual Docker Setup
|
Manual Setup
|
||||||
</th>
|
</th>
|
||||||
<th className="px-6 py-4 text-center text-sm font-semibold text-brand-400 bg-surface-900/70">
|
<th className="px-6 py-4 text-center text-sm font-semibold text-brand-400 bg-surface-900/70">
|
||||||
DashCaddy
|
DashCaddy
|
||||||
@@ -405,7 +405,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">✓ 77 pre-configured</span>
|
<span className="text-green-400 font-semibold">✓ 78 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">
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import Footer from '@/components/Footer';
|
|||||||
// creates a Stripe Checkout session (one-time OR subscription) and
|
// creates a Stripe Checkout session (one-time OR subscription) and
|
||||||
// returns { url, sessionId }; we redirect the browser to that URL.
|
// returns { url, sessionId }; we redirect the browser to that URL.
|
||||||
//
|
//
|
||||||
// Plan codes (see /root/dashcaddy-license-server/src/plans.js):
|
// Plan codes (server-defined in the license service):
|
||||||
// premium_30d → $20, 30-day license, one-time or 1-month sub
|
// premium_30d → $20, 30-day license, one-time or 1-month sub
|
||||||
// premium_90d → $50, 90-day license, one-time or 3-month sub
|
// premium_90d → $50, 90-day license, one-time or 3-month sub
|
||||||
// premium_180d → $70, 180-day license, one-time or 6-month sub
|
// premium_180d → $70, 180-day license, one-time or 6-month sub
|
||||||
@@ -35,7 +35,24 @@ async function startCheckout(mode: CheckoutMode, planCode: string, customerEmail
|
|||||||
const message = (data as CheckoutError).error || `Checkout failed (${res.status})`;
|
const message = (data as CheckoutError).error || `Checkout failed (${res.status})`;
|
||||||
throw new Error(message);
|
throw new Error(message);
|
||||||
}
|
}
|
||||||
return (data as { url: string }).url;
|
const url = (data as { url: string }).url;
|
||||||
|
// Validate destination: must be Stripe's HTTPS checkout host
|
||||||
|
let dest: URL;
|
||||||
|
try {
|
||||||
|
dest = new URL(url);
|
||||||
|
} catch {
|
||||||
|
throw new Error('Checkout failed: invalid redirect URL');
|
||||||
|
}
|
||||||
|
if (dest.protocol !== 'https:' || !(dest.hostname === 'checkout.stripe.com' || dest.hostname.endsWith('.stripe.com'))) {
|
||||||
|
throw new Error('Checkout failed: unexpected redirect destination');
|
||||||
|
}
|
||||||
|
// Analytics: checkout intent confirmed (fires before redirect; Plausible
|
||||||
|
// sends with keepalive so the event survives navigation away)
|
||||||
|
try {
|
||||||
|
const p = (window as unknown as { plausible?: (e: string, o?: Record<string, unknown>) => void }).plausible;
|
||||||
|
p?.('Checkout Initiated', { props: { plan: planCode, mode } });
|
||||||
|
} catch { /* analytics must never break checkout */ }
|
||||||
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isValidEmail(email: string): boolean {
|
function isValidEmail(email: string): boolean {
|
||||||
@@ -76,7 +93,7 @@ export default function PricingPage() {
|
|||||||
|
|
||||||
const coreFeatures = [
|
const coreFeatures = [
|
||||||
'Dashboard & real-time service monitoring',
|
'Dashboard & real-time service monitoring',
|
||||||
'77 pre-configured app templates',
|
'78 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',
|
||||||
@@ -99,8 +116,10 @@ export default function PricingPage() {
|
|||||||
'Everything in Core, plus:',
|
'Everything in Core, plus:',
|
||||||
'Auto-Login SSO for deployed apps',
|
'Auto-Login SSO for deployed apps',
|
||||||
'Recipes — multi-container stack deployment',
|
'Recipes — multi-container stack deployment',
|
||||||
'Swarm — Docker Swarm multi-node orchestration',
|
'Swarm — multi-node orchestration',
|
||||||
'Multi-Host Fleet Management — remote instance control',
|
'Multi-Host Fleet Management — remote instance control',
|
||||||
|
'Workflow Automation — scripted multi-step operations',
|
||||||
|
'Scheduled Backups — automated backup schedules (manual one-click backup stays free)',
|
||||||
'Priority support',
|
'Priority support',
|
||||||
'One active machine per license',
|
'One active machine per license',
|
||||||
'7-day grace period on expiry',
|
'7-day grace period on expiry',
|
||||||
@@ -122,7 +141,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 77 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, manual one-click backup, and all 78 app templates. Premium unlocks SSO, Recipes, Swarm orchestration, Fleet Management, workflow automation, and scheduled backups for advanced multi-node setups.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
question: 'How many machines can I activate?',
|
question: 'How many machines can I activate?',
|
||||||
@@ -154,7 +173,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 77 app templates. Premium unlocks SSO, Recipes, Swarm, and Fleet Management. Buy once for a fixed term, or subscribe and never worry about renewal — your license is extended automatically.
|
The core platform is completely free — including AI commands, Security Center, and all 78 app templates. Premium unlocks SSO, Recipes, Swarm, and Fleet Management. Buy once for a fixed term, or subscribe and never worry about renewal — your license is extended automatically.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -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 (77 templates, Aug 2026).
|
// Verified against src/docker/app-templates.js (78 templates, Aug 2026).
|
||||||
const apps: App[] = [
|
const apps: App[] = [
|
||||||
// Media
|
// Media
|
||||||
{ name: 'Plex', icon: '🎬', category: 'Media' },
|
{ name: 'Plex', icon: '🎬', category: 'Media' },
|
||||||
@@ -158,7 +158,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">
|
||||||
77 One-Click App Templates
|
78 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 +216,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">
|
||||||
77
|
78
|
||||||
</div>
|
</div>
|
||||||
<p className="text-sm text-surface-400">App Templates</p>
|
<p className="text-sm text-surface-400">App Templates</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ const rows: Capability[] = [
|
|||||||
values: { 'Portainer': false, 'CasaOS': false, 'YunoHost': false, 'Unraid': false, 'Cosmos Cloud': false },
|
values: { 'Portainer': false, 'CasaOS': false, 'YunoHost': false, 'Unraid': false, 'Cosmos Cloud': false },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
feature: 'One-click Docker templates',
|
feature: 'One-click app templates',
|
||||||
dashcaddy: '77 apps',
|
dashcaddy: '78 apps',
|
||||||
values: { 'Portainer': 'Manual', 'CasaOS': '~120 apps', 'YunoHost': '~500 apps', 'Unraid': 'Community', 'Cosmos Cloud': '~30 apps' },
|
values: { 'Portainer': 'Manual', 'CasaOS': '~120 apps', 'YunoHost': '~500 apps', 'Unraid': 'Community', 'Cosmos Cloud': '~30 apps' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,14 +13,27 @@ const faqs: Faq[] = [
|
|||||||
question: 'Is DashCaddy really free?',
|
question: 'Is DashCaddy really free?',
|
||||||
answer: (
|
answer: (
|
||||||
<>
|
<>
|
||||||
Yes. The core platform — Docker deployment, Caddy + DNS + TLS automation, the full 77-app template catalog,
|
Yes. The core platform — one-click app deployment, Caddy + DNS + TLS automation, the full app template catalog,
|
||||||
AI Intent Router, MCP Server, Security Center, monitoring, backups, REST API, plugin system, and 31-language
|
AI Intent Router, MCP Server, Security Center, monitoring, backups, REST API, plugin system, and 31-language
|
||||||
i18n — is free forever. Premium adds a focused set of advanced features (SSO, Recipes, Docker Swarm,
|
i18n — is free forever. Premium adds a focused set of advanced features (SSO, Recipes, Swarm orchestration,
|
||||||
Multi-Host Fleet) available as a fixed-duration license. The license runs for the duration you buy
|
Fleet Management with Shipdeck deploys, workflow automation, scheduled backups)
|
||||||
|
available as a fixed-duration license. The license runs for the duration you buy
|
||||||
and then expires; you re-purchase manually to renew.
|
and then expires; you re-purchase manually to renew.
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
question: 'Can I deploy my own app from GitHub?',
|
||||||
|
answer: (
|
||||||
|
<>
|
||||||
|
That’s what <strong>Shipdeck</strong> is for — DashCaddy’s built-in deploy engine. Point it at
|
||||||
|
your GitHub repo and DashCaddy clones it, detects your stack (Go, Node, Python…), builds it, installs it as a
|
||||||
|
managed systemd service, wires up the Caddy route, DNS record, and TLS certificate, and <em>verifies the live
|
||||||
|
site</em> before reporting success. Every deploy is journaled, and rollback swaps back to the previous release
|
||||||
|
in one command. For fully reproducible builds you can pin an exact commit in the Shipdeckfile. No YAML wrangling, no rebuild loops — your code on GitHub, live on your host.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
question: 'Where does my data live?',
|
question: 'Where does my data live?',
|
||||||
answer: (
|
answer: (
|
||||||
@@ -33,12 +46,12 @@ const faqs: Faq[] = [
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
question: 'What if I already have Docker containers running?',
|
question: 'What if I already have services running?',
|
||||||
answer: (
|
answer: (
|
||||||
<>
|
<>
|
||||||
Use <strong>Service Discovery</strong>. DashCaddy scans the Docker socket, lists every running container, and
|
Use <strong>Service Discovery</strong>. DashCaddy scans the host’s running containers, lists each one, and
|
||||||
lets you adopt any of them with one click. It adds the Caddy reverse-proxy route, DNS record, and TLS
|
lets you adopt any of them with one click. It adds the Caddy reverse-proxy route, DNS record, and TLS
|
||||||
certificate — without touching the running container. Your existing data, volumes, and network config stay
|
certificate — without touching the running service. Your existing data, volumes, and network config stay
|
||||||
exactly as they are.
|
exactly as they are.
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
@@ -69,7 +82,7 @@ const faqs: Faq[] = [
|
|||||||
question: 'What happens to my services if I uninstall DashCaddy?',
|
question: 'What happens to my services if I uninstall DashCaddy?',
|
||||||
answer: (
|
answer: (
|
||||||
<>
|
<>
|
||||||
By default, the uninstall stops the DashCaddy container but leaves your Docker containers and volumes
|
By default, the uninstall stops the DashCaddy service but leaves your deployed apps and their volumes
|
||||||
untouched. If you want a clean removal, the uninstaller has a <code>--purge</code> flag that also deletes
|
untouched. If you want a clean removal, the uninstaller has a <code>--purge</code> flag that also deletes
|
||||||
the DashCaddy config and data directories. Either way, your services keep running until you stop them.
|
the DashCaddy config and data directories. Either way, your services keep running until you stop them.
|
||||||
</>
|
</>
|
||||||
@@ -79,7 +92,7 @@ const faqs: Faq[] = [
|
|||||||
question: 'How does Premium compare to other paid dashboards?',
|
question: 'How does Premium compare to other paid dashboards?',
|
||||||
answer: (
|
answer: (
|
||||||
<>
|
<>
|
||||||
Premium is a fixed-duration license. $99 covers a full year (365 days) of SSO, Recipes, Docker Swarm, and
|
Premium is a fixed-duration license. $99 covers a full year (365 days) of SSO, Recipes, Swarm orchestration, and
|
||||||
Fleet Management on one machine. The license expires at the end of its term and you purchase a new one
|
Fleet Management on one machine. The license expires at the end of its term and you purchase a new one
|
||||||
to renew. There’s no per-user fee and no per-app fee. The free tier already covers everything a single
|
to renew. There’s no per-user fee and no per-app fee. The free tier already covers everything a single
|
||||||
host needs, so Premium only makes sense if you specifically want SSO across deployed apps,
|
host needs, so Premium only makes sense if you specifically want SSO across deployed apps,
|
||||||
@@ -91,8 +104,8 @@ const faqs: Faq[] = [
|
|||||||
question: 'Is DashCaddy open source?',
|
question: 'Is DashCaddy open source?',
|
||||||
answer: (
|
answer: (
|
||||||
<>
|
<>
|
||||||
DashCaddy is proprietary software, but it’s built on a fully open-source stack — Caddy, Docker, Node.js,
|
DashCaddy is proprietary software, but it’s built on a fully open-source stack — Caddy, Node.js,
|
||||||
Express, Technitium DNS, Tailscale. The AI Intent Router, MCP Server, plugin system, and Security Center are
|
Express, Technitium DNS, Tailscale, and OCI image standards. The AI Intent Router, MCP Server, plugin system, and Security Center are
|
||||||
all built on open standards. You get vendor-friendly source-available documentation, and your data never
|
all built on open standards. You get vendor-friendly source-available documentation, and your data never
|
||||||
leaves your hardware.
|
leaves your hardware.
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ export default function Footer() {
|
|||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
<p className="text-surface-400 text-sm leading-relaxed mb-4">
|
<p className="text-surface-400 text-sm leading-relaxed mb-4">
|
||||||
Self-hosted Docker dashboard with automatic SSL, DNS, and reverse proxy. Making self-hosting beautiful and effortless.
|
The self-hosting dashboard with automatic SSL, DNS, and reverse proxy — one-click app deploys, plus GitHub-to-production with built-in Shipdeck. Making self-hosting beautiful and effortless.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
{socialLinks.map((link: any) => (
|
{socialLinks.map((link: any) => (
|
||||||
|
|||||||
Loaded 100 of 121 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user