Listing of every registered HTTP route in routes/web.php, grouped by feature area. Public vs. auth-gated boundaries are explicit. See Architecture → Request lifecycle for the middleware pipeline that processes each request.
Note on module routes: Not every URL below is defined directly in routes/web.php. Modular routes (such as /settings/bill-com, /settings/mattermost, and /settings/slack) reside in their owning module’s routes/web.php (modules/BillCom, modules/Mattermost, modules/Slack), loaded via loadRoutesFrom() and each explicitly wrapped in Route::middleware(['web', 'auth']) — see Architecture → Request lifecycle. The URLs and behavior are identical.
For a live listing run:
php artisan route:list
Public (unauthenticated)
| Method |
Path |
Purpose |
| GET |
/login |
Landing page with the Google sign-in button. |
| GET |
/auth/google/redirect |
Kicks off the Socialite flow. |
| GET |
/auth/google/callback |
Where Google sends the user back. Allowlist check happens here. |
| GET |
/dev-login |
Passwordless login of the first active user. 404 unless APP_ENV=local and the request is un-proxied loopback. Optional ?redirect= is a same-origin path starting with / only (no https://, //host, or encoded protocol-relative). |
If the Google-verified email isn’t in the users table (or revoked_at IS NOT NULL), the callback bounces back to /login with a denial banner. No auto-provisioning.
Auth-gated — everything else
Dashboards
| Method |
Path |
Purpose |
| GET |
/ |
Fleet dashboard (cards sorted by health). Server-centric — Pressable sites (no server row) don’t appear here; see /sites below. |
| GET |
/sites |
Fleet-wide Sites list across both hosting providers, paginated + filterable by provider/domain. The only place to see the fleet in one list regardless of host. |
| GET |
/issues |
Consolidated “what needs human eyes.” |
| POST |
/issues/poll-servers |
Re-poll all servers on demand from the Issues page (background clockwork:poll-servers). |
| POST |
/issues/fetch-all-db-creds |
Bulk-fetch missing WP DB credentials over SSH for all eligible sites (background clockwork:extract-wp-configs). |
| DELETE |
/issues/orphans/{siteId} |
Remove an orphaned site row (archives it via archived_at). Confirm dialog required. |
| GET |
/capacity |
Shared-server capacity / over-quota table. |
| GET/PATCH |
/capacity/settings |
Configure shared-server visit quota, lookback windows, and pressure limits. |
| GET |
/settings/capacity |
Redirects to capacity.settings — legacy-alias route, same shape as other /settings/* redirects. |
| POST |
/capacity/site-metrics/toggle |
Pause/resume fleet-wide Companion resource-sampler collection, then push the new flag in the background. See Features → Dashboard (“Per-site CPU collection toggle”). |
| GET |
/maintenance-history |
Action-log review across the fleet. |
| GET |
/setup |
Fleet integrations setup and onboarding dashboard. |
| POST |
/setup |
Save active integrations and finish setup (redirecting to dashboard). |
| GET |
/setup/configure |
Optional standalone service configuration screen. |
| POST |
/setup/configure |
Save credentials entered on the standalone configuration screen. |
| POST |
/logout |
Sign out. |
Servers
| Method |
Path |
Purpose |
| GET |
/servers/new |
New-server form. |
| POST |
/servers |
Create. Launches background clockwork:import-spinupwp + poll after save so SpinupWP-side moves and existing sites attach without blocking. |
| POST |
/servers/refresh-spinupwp |
Fleet-wide on-demand background re-run of clockwork:import-spinupwp + clockwork:poll-servers. Surfaces from the dashboard “Refresh from SpinupWP” button and every server header. Same idempotent command the 03:30 cron runs. |
| GET |
/servers/{server}/{tab?} |
Server detail. tab ∈ `sites |
| GET/PATCH |
/servers/{server}/edit · /credentials |
Edit + save SSH creds. |
| POST |
/servers/{server}/test |
Test SSH. |
| POST |
/servers/{server}/toggle-ignore |
Pause polling. |
| POST |
/servers/{server}/recheck-health |
On-demand metrics re-poll for one server. |
| DELETE |
/servers/{server} |
Remove. |
| POST |
/servers/{server}/provision/fail2ban |
One-time fail2ban setup. |
| POST |
/servers/{server}/ban-ip |
Manual ban. |
| POST |
/servers/{server}/auto-ban-{llar,wordfence} |
Per-source auto-ban toggle (llar = the Gatekeeper lockout source; name kept for compatibility). |
| POST |
/servers/{server}/update/{queue,cancel} |
Queue / cancel apt-get upgrades. |
| POST |
/servers/{server}/reboot[/{cancel,probe}] |
SSH-driven reboot lifecycle. |
| PATCH |
/servers/{server}/tags |
Assign tier tags. |
Server credentials (bulk)
| Method |
Path |
Purpose |
| GET/POST |
/servers/credentials |
Bulk view + save. |
| GET/POST |
/servers/credentials/feed[/apply] |
Paste a SpinupWP-feed XML, parse, then apply. |
Sites
| Method |
Path |
Purpose |
| GET |
/sites/{site}/{tab?} |
Site detail. tab ∈ `overview |
| GET |
/sites/{site}/backups-history |
JSON backup history. Returns DigitalOcean Spaces backup runs, S3 Glacier Relay archives, and a schedule block (enabled / frequency / last / next) for the Backups widget. |
| PATCH |
/sites/{site}/backup-relay |
Per-site Glacier backup toggle + cadence (daily / twice_weekly / weekly). Custom/standalone sites only. |
| POST |
/sites/{site}/backup-relay/run-now |
Backup Now for one custom site (clockwork:backup-relay-run --site={id} --force in the background). |
| GET |
/search/global |
Unified global search endpoint for Command Palette (⌘K), querying servers and sites with live status indicators. |
| GET |
/search/sites |
JSON site search (focused with /). |
| PATCH | /sites/{site}/cert · POST /cert/recheck | SSL source + recheck. |
| POST | /sites/{site}/uptime/recheck | On-demand uptime probe for one site. |
| PATCH | /sites/{site}/uptime-keyword | Optional homepage keyword the 5-minute probe must find. |
| POST | /sites/{site}/uptime-body-check | Per-site skip of the white-screen body-length check (parked / SPA / gated homepages). |
| POST | /sites/{site}/cache/purge | Queue a best-effort cache flush (Companion, Pressable, Cloudflare). |
| POST | /sites/{site}/work-logs · PATCH/DELETE /work-logs/{workLog} | Client-report work log CRUD. |
| GET | /companion/download | Stream compiled clockwork-companion.zip plugin package for manual WP Admin upload. |
| POST | /sites/{site}/bans/{blockedIp}/unban · /bans/unban-all | Unban one / all. |
| POST | /sites/{site}/gatekeeper/push | Push effective Gatekeeper lockout settings to this site immediately via HMAC REST. |
| POST | /sites/{site}/install-companion | Install Companion. Dispatches to the provider’s installer via $site->host()->companionInstaller(). (The legacy /install-llar route was removed in 1.10.1 — Gatekeeper replaced LLAR.) |
| PATCH | /sites/{site}/settings-layout | Save the per-site Settings tab card order (layout[] of card keys) to sites.settings_layout; reset=1 clears it back to the default order. JSON for XHR, redirect otherwise. |
| POST | /sites/{site}/companion/{push-update,refresh-snapshot,sso,plugin-update} | Companion ops. |
| POST | /sites/{site}/care-plan[/clear-override] | Toggle / un-pin care plan. |
| POST | /sites/{site}/auto-updates/toggle | Per-site nightly auto-update opt-in/out. |
| POST | /sites/{site}/uptime-monitoring · /uptime-ignore | Per-site uptime opt-out / mute-alerts-but-keep-probing toggle (two different things — see Features → Uptime monitoring). |
| POST | /sites/{site}/notifications/subscribers | Sync alert subscriber recipients for this site. |
| POST | /sites/{site}/notifications/subscribers/create | Create and attach a new client alert recipient for this site. |
| POST | /sites/{site}/inactive | Fleet-wide inactive toggle — site stays visible everywhere, excluded from Issues/nav badge/routine-maintenance alerts. See Features → Inactive sites. |
| POST | /sites/{site}/fetch-db-creds | Fetch WP DB credentials over SSH for a single site. |
| POST | /sites/{site}/refresh-wp-plugins | Re-probe via SSH. |
| POST | /sites/{site}/email-vuln-report | Email a plugin-vulnerability summary for one site. |
| POST | /sites/{site}/archive · POST /sites/{siteId}/unarchive | Soft-remove / restore. Archive on SpinupWP / Pressable also writes site_ingest_exclusions so host import will not resurrect the row; unarchive clears that exclusion. Unarchive uses {siteId} (not the {site} route-model binder) because the binder 404s on archived rows. |
| GET | /forms | Fleet-wide contact-form-test inventory. Provided by Modules\ContactForms (self-registered via its ServiceProvider::boot()), not core routes/web.php. The forms site-detail tab only appears when the module is enabled. |
| POST | /sites/{site}/form-tests · PATCH/DELETE /form-tests/{cft} · POST /form-tests/{cft}/test-now | Per-site form-test CRUD + on-demand run. Deliberately under /form-tests/, not /forms/, so it doesn’t collide with the ?tab=forms site-detail URL. Also module-provided now — see above. |
| POST | /sites/{site}/contact-form/install-companion · /contact-form/rotate-secret | Contact-form add-on’s own Companion install/secret-rotate entry points (same controller methods as the generic ones above, reachable from the Forms page). |
Updates
| Method |
Path |
Purpose |
| GET |
/updates |
Fleet-wide plugin/theme/core/translation updates page. |
| GET |
/updates/care-plan |
Curation page — per-site auto-update opt-in/out toggles. |
| POST |
/updates/bulk-update |
Queue a batch of plugin_update_jobs for the selected targets. |
| POST |
/updates/bulk-ignore · /bulk-unignore |
Add/remove plugin_update_ignores entries. |
| GET |
/updates/batches/{batchId}/status |
Batch progress JSON (UUID-constrained). Infrastructure exists; polling JS isn’t wired up yet — see Features → Updates. |
Bans
| Method |
Path |
Purpose |
| GET |
/bans[/{queue,active,history}] |
Unified bans page (3 tabs). |
| GET |
/review · /blocked-ips |
301 redirects to /bans/queue and /bans/active — bookmarks keep working. |
| POST |
/review/auto-approve/toggle |
Toggle auto-approve-repeats. |
| POST |
/review/{bulk-approve,bulk-dismiss} |
Bulk actions on the queue. |
| POST |
/review/{entry}/{approve,dismiss} |
Per-entry decisions. |
| POST |
/blocked-ips/{blockedIp}/unban |
Global unban. |
Monitoring + security
| Method |
Path |
Purpose |
| GET |
/monitoring |
Fleet uptime status board. |
| POST |
/monitoring/refresh |
On-demand fleet uptime re-check (background clockwork:check-site-uptime). |
| GET/PATCH |
/monitoring/settings |
Probe interval + failure threshold. |
| GET |
/security/admins |
Fleet WordPress administrator directory and allowlist. |
| PATCH |
/security/admins/allowlist |
Save approved admin email domains/emails. |
| POST |
/security/admins/{site}/ignore · DELETE /ignore/{ignoredWpAdmin} |
Acknowledge or restore a flagged WP admin. |
| GET |
/security/scans |
Per-site security scan inventory. |
| POST |
/security/scans/{site}/run |
Manual scan trigger. |
| GET |
/security/scans/{site}/file |
View a flagged core-checksum file’s contents (SSH read, path-validated against the latest scan). |
| POST |
/security/scans/{site}/allowlist |
Add a (path, bucket) to the core-checksum allowlist. |
| DELETE |
/security/scans/{site}/allowlist/{entry} |
Remove an allowlist entry. |
Operations — fleet-wide system updates
| Method |
Path |
Purpose |
| GET |
/operations/server-updates |
Fleet-wide apt-update dashboard. Lists every non-ignored server with its latest server_update_snapshots row. Legacy /operations/system-updates 301-redirects here. |
| POST |
/operations/server-updates/queue-bulk |
Bulk-queue apt-update jobs for selected servers. Reuses single-server transition guards (skip ignored / inflight / no-SSH). |
| POST |
/operations/server-updates/refresh |
On-demand fleet poll. Runs detached background poll. |
Settings
| Method |
Path |
Purpose |
| GET |
/settings |
Settings & Operations Hub — 4-quadrant operations command center with real-time tool search. See Features → Settings Hub. |
| GET/POST/PATCH |
/settings/users[/{user}/{revoke,restore}] |
Allowlist management. |
| GET/PATCH/POST |
/settings/ingest[/run-now] |
Gatekeeper lockout / Wordfence pull cadence + manual run. |
| PATCH |
/settings/ingest/retention |
Days/weeks window for raw threat_logs (default 30 days). |
| POST |
/settings/ingest/prune-now |
Start clockwork:prune-threat-logs in the background. |
| POST |
/settings/ingest/rebuild-partitions |
Start clockwork:rebuild-threat-logs-partitions in the background. |
| GET |
/settings/wordpress-plugins |
Fleet WP plugin inventory. |
| GET/PATCH |
/settings/gatekeeper |
Fleet Gatekeeper policy settings: failed attempt thresholds, lockout backoff duration, 429 page branding, and automated sync. |
| POST |
/settings/gatekeeper/push |
Push effective Gatekeeper policy to all Companion-installed sites immediately. |
| GET/PATCH/POST |
/settings/security-scans[/run-now] |
Scan toggles + manual run. |
| GET/PATCH/POST | /settings/backup-relay[/run-now] | Backup Relay (S3 Glacier IR) settings + on-demand execution. |
| GET | /settings/backup-relay/sites/{site}/{archives,download} | Per-site S3 Glacier archive listing (archives) and streamed download of a specific archive (download). |
| GET/POST | /settings/scheduled-jobs[/run] | Scheduled Jobs dashboard — every cron entry’s last outcome + manual Run now. |
| GET/POST | /settings/bill-com[/run-{customer,care-plan}-sync] | Sync status + manual runs. |
| GET/POST | /settings/mattermost | Per-event Mattermost notification toggles (ip_blocked, ssl_state_changed, site_went_down/up, etc.). |
| GET/POST | /settings/slack | Same per-event toggles, Slack channel. Independent settings key (notifications.slack.events) from Mattermost’s. |
| GET/POST/PATCH/DELETE | /settings/notifications[/recipients[/{recipient}][/test][/windows]] | Twilio SMS recipient list + off-window schedule. |
| GET/PATCH | /settings/integrations | Overview of registered provider API credentials (.env stays primary source of truth). |
| POST | /settings/integrations/{integration}/test | Runs that integration’s diagnostics check on demand and flashes the result. |
| GET | /settings/integrations/{service}/limits | Dedicated vendor rate limits, telemetry impact, connection tunables, and .env credentials. |
| PATCH | /settings/integrations/{service}/limits | Save operator connection tunables and write API credentials directly to .env. |
| POST | /settings/integrations/{service}/limits/reset | Reset service connection tunables back to recommended vendor defaults. |
| POST | /settings/integrations/{service}/credentials/{field}/remove | Remove an API key/credential from the root .env file. |
| GET | /settings/modules | Module Directory — browses the official + community module catalog (Modules\Core\ModuleDirectoryClient, cached feed from clockworkcontrol.com/api/modules.json). See Features → Module Directory. |
| POST | /settings/modules/refresh | Force-refresh the module feed, bypassing the cache. |
| POST | /settings/modules/toggle | Enable or disable an installed module on-the-fly. |
| GET | /settings/feedback | Feedback module settings and global toggle. |
| GET | /feedback | Working list of all visual feedback items and discussion threads. |
| GET | /feedback/{feedbackItem} | Single feedback item detail view with threaded discussions and prompt generator. |
| GET | /settings/updates | Clockwork Control’s own self-update hub — checks the GitHub Releases API for a newer Core version, shows the Companion fleet-rollout breakdown, and links to the module catalog. Not to be confused with the fleet-wide /updates page (client WordPress sites) — see Features → System updates. |
| POST | /settings/updates/check | Force a fresh check against the upstream release channel, bypassing the 12h cache. |
| POST | /settings/updates/apply | Operator-triggered self-update: git pull → composer install --no-dev → migrate --force → optimize:clear. Aborts before touching anything if the working copy has uncommitted changes. |
| GET | /settings/diagnostics | System diagnostics dashboard. |
| GET | /settings/maintenance | Operator-only page showing DB size + a download button. |
| GET | /settings/maintenance/backup | Streams a gzipped mysqldump of Clockwork Control’s own database straight to the browser (no temp file on the server). Contains every encrypted column ciphertext — SSH keys, per-site DB creds, Companion secrets — decryptable only by pairing the dump with APP_KEY. Treat downloaded copies with the same care as .env. |
| GET | /settings/weird-stats | Pre-warmed threat-log stats. |
| GET | /styleguide | Developer design system styleguide (StyleguideController) — interactive workbench displaying color tokens, buttons, form controls, badges, and modal components. |
| GET | /search | Global fuzzy search endpoint powering Quick Jump (Cmd+K / Ctrl+K). Returns categorized, ranked results for servers, sites, modules, settings, documentation, and runbooks. |
| GET | /ai-remedy | AiRemedy audit log, incident history, filtering by status, and aggregate token cost metrics. |
| GET | /ai-remedy/accuracy | AiRemedy diagnosis accuracy report, operator verdict statistics, automated 60-minute outcome distributions, and readiness scorecard. |
| GET | /ai-remedy/settings | AiRemedy configuration hub (model selection, automated spike watchdog toggle, CPU threshold %, and cooldown minutes). |
| POST | /ai-remedy/test-connection | Validates OpenRouter API key, balance, and latency (throttled: 10,1). |
| POST | /ai-remedy/simulate | Executes safe read-only test simulation in Watch Mode (throttled: 10,1). |
| POST | /ai-remedy/servers/{server}/diagnose | Triggers live read-only SSH telemetry probe and OpenRouter root-cause triage (throttled: 15,1). |
| POST | /ai-remedy/runs/{run}/execute | Admin-only. Runs the operator-selected subset of a run’s proposed commands (selected: [{index, command}]) via SSH with exit code validation; records per-command decisions; 409 for Shadow/simulation, already-run, stale (>2h) runs, or a server with a fix already running (throttled: 10,1). |
| POST | /ai-remedy/runs/{run}/verdict | Authenticated operators submit diagnosis verdict (correct, partial, wrong, unsure) and optional feedback notes. |
| DELETE | /ai-remedy/runs | Admin-only. Bulk-deletes the given run ids[] from the incident log (executing runs are kept); logs ai_remedy_runs_deleted. |
| POST | /ai-remedy/runs/hide | Admin-only. Hides the given run ids[] from the incident log (sets hidden_at). |
| POST | /ai-remedy/runs/unhide | Admin-only. Restores hidden runs to the incident log. |
| GET | /ai-remedy/runs/{run} | Dedicated incident forensics page: telemetry snapshot, top processes, root cause, and stdout/stderr log. |
Email Authentication
| Method |
Path |
Purpose |
| GET |
/email-auth |
Email authentication fleet overview table: SPF lookup counts, DMARC policies, DKIM status, and detailed slide-over inspector (subtab under /security/email-auth). |
| POST |
/email-auth/scan |
Trigger on-demand DNS verification scan for a single domain. |
| POST |
/email-auth/scan-all |
Trigger on-demand fleet-wide background DNS verification scan across all active domains. |
| POST |
/email-auth/domains/{domain}/ignore |
Toggle advisory ignore state for a domain (silences degradation alerts for externally-managed client DNS). |
| POST |
/email-auth/domains/{domain}/selectors |
Update custom DKIM selector probing list for a specific client domain. |
| DELETE |
/email-auth/domains/{domain} |
Soft-delete a domain from tracking, removing it from views and scheduled weekly checks. |
Docs (this site)
| Method |
Path |
Purpose |
| GET |
/docs |
Docs index. |
| GET |
/docs/{path} |
A single doc page. Slug regex restricts to [a-z0-9\-/]+. |