- layout.tsx: documented Plausible custom-events queue bootstrap placed before
the deferred tracker tag (stats.dashcaddy.net, outbound-links + tagged-events)
- pricing/page.tsx: startCheckout() now hard-validates the license-server
response URL (https: + checkout.stripe.com / *.stripe.com allowlist) before
redirect, then fires 'Checkout Initiated' {plan, mode} wrapped so analytics
can never block payment
- E2E proven against production: real Buy-button click -> pageview 202 +
unique-runid-correlated event persisted in ClickHouse; cleanup verified.
Judge history C x5 -> B (zero blockers); full evidence package in UMP.
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.
New /docs/desktop-app: download table with per-platform filenames, SHA256
verification vs published SHA256SUMS.txt (end-anchored grep, tested against
the real manifest format), honest unsigned-app framing (limited same-origin
integrity check, NOT a safety guarantee), SmartScreen/Gatekeeper explained as
identity+notarization+reputation signals, full macOS Open Anyway flow,
troubleshooting table. Registered in DocsLayout sidebar + /docs index.
Removed apps that have no deploy template in code:
- Subsonic, Vikunja, OpenProject, Plane, HedgeDoc
- Yacht, Authelia, Keycloak, OpenVPN, Bitwarden
- Forgejo, GitLab, Prometheus, Netdata, Kibana, OpenHAB
Also fixed name: 'Vintage Radio' → 'Vintage Stereo' (matches actual template)
Corrected all '93+' references to '76' across all pages.
Deployed to live dashcaddy.net via cPanel API.
The about page 'By the Numbers' section was still showing '5' for the
language count. Updated to '31' to match the i18n system's 31-language
support.
Note: live server may need Apache cache flush to serve the updated page.
- next.config.ts: enable trailingSlash:true so Next.js generates /page/index.html
instead of /page.html, enabling Apache DirectoryIndex to serve clean URLs
- Rename src/app/legal/ to src/app/policies/ because cPanel/Apache blocks
the /legal/ URL path (returns 403 regardless of file permissions)
- Update Footer.tsx and terms page links from /legal/ to /policies/
- .htaccess: add DirectoryIndex directive for subdirectory index.html serving
- All 15 pages verified live on dashcaddy.net returning HTTP 200
- Added vintage-radio (93rd app template) to AppShowcase
- Updated '92+' to '93+' across homepage, about, features, pricing, docs
- Deployed to live site via FTPS
- features.tsx: 'JavaScript SDK & REST API' → 'REST API (260+ endpoints)'
- docs/premium: 'the JS SDK' → 'the REST API'
- docs/api: 'and the SDK' → 'and integrations'
The SDK package doesn't exist; the REST API is the correct integration surface.
Deployed to live dashcaddy.net via cPanel API with cache-busting rewrite.
- Update about page Jest test stat from 775+ to verified 1770+ (confirmed via jest run)
- Replace misleading "39 SDK Methods" with "260+ API Endpoints"
- These numbers are now accurate as of the 77 test suites / 1770 tests run
Removed: Subsonic, OpenVPN, GitLab, Prometheus, Netdata, Vikunja, OpenProject, Plane, HedgeDoc, Yacht, Bitwarden, Keycloak, Authelia, Kibana, Standard Notes, Trilium, Outline, Calibre-Web (some exist, some dont - aligned to verified template list)
Added: all 76 real templates from /opt/dashcaddy/dashcaddy-api/src/docker/app-templates.js
Deployed to live dashcaddy.net via cPanel API
- AppShowcase: Removed 7 non-existent apps (Kaleidescape, Synology Photos, Homelabs, DockSTARTer, Unraid, TrueNAS, New Relic), added 50+ real app templates that exist in code
- Updated template count from 76+ to 92+ across all pages
- Fixed test count from 1400+ to 775+ (actual count)
- Added mod_rewrite fallback for old doc path redirects (fixes 500 errors)
- Added caching, compression, and proper error handling in .htaccess
- globals.css: surface colors flip via CSS custom properties (.dark class)
- Navbar: sun/moon toggle button, persists to localStorage, respects OS preference
- Footer: theme-aware logo (light logo for dark mode, dark logo for light mode)
- Layout: no-FOUC inline script applies theme before first paint
- Both DashCaddy wide logos (light+dark) swap based on theme
- Sami's personal samiahmed7777 logo in footer copyright is untouched
Navbar/Footer: Use brand-logo.png (transparent bg) instead of logo-dark.jpg
Favicon: Updated to brand icon
Added brand-wide-dark.png and brand-wide-light.png for future use
Navbar/Footer: Logo replaces text 'DashCaddy' wordmark, image-only branding
Docs: All 7 pages rewritten to comprehensive 200-300 line guides with code
examples, callout boxes, reference tables, and cross-page links
Stripe: 4 Payment Links wired in (0/30d, 0/90d, 0/180d, 9/365d)
Products and Prices created in Stripe Dashboard
Pricing model from catalog.js: 0/30d, 0/90d, 0/180d, 9/365d
All one-time payments, not recurring subscriptions.
Updated plan selector, FAQ, and button labels accordingly.