Resolves 24 conflicts between Hermes (DC-008/009/010 + response-helper
envelope standardization) and Krystie (DC-005 src/ refactor path fixes,
DC-006 TOTP integration, DC-007 new test suites, cloud backup
destinations).
Conflict resolutions:
- src/utils/logging.js: took ours (consumers depend on logError/
safeErrorMessage/createLogger exports)
- src/config/site.js: merged (her factored validateAndLogConfig +
applyConfigFields helpers)
- src/context/dns.js: took hers (admin/readonly role iteration for
write operations)
- src/utilities/backup-
manager.js: took hers (Dropbox/WebDAV/SFTP cloud feature)
- status/dist/*, status/
sw.js: took hers (minified bundles + newer SW cache)
Additional fix (post-merge regression):
- src/monitoring/health-checker.js: fixed DC-005 path miss —
'require(./platform-paths)' → 'require(../../platform-paths)'
Test status: 921/922 passing. One known failure in logging.test.js
(async file-handle timing) tracked as follow-up.
13 KiB
13 KiB
Changelog
All notable changes to DashCaddy are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Security
- TOTP recovery system (4-part defense against permanent lockout). Pre-lockout:
.bakfallback credentials file checked at every TOTP init, used silently when primary fails. Diagnostic:/recovery-infoendpoint +/recovery-panelUI on the entry screen with one-click "Import Backup" + "Download Backup" buttons. Post-lockout: friction-free.license-secretrestore flow. (d230b39,3dff49c,7bbd969)
Added
- OpenClaw routes — full set under
/openclawprefix: connect, disconnect, status, host discovery.docker.clientwrapper fixed; duplicate/apps/paths stripped across sub-routers. - Auto-backup scheduling (premium tier) + storage-limit enforcement (prune oldest when
maxStorageBytesexceeded) + restore-from-backup on update rollback. Bundled workflows included out-of-the-box. - Monitoring widget on main dashboard — CPU/mem data flattened, health summary added;
/api/monitoring/statsexposed as a public route with rate-limit. - Sami Files template — logPath wired into the template and mounted in
start.sh. - Unified logger — single source of truth for logs, errors, and audit events.
- Notification manager + resource alerting (premium tier).
- Update UX — badge→modal flow, orange update button, "Update All", toast notifications, workflow triggers.
- Comprehensive test suite additions: 7 new test files (
dns-propagation,notification-manager,ssl-monitor,log-digest,metrics,config-drift-detector,auto-restart-manager) — 120 new tests, all passing.
Changed
- Route response standardization (DC-010). Every
{success, ...}envelope across 9 route files now flows throughresponse-helpers(success()/ok()). Only 2 intentional raw-array calls remain (routes/services.jslines 360+368 — frontend wire contract). Error-path envelopes useerror()separately. ~62 calls converted acrossbrowse/logs/sites/updates/notifications/tailscale/events/workflows/openclaw/dns/health/ca. /api/v1/versioning: all routes mounted under/api/v1/. Legacy un-versioned/api/mount removed. Frontend, OpenAPI spec, DashCA pages, and all internal path matchers (CSRF exclusions, auth public routes, audit log, rate-limit mounts) updated.scripts/release.shnow stages build-rewritten files (sw.js,index.html) for the published tarball, copiesVERSIONinto the tarball, and writes bothdashcaddy-api/package.jsonAND rootVERSIONon every release. No more version drift.
Fixed
- Credential route path regression (DC-011).
routes/services.jshad dropped the/services/prefix from credential routes (POST/DELETE/GET) during a refactor, causing 4 test failures and a live 404. Re-applied the prefix; also fixed a latentReferenceErrorwhere invalid serviceIds calledctx.errorResponse()in a factory-destructured module (replaced with the importederrorResponsehelper). - 19 ESLint warnings (DC-004). Reached zero warnings across
src/— most cleared by the refactor, the final 3 (require-awaitonresyncHealthChecker, twomax-depthviolations) fixed insrc/app.js. - Workflow engine init broken —
fetchTnot imported,NotificationManagerconstructor missingnew,servicesStateManagernot hoisted. Fixed; events now fire on startup. - Container-logs feature was misusing
wireModal— short-circuited the rest offeatures.jsand broke unrelated dashboard features. Replaced with the correct wiring. - CSP hash mismatch between Windows and Linux builds — now computed on LF-normalized
index.htmlso hashes are identical across platforms. - SW cache tag now derived from bundle content hash, so the service worker invalidates correctly when bundle content changes.
- Updater false-positive loop when commit hash was unknown — fixed.
Removed
- Stale ad-hoc test/debug scripts (
comprehensive-test.js,test-security-fixes.js) moved todashcaddy-api/scripts/legacy/(preserved, not deleted — 875 lines of security test coverage retained as a manual smoke test). - Stale root-level files:
*.bak,server-old.js, and ad-hoc reports (DEPLOYMENT-SUCCESS.md,FINAL-DEPLOYMENT-REPORT.md,DESLOPIFICATION-ROADMAP.md, etc.) — disk-only cleanup, already gitignored. - Dead
routes/directory at API root (replaced bysrc/routes/).
Security (TOTP integration)
- TOTP integration tests now cover the full
/api/auth/check→ session → endpoint flow (DC-006). 25 new tests including:setup(generate + normalize + reject invalid Base32),verify-setup(missing/bad/no-pending/valid-code paths),verifylogin (400/400/401/200),check-session(passthrough when disabled + 401 no-session + 200 valid-session),disable,config(valid/invalid/never-disables), and full end-to-end setup→login→check-session→disable.
Fixed (from merge)
- routes/updates.js — krystie's branch had
if (!ok)referencing the helper function instead of thesecretOkboolean. Would have 500'd every/system/update-notifyrequest. Caught during merge, kept my version with the correct boolean check. - routes/notifications.js — two places where she replaced
res.json({success: result.success, ...})withok(...)would have forcedsuccess: truefor partial-failure delivery. Kept my version with explicitres.jsonto preserve the semantic.
[1.13.4] - 2026-06-12
Changed
- Standardized all route handler responses to use helpers from
src/utils/responses.js(ok,errorResponse,successMessage,notFound,validationError,forbidden,unauthorized,conflict). ~160 rawres.json()calls converted across 32+ files. No behavior changes — response shapes are identical. This ensures future schema changes (e.g., adding arequestIdenvelope) only need to update one module. - Fixed
errorvserrorResponsesignature mismatch inroutes/health.jsCA cert endpoint. Theerrorhelper takes(res, message, statusCode)whileerrorResponsetakes(res, statusCode, message, extras)— the wrong alias was being used for calls that needed the 4-argument form. - Updated
middleware.js,csrf-protection.js,error-handler.js, andlicense-manager.jsto use response helpers for rejection/error responses instead of inlineres.status().json().
Note
- 4 pre-existing test failures in
services.routes.test.js(credential storage) remain from before this release. They are unrelated to the standardization pass.
1.5.0 - 2026-05-17
Changed (BREAKING)
- API routes now mounted exclusively under
/api/v1/. The legacy un-versioned/api/mount has been removed. Frontend, OpenAPI spec, DashCA pages, and all internal path matchers (CSRF exclusions, auth public routes, audit log, rate-limit mounts) updated accordingly. Existing integrations that hit/api/...directly must update to/api/v1/.... Held at minor bump (1.5.0) rather than major (2.0.0) — DashCaddy is still pre-1.0-API-stable.
Added
LICENSE(proprietary EULA) at repo root.CHANGELOG.md(this file) — Keep a Changelog format.- Gitea Actions workflow (.gitea/workflows/ci.yml)
that runs
npm test(with coverage) andnpm run linton every push tomain/masterand on PRs, plus asecurityjob runningnpm auditand the security-focused test subset.
Fixed
- 9 pre-existing
no-emptyESLint errors inbackup-manager.jsandroutes/backups.js(intentional ignore-failure catches now annotated).
Removed
- Stale files at repo root:
*.bak,server-old.js, and ad-hoc deployment/migration/test reports (DEPLOYMENT-SUCCESS.md,FINAL-DEPLOYMENT-REPORT.md,DESLOPIFICATION-ROADMAP.md,error-handling-*.md,WHAT-IS-DASHCADDY.md, etc.). Already gitignored — disk-only cleanup.
1.4.10 - 2026-05-17
Fixed
release.shnow stages build-rewritten files (sw.js,index.html) so they're included in the published tarball.
1.4.9 - 2026-05-17
Fixed
- Container-logs feature was misusing
wireModal, which short-circuited the rest offeatures.jsand broke unrelated dashboard features.
1.4.8 - 2026-05-17
Fixed
- CSP hash now computed on LF-normalized
index.htmlso Windows and Linux builds produce identical hashes.
1.4.7 - 2026-05-17
Fixed
- Dashboard unbroken: corrected bundle order, closed dangling IIFE, removed
duplicate
constdeclaration.
1.4.6 - 2026-05-17
Fixed
sw.jscache tag now derived from bundle content hash, so service worker invalidates correctly when bundle content changes.
1.4.5 - 2026-05-17
Fixed
- Frontend deploy routed through the host-side updater (matches the API container's own update path).
1.4.4 - 2026-05-16
Fixed
notifyendpoint exempted from CSRF (it's called by the host-side updater, not the browser).release.shJSON parsing made portable (no longer assumes GNUjqsemantics on every host).
1.4.3 - 2026-05-16
Added
- Seamless release flow: push-notify endpoint, VERSION file copy into release tarball, robust SSH mirror handling on port 22022.
1.4.2 - 2026-05-16
1.4.1 - 2026-05-16
Changed
- Version bump only — packaging plumbing for the 1.4.x release line.
1.4.0 - 2026-05-06
Added
scripts/release.sh— one-command release cutting and publishing.
1.3.1 - 2026-05-06
Fixed
- Installer: added
src/directory to the deploy manifest; droppedMakeDirectory=yesfrom the systemd updater path unit. - Self-updater: copies
src/, replacesroutes/in place instead of nesting it inside the existing tree.
1.3.0 - 2026-05-06
Added
- Self-updater supports
DASHCADDY_API_SOURCE_DIRenv override for non-standard deploy layouts.
Fixed
- Self-updater now clears all pending history entries, not just one.
1.2.0 - 2026-05-14
Added
- Container Log Viewer with streaming, search, and download.
- Service filter, batch operations across multiple services, and snapshot capture.
- Auto CSP hash updates during build.
- Dashboard version button and self-update UI wiring.
- Release policy checks and dashboard version verification.
Changed
- All routine
console.logcalls gated behindwindow.DASHCADDY_DEBUGflag for quieter production output. - All
console.errorcalls routed throughErrorHandlerfor consistent tracking.
Fixed
- Updater no longer triggers a false-positive "update available" loop when commit hash is unknown.
1.1.5 - 2026-03-23
Added
- Pylon health relay for remote service health checks (with relay
fallback on
/probe/:id). - Host-side auto-updater for zero-touch API container rebuilds.
Fixed
- Service edit preserves service ID on subdomain change; accepts
localhostas a valid IP. - Taxi theme accent color now distinct from text.
- Prevents encryption key conflicts; adds license backup on rotation.
1.1.1 - 2026-03-23
Fixed
- Service edit, CSRF token stability, and license restore.
[1.0.x] - 2026-03-05 → 2026-03-22
Initial release line. Highlights from work between v1.0 and v1.1:
Added
- Cross-platform path support (Windows + Linux deployments).
- Subdirectory routing mode for public-domain deployments.
- Auto-update system for DashCaddy instances.
- Batched status endpoint (frontend performance).
- Install-wide onboarding tour (no longer per-browser).
- Daily log digest and Docker hygiene/maintenance.
- Unified backup/restore v2.0 with full state capture.
- DNS uptime bars and fully-dynamic DNS server config.
Changed
- Phase 1-3 refactor: extracted config/context/utils into
src/, split monolithicserver.js, standardized all 25+ route files with explicit dependency injection. - Unified error handling system (throw-based, migrated 25 route files).
- ESLint + Prettier baseline with auto-fixes.
Security
- 7 critical + 16 high/medium API security bugs fixed.
- 7 frontend security vulnerabilities fixed (4 critical, 3 high).
- Logger sanitization to prevent log injection.
Tests
- Comprehensive test suite reaching 80%+ coverage threshold.
docker-securitytest suite (41 tests).auth-managerandcredential-managertest suites.
1.0.0 - 2026-03-05
Initial release of DashCaddy. Unified dashboard for Docker container management, Caddy reverse proxy configuration, DNS automation, and SSL certificate provisioning.