All notable changes to CashPilot are documented here.
- Fix unauthenticated worker-control exposure on default Docker Compose (worker port no longer published)
- Atomic shared fleet key generation with
O_CREAT | O_EXCL— eliminates skip-auth, ephemeral key mismatch, and worker impersonation vectors - Bearer auth split:
CASHPILOT_ADMIN_API_KEYfor owner-level, fleet key for writer-level API access - Worker heartbeat URL pinned to prevent spoofing in no-key mode
- Fleet key first-boot race condition closed with retry-read backoff
- Credential encryption key (
secret_key) added to secret config redaction PRAGMA foreign_keys=ONenforced for SQLite CASCADE integrity
- Zero-threshold payout: services with
min_amount: 0are now correctly eligible when balance > 0 - Storj collector no longer requires manual
api_urlsetting — uses built-in default - Owner self-demotion and last-owner removal guards on
PATCH /api/users/{id} - Viewer/writer role gating on dashboard controls (restart, stop, logs), settings sidebar, fleet page, and service detail modal
- Onboarding step 4 CTAs no longer link non-owners to the owner-only settings page
- Collector alert clicks are no-op for non-owners (no /settings dead-end)
- Partial preference updates (nullable fields merged with existing)
- Port parsing preserves TCP/UDP protocol for Docker SDK
- Auto-resolve
worker_idwhen only one worker is online - Catalog cache returns shallow copies to prevent cross-request mutation
- CSS
var(--danger)replaced withvar(--error)for deploy failure styling - Bytelixir API fallback clearly reports HTML scrape failure
- Worker URL override via
CASHPILOT_WORKER_URLenv var - Fleet page copy-to-clipboard fetches key before copying
app/fleet_key.py— central fleet key resolution module (env var → shared file → auto-generate)CASHPILOT_WORKER_URLenv var for explicit worker URL overridecashpilot_fleetshared Docker volume for fleet key exchange- Integration tests for payout eligibility (14 tests against real handler)
- Regression tests for Storj optional
api_urland fleet key bootstrap (12 tests)
- Grass and Bytelixir collectors returning 0 earnings
- Grass 429 rate-limit handling with retry logic
- Bytelixir persistent auth via remember_web + XSRF cookies
- GRASS points no longer incorrectly converted to USD at token price
- Titan Network and Uprock dashboard URLs corrected
- Collector grid columns no longer expand when details open
- Startup collection trigger (collectors run immediately on container start)
- Dynamic collector credential forms in Settings page
- Show/hide toggle for secret environment variables
- Actual default values displayed for all env vars with Default badge
- Eye toggle for viewing stored credentials on deployed services
- Dashboard links on deployed service cards
- Settings page saveSettings bug
- Worker action/logs API paths
- Hostname prefix and collection interval env vars
- Per-service earnings breakdown with progress bars toward minimum payout
- Manual claim flow with eligibility checking
- Health scoring system (uptime percentage, restart frequency, 0-100 score)
- Storj storagenode earnings collector
- IPRoyal Pawns earnings collector
- Cashout section added to all 39 service YAMLs
- Redesigned onboarding UX with setup mode selection
- Earnings dashboard with Chart.js historical charts
- Earnings collectors for EarnApp, MystNodes, and Traffmonetizer
- Dashboard API endpoints (summary, daily, deployed services)
- 12 new service YAMLs from competitor analysis (39 total)
- Synthwave UI overhaul: navy-purple palette, rose/cyan accents, frosted glass
- Dark/light theme toggle added to navbar
- Federated multi-node fleet management (master/child architecture)
- Outbound WebSocket from child to master (works behind NAT)
- Two auth methods: master key + HMAC-signed join tokens
- Fleet dashboard with remote commands (deploy, stop, restart)
- CI/CD: linting, CodeQL scanning, auto-releases, Dependabot
- Ruff formatting across entire codebase
- Alpine Docker build GID 999 conflict
- bcrypt 72-byte password limit on Python 3.14
- YAML-driven service catalog (single source of truth)
- One-click container deployment via Docker SDK
- Container health monitoring (status, uptime, restart)
- Web-based setup wizard with guided account creation
- Dark responsive UI with service cards and filtering
- Session-based authentication with role system (owner/writer/viewer)
- Credential encryption at rest (Fernet)
- Multi-arch Docker image (amd64 + arm64)
- 27 services across 4 categories
- Compose file export for users without Docker socket
- Monitor-only mode when Docker socket is not mounted
- SECURITY.md with vulnerability reporting process
- ROADMAP.md with versioned feature plan