Admin Panel

A. S. Toler Corp.

Live in portal Pinged in last 90s
Active hours today Team engagement across the portal
Wipes (active) Soft-deleted takeoffs not yet restored
Range
Loading…
How active time is measured. Every portal page sends a heartbeat every 60s when the tab is open. A heartbeat counts as active only if the user moved the mouse, typed, scrolled, or tapped within that 60s. Idle tabs (open but no input) show up under Tab-open but not Active. Each row sums in 60-second buckets — "47m active" = 47 distinct minutes of real engagement.

Roster. Every signed-up user in app_users shows here even if they haven't pinged in the range. Greyed-out rows mean "no activity in this window". Click a user to drill into per-panel time, then per-page (Takeoff Canvas rows show the specific bid EST# they were working on).
Loading…
Live = pinged in the last 90 seconds. Every portal page heartbeats every 60s while the tab is focused and the user has moved/typed/scrolled within that window. The Live Now list is whoever the activity-summary endpoint flagged as active now on its last poll. Refreshes every 20s.
Loading…
Where the numbers come from. Source: bids_cloud rows whose status is one of BIDDING / BID OR BAIL / SENT / FOLLOW UP / FOLLOW UPS / PENDING and whose outcome is not Awarded/Not Awarded. Pipeline $ sums the bid_amount column (the estimator's number, when set). Per-estimator rows sorted by 7-day load. Auto-refreshes every 60s.
Loading…
What this shows. Every time someone wipes a takeoff (Recently Opened card → 🗑 chip or canvas → wipe takeoff), an audit row goes into takeoff_wipes_cloud. The 8-second in-page Undo is long gone by the time you read this — but the row itself is only soft-deleted (takeoffs_cloud.deleted_at), so clicking Undo here restores it.

Wipes with undone_at already set are hidden by default; tick the checkbox above to see them too.
source: GitHub Actions API · 60s cache
Loading…
How this works. /api/admin/cron-health queries the latest 100 runs across every workflow in astoler-cloud-cron and keeps the most-recent run per workflow. Each row is bucketed: green = success within 6h, yellow = success older than 6h, red = failure / cancellation / timeout, gray = queued, in progress, or skipped. Click any row to open its run in GitHub.
Repo
Loading…
What this shows. Every commit across alex-astolerelectric/astoler-software (Portal) and alex-astolerelectric/astoler-cloud-cron (Cron), newest first, grouped by date. Includes pre-deploy history all the way back to each repo's initial commit. The endpoint caches GitHub for 10 minutes — refresh to bust.
Loading…
What this shows. Every outbound email the portal can send. Each policy row maps to a real send path (watcher / cron / Netlify function); toggling enabled or editing recipients here updates the live behavior within ~60s, no re-deploy. Send paths fall back to safe defaults if Supabase is unreachable.
Range
💳 Top up balance
Loading…

Spend by feature

Spend by bid

Recent calls
What this shows. Every Anthropic API call from a wired Netlify function logs a row to claude_usage_cloud with input/output tokens, cost estimate, feature name, and (when known) the bid EST#. Wired so far: takeoff-ai-detect, takeoff-ai-match-sheets. More functions will appear here as they're wired. Cost numbers are estimates from Anthropic's published per-1M-token pricing; the real bill is on console.anthropic.com/usage. Anthropic doesn't expose a live balance for non-Console keys — click Top up balance to add credit in their UI.
Build 107