Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ Bandwidth sharing services generally route legitimate traffic (market research,

**How much can I earn?**

Earnings vary widely based on location, number of devices, and which services you run. A realistic expectation for a single residential server running 10-15 services is **$30 - $100/month**. Adding more servers or GPU compute services can increase this significantly. The dashboard shows your actual earnings over time so you can optimize.
Earnings vary widely based on location, ISP, number of devices, and which services you run. The dashboard tracks your actual earnings over time so you can optimize your setup.

**Can I run on a VPS or cloud server?**

Expand Down Expand Up @@ -256,7 +256,6 @@ CashPilot monitors container health continuously. If a service container exits u

| Project | Type | Description |
|---------|------|-------------|
| [CashPilot-Desktop](https://github.com/GeiserX/CashPilot-Desktop) | Desktop App | Native cross-platform desktop dashboard for monitoring your fleet |
| [CashPilot-android](https://github.com/GeiserX/CashPilot-android) | Android Agent | Monitoring agent for passive income apps running on Android devices |
| [cashpilot-mcp](https://github.com/GeiserX/cashpilot-mcp) | MCP Server | Monitor earnings from AI assistants via the Model Context Protocol |
| [cashpilot-ha](https://github.com/GeiserX/cashpilot-ha) | Home Assistant Integration | Earnings and service status sensors for your smart home dashboard |
Expand Down
2 changes: 1 addition & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Turn CashPilot from a deployment tool into an earnings optimization platform. Al
- [x] Health score displayed on service cards (color-coded badge)
- [x] GET /api/health/scores endpoint
- [ ] **Notifications** — webhook/email alerts for container crashes, earnings drops, payout thresholds (collector alerts are in-app only for now)
- ~~**Auto-claim daily rewards**~~deferred; manual claim button covers this (each service has different thresholds and conditions)
- [ ] **Auto-claim daily rewards** — automated daily reward collection for services that support it (Honeygain lucky pot, Grass daily check-in, etc.); per-service opt-in with schedule configuration

## v1.2 — Multi-Node Fleet Management ✅

Expand Down
13 changes: 5 additions & 8 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -387,9 +387,9 @@ def _require_private_network(request: Request) -> None:

@app.get("/login", response_class=HTMLResponse)
async def page_login(request: Request, error: str = ""):
# If no users exist, redirect to register
# If no users exist, redirect to onboarding
if not await database.has_any_users():
return RedirectResponse("/register", status_code=303)
return RedirectResponse("/onboarding", status_code=303)
# If already logged in, go to dashboard
if auth.get_current_user(request):
return RedirectResponse("/", status_code=303)
Expand Down Expand Up @@ -561,8 +561,7 @@ async def do_register(
user_id = await database.create_user(username, hashed, role)

token = auth.create_session_token(user_id, username, role)
# First user goes to onboarding, subsequent users go to dashboard
dest = "/onboarding" if is_first else "/"
dest = "/setup" if is_first else "/"
response = RedirectResponse(dest, status_code=303)
return auth.set_session_cookie(response, token)

Expand All @@ -580,8 +579,7 @@ async def do_logout():

@app.get("/onboarding", response_class=HTMLResponse)
async def page_onboarding(request: Request):
user = auth.get_current_user(request)
if not user:
if await database.has_any_users():
return RedirectResponse("/login", status_code=303)
return templates.TemplateResponse(request, "onboarding.html")

Expand All @@ -595,9 +593,8 @@ async def page_onboarding(request: Request):
async def page_dashboard(request: Request):
user = auth.get_current_user(request)
if not user:
# Check if first run
if not await database.has_any_users():
return RedirectResponse("/register", status_code=303)
return RedirectResponse("/onboarding", status_code=303)
return RedirectResponse("/login", status_code=303)
return templates.TemplateResponse(request, "dashboard.html", {"user": user})

Expand Down
Loading
Loading