PHPackages                             justinholtweb/craft-controltower - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Logging &amp; Monitoring](/categories/logging)
4. /
5. justinholtweb/craft-controltower

ActiveCraft-plugin[Logging &amp; Monitoring](/categories/logging)

justinholtweb/craft-controltower
================================

Live operational monitoring dashboard for Craft CMS — site activity, editor tracking, content health, queue watch, and system metrics at a glance.

5.1.1(3w ago)101proprietaryPHPPHP ^8.2

Since May 2Pushed 3w agoCompare

[ Source](https://github.com/justinholtweb/craft-control-tower)[ Packagist](https://packagist.org/packages/justinholtweb/craft-controltower)[ RSS](/packages/justinholtweb-craft-controltower/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (5)Dependencies (1)Versions (5)Used By (0)

Control Tower for Craft CMS
===========================

[](#control-tower-for-craft-cms)

Live operational monitoring dashboard for Craft CMS 5. Know what's happening on your site right now and what needs attention.

Features
--------

[](#features)

- **Live Traffic** — Active visitors, requests per minute, top URLs, bot vs human breakdown
- **Editor Tracking** — Who's logged in, what they're editing, collision warnings when two editors work on the same entry
- **Content Health** — Entries by section, stale content detection, scheduled/expired entries, drafts awaiting attention, asset volume summaries
- **Queue Watch** — Waiting/running/failed jobs, common failure patterns, queue health status
- **System Pulse** — CPU, memory, disk, load average, DB response time, PHP info, uptime
- **Alerts** — Automatic warnings for queue failures, editor collisions, server resource spikes
- **Dashboard Widget** — Configurable at-a-glance summary card with auto-refresh
- **Full CP Section** — Seven-tab deep dive (Overview, Live Traffic, Editors, Content Health, Queue Watch, System Pulse, Alerts)

Requirements
------------

[](#requirements)

- Craft CMS 5.0 or later
- PHP 8.2 or later

Installation
------------

[](#installation)

### With Composer

[](#with-composer)

```
# If developing locally, add as a path repository first:
composer config repositories.control-tower path /path/to/craft-controltower

composer require justinholtweb/craft-controltower
php craft plugin/install control-tower
```

### Manual

[](#manual)

1. Copy the plugin to your project
2. Add the path repository to your `composer.json`: ```
    "repositories": [
        { "type": "path", "url": "./plugins/control-tower" }
    ]
    ```
3. Run `composer require justinholtweb/craft-controltower`
4. Install via the CLI (`php craft plugin/install control-tower`) or through the CP under Settings &gt; Plugins

Configuration
-------------

[](#configuration)

After installation, visit **Control Tower &gt; Settings** in the control panel to configure:

### Tracking

[](#tracking)

SettingDefaultDescriptionTrack VisitorsOnEnable front-end visitor tracking via request loggingTrack EditorsOnTrack CP user activity and element editingTrack Server MetricsOnPeriodically sample CPU, memory, disk, and DB metricsCollision DetectionOnAlert when multiple editors work on the same content### Refresh &amp; Timeouts

[](#refresh--timeouts)

SettingDefaultDescriptionRefresh Interval30sHow often the dashboard auto-refreshesVisitor Timeout2 minMinutes before a visitor is considered inactiveEditor Timeout5 minMinutes before an editor session is considered inactive### Data Retention

[](#data-retention)

SettingDefaultDescriptionVisitor Data30 daysEditor Data90 daysContent Events90 daysMetric Samples30 daysAlert History90 days### Alert Thresholds

[](#alert-thresholds)

SettingDefaultDescriptionQueue Failure Threshold3Failed jobs before triggering an alert5xx Error Rate10/minErrors per minute before alert404 Spike50/min404s per minute before alertStale Content90 daysDays without update before flaggingScheduled Jobs
--------------

[](#scheduled-jobs)

Control Tower includes three queue jobs that should be run on a schedule via cron:

```
# Collect server metrics (every 1-2 minutes)
php craft queue/push justinholtweb\\controltower\\jobs\\CollectMetricsJob

# Run alert checks (every 5 minutes)
php craft queue/push justinholtweb\\controltower\\jobs\\RunAlertChecksJob

# Data retention cleanup (daily)
php craft queue/push justinholtweb\\controltower\\jobs\\CleanupJob
```

Or push them programmatically:

```
use justinholtweb\controltower\jobs\CollectMetricsJob;
use justinholtweb\controltower\jobs\RunAlertChecksJob;
use justinholtweb\controltower\jobs\CleanupJob;

Craft::$app->getQueue()->push(new CollectMetricsJob());
Craft::$app->getQueue()->push(new RunAlertChecksJob());
Craft::$app->getQueue()->push(new CleanupJob());
```

Dashboard Widget
----------------

[](#dashboard-widget)

Add the **Control Tower** widget to any user's dashboard. The widget is configurable:

- Toggle visibility for each panel (visitors, editors, queue, server, alerts, content, top URLs)
- Set a custom refresh interval
- Resize to any column span

The widget links to the full CP section for deeper investigation.

Architecture
------------

[](#architecture)

```
Plugin.php              → Event wiring, CP nav, settings
controllers/
  DashboardController   → 8 CP page actions
  ApiController         → 8 JSON endpoints for live polling
services/
  VisitorTrackingService   → Session-hash tracking, bot detection
  EditorTrackingService    → CP route parsing, collision detection
  ContentHealthService     → Stale/scheduled/expired content, pipeline
  QueueMonitorService      → Queue health, failed jobs
  MetricsCollectorService  → CPU/memory/disk/DB, cross-platform
  AlertService             → Alert lifecycle, automated checks
records/                → ActiveRecord models (6 tables)
migrations/Install.php → Database schema
jobs/                   → CleanupJob, CollectMetricsJob, RunAlertChecksJob
widgets/                → Dashboard widget
assets/                 → CSS + JS with auto-refresh polling
templates/              → CP section (7 tabs) + widget

```

Privacy
-------

[](#privacy)

- Visitor IP addresses are stored as SHA-256 hashes, never in plain text
- User agents are hashed for bot detection grouping
- Session identity uses a daily-rotating hash of IP + user agent
- All tracking data is automatically purged based on retention settings
- Visitor tracking can be fully disabled in settings

Roadmap
-------

[](#roadmap)

**v1.5** — Trend charts (15m / 1h / 24h / 7d), per-section content health, 404 and error rate trends, configurable alert thresholds

**v2** — Slack/email alert notifications, deployment awareness (git SHA, last deploy, environment), cache metrics, database slow query panel, multi-site comparisons

License
-------

[](#license)

See [LICENSE.md](LICENSE.md).

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance95

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

4

Last Release

23d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/035cb655c55af0e9e5b96754b80fd9703e195c32dbdfc49ae9a43ab9cf8db560?d=identicon)[justinholtweb](/maintainers/justinholtweb)

---

Top Contributors

[![justinholtweb](https://avatars.githubusercontent.com/u/295903?v=4)](https://github.com/justinholtweb "justinholtweb (12 commits)")

### Embed Badge

![Health badge](/badges/justinholtweb-craft-controltower/health.svg)

```
[![Health](https://phpackages.com/badges/justinholtweb-craft-controltower/health.svg)](https://phpackages.com/packages/justinholtweb-craft-controltower)
```

###  Alternatives

[spicyweb/craft-neo

A Matrix-like field type with block hierarchy

393808.8k10](/packages/spicyweb-craft-neo)[craftcms/feed-me

Import content from XML, RSS, CSV or JSON feeds into entries, categories, Craft Commerce products, and more.

294943.4k27](/packages/craftcms-feed-me)[verbb/formie

The most user-friendly forms plugin for Craft.

100387.6k57](/packages/verbb-formie)[solspace/craft-freeform

The most flexible and user-friendly form building plugin!

53675.5k15](/packages/solspace-craft-freeform)[putyourlightson/craft-sherlock

Security scanner and monitor to keep your site and CMS secure.

1658.6k3](/packages/putyourlightson-craft-sherlock)[verbb/hyper

A user-friendly links field for Craft.

24142.6k12](/packages/verbb-hyper)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
