A read-and-trigger management UI for Umbraco recurring background jobs. Surfaces every recurring job registered in your site under a Settings dashboard — with timing parameters, execution telemetry the CMS does not persist natively, an estimated next run, server-role awareness, and an authorized on-demand Run now action.
Works with Umbraco 16, 17 and 18 (multi-targeted net9.0 / net10.0).
Optional durable telemetry runs on SQL Server, SQLite and PostgreSQL.
- Auto-discovery of every recurring background job — no per-job wiring.
- Modern jobs implementing
IRecurringBackgroundJob(full support). - Legacy jobs deriving from
RecurringHostedServiceBase(listed with limited support). - Plain
IHostedServiceregistrations are excluded.
- Modern jobs implementing
- Timing parameters per job: period, delay and server roles (human-readable durations).
- Execution telemetry the CMS does not persist natively: last run start, duration and outcome.
- Estimated next run = most recent run start + period (clearly labelled as an estimate).
- Manual trigger ("Run now") for modern jobs — runs off the request thread, guards against overlap, honours the node's server role, and records the initiating backoffice user.
- Load-balancing aware — shows the current node's server role and warns when scheduled jobs do not run on the node, or when history is in-memory / per-node only.
- Configurable storage — in-memory ring buffer (default) or a durable database table that survives restarts and is shared across nodes.
- Secure by default — every endpoint requires access to the Settings section.
dotnet add package uTPro.Feature.JobMonitorStart Umbraco and open Settings → Background Jobs Monitor. Your recurring jobs appear automatically — no configuration or per-job registration required.
| Umbraco | .NET | Target |
|---|---|---|
| 16 | .NET 9 | net9.0 |
| 17 & 18 | .NET 10 | net10.0 |
All settings are optional, under uTPro:Feature:JobMonitor in appsettings.json:
{
"uTPro": {
"Feature": {
"JobMonitor": {
"Storage": "InMemory",
"HistoryCapacity": 50,
"DiscoveryCacheSeconds": 30
}
}
}
}| Key | Default | Description |
|---|---|---|
Storage |
InMemory |
InMemory = per-process ring buffer (resets on restart, per-node). Durable = persisted to the Umbraco database (survives restarts, shared across load-balanced nodes). |
HistoryCapacity |
50 |
Max execution records retained per job. |
DiscoveryCacheSeconds |
30 |
How long a discovery result is cached before re-enumeration. 0 disables caching. |
See Configuration and Telemetry & Storage.
When Storage is Durable, a state-keyed migration creates the uTProJobExecution table on
startup (once per database). Data access uses NPoco strongly-typed queries with provider-quoted
identifiers, so it runs on SQL Server, SQLite and PostgreSQL — the same cross-database approach
used by uTPro.Feature.AuditLog and uTPro.Feature.SimpleFormBuilder. When durable storage is
disabled (the default) the package touches no schema.
| Guide | What's inside |
|---|---|
| Getting Started | Install, compatibility, backoffice location, what each column means |
| Configuration | All appsettings keys and their effects |
| Telemetry & Storage | In-memory vs durable, the uTProJobExecution table, PostgreSQL, load-balancing |
| Manual Trigger (Run now) | How Run now works, overlap/role guards, idempotency caution |
| Security & Permissions | Authorization model, what is read-only, accountability |
| Reference | Project structure, API endpoints, discovery internals, database schema |
| Publishing | Release checklist for NuGet and the Umbraco Marketplace |
dotnet build uTPro.Feature.JobMonitor.slnsrc/uTPro.Feature.JobMonitor.TestSite is a runnable Umbraco 18 site (SQLite, unattended install)
that registers example modern / legacy / plain services to exercise the dashboard.
Produce a NuGet package deterministically:
pwsh ./pack.ps1MIT © T4VN. Issues and contributions welcome on the GitHub repository.
