Healthie.NET.Temporal
4.1.3
Prefix Reserved
See the version list below for details.
dotnet add package Healthie.NET.Temporal --version 4.1.3
NuGet\Install-Package Healthie.NET.Temporal -Version 4.1.3
<PackageReference Include="Healthie.NET.Temporal" Version="4.1.3" />
<PackageVersion Include="Healthie.NET.Temporal" Version="4.1.3" />
<PackageReference Include="Healthie.NET.Temporal" />
paket add Healthie.NET.Temporal --version 4.1.3
#r "nuget: Healthie.NET.Temporal, 4.1.3"
#:package Healthie.NET.Temporal@4.1.3
#addin nuget:?package=Healthie.NET.Temporal&version=4.1.3
#tool nuget:?package=Healthie.NET.Temporal&version=4.1.3

Healthie.NET.Temporal
▶ Live demo — board.healthie-dotnet.dev — a read-only Healthie.NET dashboard watching real status pages (Anthropic, OpenAI, GitHub, Cloudflare, and more), built from these packages. Full documentation at healthie-dotnet.dev.
Schedules pulse checks with Temporal, so the schedule lives in the cluster rather than in the process.
Installation
dotnet add package Healthie.NET.Temporal
Usage
using Healthie.Scheduling.Temporal;
using Temporalio.Extensions.Hosting;
builder.Services.AddSingleton<ITemporalClient>(await TemporalClient.ConnectAsync(new("localhost:7233")));
builder.Services
.AddHealthie(typeof(Program).Assembly)
.AddHealthieTemporal(options => options.TaskQueue = "healthie");
// A worker must be listening on the same queue, or the schedules fire and nothing runs.
builder.Services
.AddHostedTemporalWorker("healthie")
.AddScopedActivities<PulseCheckerActivities>()
.AddWorkflow<PulseCheckerWorkflow>();
The Temporal client is yours to create: its address, namespace, TLS and API key are your decisions, and a library that picked them would be picking which cluster your workflows run on.
What it buys, and what it costs
Buys: the schedule survives a restart and a redeploy, each occurrence is handed to exactly one worker however many replicas are running, and every run has a history somebody can look at.
Costs: a Temporal cluster. If you do not already run one, this is the wrong trade — Healthie.NET.Hangfire gives you the same survives-a-restart, runs-once-across-replicas properties against a database you probably already have, and the built-in timer needs nothing at all.
The SDK also carries a native Rust core, so it is a large dependency: it adds a few hundred megabytes to a build output. Worth knowing before adding it to something small.
Details
Schedules are named healthie-<checker name>, so they are recognisable in the Temporal UI and cannot collide with your own.
Overlap policy is Skip. A checker already refuses to run on top of itself, so buffering would queue occurrences that each return immediately — and a check that is late is worth less than the next one, which is current.
Cron expressions use Healthie.NET's standard Unix form: five fields, or six with leading seconds. Temporal uses seven fields when seconds are present because its sixth field is a year, so the adapter appends a wildcard year to Healthie.NET's six-field form. Fixed periods become interval specs, which Temporal counts from an epoch rather than from creation time, so replicas agree on when a schedule fires. Temporal's one-second minimum is validated before an existing schedule is replaced.
The workflow does nothing but call an activity — workflow code must be deterministic, and a pulse check is not — and the activity is given the checker's name, because a schedule outlives the process that created it and a checker does not survive being serialized.
Testing
The mapping from a schedule to a Temporal specification is unit-tested. Everything else needs a running cluster, so it is not exercised in the default test suite — that suite deliberately requires no infrastructure. Run it against a dev server (temporal server start-dev) when changing this package.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Cronos (>= 0.13.0)
- Healthie.NET.Abstractions (>= 4.1.3)
- Temporalio (>= 1.20.0)
-
net8.0
- Cronos (>= 0.13.0)
- Healthie.NET.Abstractions (>= 4.1.3)
- Temporalio (>= 1.20.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
### Fixed
- Compatible runtime and test dependencies now track their current releases, including the latest
Quartz 3 line for the existing `net8.0` and `net10.0` provider. Dependabot now leaves the
incompatible Quartz 4 migration for a future Healthie.NET major release.
- The test projects now run on xUnit 4 through Microsoft Testing Platform, so .NET 10 executes the
unit and browser suites instead of rejecting their legacy VSTest target.
- The Aspire sample now uses the matching 13.5.4 AppHost SDK and its recommended CLI bundle, and the
redundant direct SSH.NET test pin was removed after Testcontainers adopted the patched release.
- The Scorecard upload action is pinned to the current immutable CodeQL Action 4.38.2 commit.
Full changelog: https://github.com/ivanvyd/Healthie.NET/blob/v4.1.3/CHANGELOG.md