https://status.freshvibeapps.com/dashboard

What a client sees when they log in

A scoped view of their sites. No operator stuff, no other clients' projects, no admin controls. Just the deployments tied to the client(s) they belong to.

Acme Corp · Project dashboard
4 deployments · last checked 12s ago
jane@acmex.com
JA
Sites online
3 / 4
1 degraded
Avg latency
142 ms
p95 over last 24h
Last deploy
2h ago
oscar-web main · 4f8a2b1
Uptime (30d)
99.94%
2 incidents
oscar-web oscar-web.freshvibeapps.com
Production Public
Status
● Online
Latency
98ms
Deployed
2h ago
acmex-store store.acmex.com
Production Public
Status
● Online
Latency
312ms
Deployed
3d ago
oscar-web staging-oscar.acmex.com
Staging Private
Status
● Slow
Latency
1.4s
Deployed
15m ago
acmex-store preview-redesign.acmex.com
Preview Private
Status
● Online
Latency
124ms
Deployed
1d ago

Who sees what, exactly

The portal scopes by user → client → project → deployment. Public deployments are visible to anyone with a login. Private deployments are only visible to users whose allowed_clients list includes the deployment's owning client.

User
Public sites
Acme projects
Other clients
JA
Jane (Acme)
all
all
none
MO
Mo (Acme + Oscar)
all
all
Oscar only
RP
Rita (public only)
all
??
Anonymous (no login)
all

Operator panel stays for you. Client portal is for them.

Same PocketBase identity, same project data, two different UIs. You get admin controls and every project. They get a scoped view of just theirs. Both share the same health-check probes and audit log.

Operator panel · panel.freshvibeapps.com
For you and any internal users. Full controls.
  • See every deployment across every client
  • Deploy, rollback, promote, disable
  • Manage users, clients, allowed_subdomains
  • Trigger health probes, view raw metrics
  • Audit log with all actions
  • Service control, backups, vault
Client portal · status.freshvibeapps.com
For your clients. Read-only, scoped to their stuff.
  • See only deployments tied to their client(s)
  • Status (up/down/degraded) and latency
  • Last deploy time + commit SHA + GitHub link
  • Uptime history (sparkline)
  • Per-site incident log (read-only)
  • "Notify me on incident" toggle

One probe runner, every site checked

A cron every 5 minutes hits each registered deployment's subdomain with a HEAD request, records status code + latency. The probe runner lives on the VPS, not on a third-party service. Cheap. Predictable. No data leaks.

Probed every 5 min · Probes HEAD / with 5s timeout · Storage 100 most recent pings per deployment (panel.db)
  • Status 2xx → online · 3xx → online (redirect) · 4xx → client error · 5xx → down · timeout → unreachable
  • Latency tracked as p50/p95; warning at p95 > 1s, degraded at > 3s
  • SSL cert expiry checked separately (already running in the existing cert-check cron)
  • Probe results feed the client portal in real time (5 min lag max)

Things you should answer

1. Where does it live? Separate site at status.freshvibeapps.com (recommended) — or inside the panel at panel.freshvibeapps.com/portfolio?
  • Separate site — cleaner audience separation, can be public, shareable URL
  • In the panel — one URL, one auth, faster to build, but mixes operator + client audiences
2. What can the client do? Read-only (status + latency + history) — or also allow them to trigger a redeploy or rollback?
  • Read-only — totally safe, no operator controls leak, easy to ship
  • Trigger redeploy only — "latest commit is on staging, push to prod" — moderate risk, easy to add a confirmation
  • Full deploy controls — clients can rollback, promote, deploy any branch. Maximum risk, you might as well just give them panel access
3. Notifications? When a site goes down, who hears about it?
  • Operator only — the existing audit log + maybe an email/SMS hook on probe failures
  • Operator + client — clients opt-in to "email me when my site goes down for >5 min"
  • Status page mode — public read-only view of "what's down right now" at status.freshvibeapps.com (no login)
4. Effort estimate
  • MVP (data model + operator tab + public status page, no client login): ~2 days
  • + client portal with auth: ~4 days total
  • + notifications (email/SMS): ~5 days