[pending-judge] docs(site): DC-165 uniformity — counts 77->78, internal-identifier sweep, advertise workflows/scheduled-backups/calendar/Connect AI, capabilities pointer for LLMs

Product-code half (fleet gate, capabilities endpoint, offline feature
migration, PREMIUM_FEATURES completion) lives in the dashcaddy repo, branch
dc/DC-165-uniformity — judged as one bundle.

Site edits (all claims verified against product source, see EVIDENCE [9]):
- template count 77 -> 78 EVERYWHERE (page.tsx, features, pricing, docs,
  blog bodies + manifest.ts frontmatter per three-way consistency rule,
  AppShowcase, DocsLayout, FaqSection). Source of truth:
  APP_TEMPLATES keys == 78.
- internal-identifier leak sweep: 85 occurrences of *.sami (internal TLD),
  an internal Git host URL, a private venv path, and a server-local repo
  path in pricing comment -> replaced with the documented .home style /
  generic wording. status.sami replaced by dashcaddy.local (product default
  dashboardHost). Verified ZERO remaining in rebuilt out/.
- advertise as Premium (owner decision 2026-10-09): pricing premium list +
  FAQ + docs/premium table + two new deep-dive sections (Workflow
  Automation: the five bundled ids from bundled-workflows.js; Scheduled
  Backups: schedule fields from the /backups/schedule schema, manual
  one-click + DR explicitly noted as free).
- calendar widget + hosted-Radicale auto-wiring advertised (features page
  chip + new docs/catalog/radicale install guide following house template
  structure; syncthing page mirrored for the placeholder conventions).
- Connect AI one-click key flow advertised (features chip).
- MCP card softened: 'entire infrastructure' -> the real tool scope +
  pointer to GET /api/v1/capabilities (public ground-truth manifest).
- llms.txt: capabilities endpoint pointer + 'prefer it over static prose'
  + MCP tool examples + premium gate list; robots.txt gains LLMs-Txt line.
- NOTE: a parked unrelated work-in-progress (dc-seo-r8 blog edits) was
  stashed before the build and is NOT in this commit.

Build gate: rm -rf .next out && npm run build -> clean, 123 static pages,
out/ greps zero stale counts/leaks.
This commit is contained in:
Krystie committed 2026-10-09 02:06:06 -07:00
1 parent 1d0ffaee55
commit a707816668
102 files changed
+674 -524

No files matched your search

+9 -9
View File
@@ -27,7 +27,7 @@ export default function samiFilesDocsPage() {
<h2>Prerequisites</h2>
<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>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>
@@ -35,7 +35,7 @@ export default function samiFilesDocsPage() {
<h2>Install via the DashCaddy dashboard</h2>
<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>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>
@@ -45,7 +45,7 @@ export default function samiFilesDocsPage() {
<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 &lt;jwt&gt;</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 "Content-Type: application/json" \\
-d '&#123;
@@ -69,28 +69,28 @@ export default function samiFilesDocsPage() {
<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://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 "Content-Type: application/json" \\
-d '&#123; "message": "Deploy Sami Files on my home host and expose it at files.sami" &#125;'</code></pre>
-d '&#123; "message": "Deploy Sami Files on my home host and expose it at files.home" &#125;'</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>
<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>
<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>
<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>
<ol>
<li>Clone the repo: git clone http://100.81.59.99:3030/sami7777/sami-files.git /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>Clone the repo: clone the sami-files repository from your own source into /opt/sami-files</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>Enable + start: systemctl enable --now sami-files.service</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>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>
<h2>Volumes and persistent data</h2>
<p>DashCaddy creates these volume mounts in the container spec:</p>