Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Every change requests a review from the maintainer. One owner, because there is one maintainer --
# the point is that no path is left without a reviewer as the package count grows, not to route
# different directories to different people.
* @ivanvyd
17 changes: 17 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ jobs:
# Lets this job ask GitHub for the signed OIDC token that NuGet.org trades for a short-lived
# publishing key. Without it the login step below cannot get a token at all.
id-token: write
# Recording the build provenance attestation for the packages this job produced.
attestations: write

steps:
- name: Checkout
Expand Down Expand Up @@ -157,6 +159,21 @@ jobs:
--output ${{ env.NUPKG_DIR }}
-p:PackageVersion=${{ steps.version.outputs.VERSION }}

# Signs a statement of which workflow, at which commit, on which runner produced these exact
# packages, and records it in the public transparency log. Anyone can then check a downloaded
# package came from this repository rather than from someone who merely knew the package name:
#
# gh attestation verify Healthie.NET.4.2.0.nupkg --repo ivanvyd/Healthie.NET
#
# The SBOM already says what went in; this says who built it, which is the half that a
# tampered build would otherwise be free to restate. Skipped on a dry run, because an
# attestation is a public claim that a release happened.
- name: Attest build provenance
if: ${{ !inputs.dry_run }}
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
with:
subject-path: ${{ env.NUPKG_DIR }}/*.nupkg

# Scoped to the shipped projects rather than the solution: scanning everything drags in the
# samples' Aspire dependencies, which describe this repository rather than anything a
# consumer restores -- 189 components instead of 58. The filter is derived from the src tree
Expand Down
40 changes: 40 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/).

## [Unreleased]

### Fixed

- **The dashboard cropped its own rows on anything narrower than a laptop.** The row and its column
header share one track definition, and two rules overrode it: a read-only board drops the controls
column, and a narrow viewport folds the row down to three. Written as separate rule sets they
fought on specificity, and `.hpm-list--readonly .hpm-row` outranks a `.hpm-row` inside a media
query -- so on a read-only board the fold never applied at any width. Every row was drawn with
five tracks demanding 556px inside a 342px phone: 214px of columns clipped off the right, the name
squeezed to its 160px minimum to make room for columns that were not visible anyway, and no
scrollbar to reach them, because the overflow was clipped rather than scrolled. The definition is
now a single custom property on the list, which is the one element both variants already sit on,
so the fold cannot be outranked.
- **The last column was clipped on an ordinary 1280 laptop, read-only or not.** The detail panel
moved below the list at 1100px, but a full row needs a 706px column and the list only reaches that
at 1402px of viewport -- so between those two the three columns fitted the window while the middle
one no longer fitted a row. That threshold is now 1400px, calibrated on the editable board, which
is the wider of the two and the default.
- **Group and tag chips were sliced down the middle on a phone.** They sit on the row's sub-line,
which truncates with `text-overflow: ellipsis` -- and that ellipsizes text, not an inline-flex
pill, so a chip was cut mid-shape instead. The folded row has vertical room the wide one does not,
so the line now wraps there, exactly as it already does on a card.
- **Cards lost their rate, sparkline and last-checked time on a phone.** The three cells were hidden
for every layout below 820px, but only the row layout was short of width; a card stacks them into
areas down its own length, where they fit. They are now hidden for the row layout alone.

### Changed

- **The packages point at [healthie-dotnet.dev](https://healthie-dotnet.dev).** `PackageProjectUrl`
is the landing site rather than the repository, because NuGet renders it as the package's "Project
website" and a reader who clicks it wants documentation and the live board, not a source tree.
`RepositoryUrl` still points at GitHub, so Source Link and NuGet's own source link are unaffected.
Every package README now links the documentation site alongside the live demo, which moved to
[board.healthie-dotnet.dev](https://board.healthie-dotnet.dev).
- **Releases carry build provenance.** The release workflow attests which workflow, at which commit,
produced each package, so `gh attestation verify <package>.nupkg --repo ivanvyd/Healthie.NET`
proves a download came from this repository. The SBOM already said what went into a package; this
says who built it, which is the half a tampered build would otherwise be free to restate.
- The repository README leads with a screenshot rather than a 10MB animation, and `Healthie.NET.Redis`
gained the header every other package README already had.

## [4.1.0] - 2026-07-30

Twenty packages was too many, and two of them had no business being separate. This release fixes
Expand Down
8 changes: 7 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,13 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<Authors>Ivan Vydrin</Authors>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/ivanvyd/Healthie.NET</PackageProjectUrl>
<!--
The project URL is the landing site, not the repository: NuGet renders it as the package's
"Project website", and a reader who clicks it wants docs and the live board rather than a
source tree. RepositoryUrl still points at GitHub, which is what Source Link and NuGet's
own "Source repository" link use, so nothing loses its way to the code.
-->
<PackageProjectUrl>https://healthie-dotnet.dev</PackageProjectUrl>
<RepositoryUrl>https://github.com/ivanvyd/Healthie.NET</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageIcon>healthie.net.png</PackageIcon>
Expand Down
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

**Trust your uptime.** A lightweight, extensible health monitoring framework for .NET applications.

[![Website](https://img.shields.io/badge/docs-healthie--dotnet.dev-0b7285.svg)](https://healthie-dotnet.dev)
[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Abstractions.svg)](https://www.nuget.org/packages/Healthie.NET.Abstractions)
[![Downloads](https://img.shields.io/nuget/dt/Healthie.NET.Abstractions.svg)](https://www.nuget.org/packages/Healthie.NET.Abstractions)
[![Build](https://github.com/ivanvyd/Healthie.NET/actions/workflows/ci.yml/badge.svg)](https://github.com/ivanvyd/Healthie.NET/actions/workflows/ci.yml)
[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/ivanvyd/Healthie.NET/badge)](https://scorecard.dev/viewer/?uri=github.com/ivanvyd/Healthie.NET)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13898/badge)](https://www.bestpractices.dev/projects/13898)
[![.NET](https://img.shields.io/badge/.NET-8.0%20%7C%2010.0-512BD4.svg)](https://dotnet.microsoft.com)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/ivanvyd/Healthie.NET/blob/main/LICENSE)

Expand All @@ -15,13 +17,15 @@
builder.Services.AddHealthie(typeof(Program).Assembly);
```

![The Healthie.NET dashboard](https://raw.githubusercontent.com/ivanvyd/Healthie.NET/main/docs/assets/healthie-v3-film-1080-cut.gif)
[![The Healthie.NET dashboard](https://raw.githubusercontent.com/ivanvyd/Healthie.NET/main/docs/assets/shot-dark.png)](https://board.healthie-dotnet.dev)

> **▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — a read-only dashboard watching the real status pages of Anthropic, OpenAI, Cursor, GitHub, Cloudflare, npm, Datadog, and more. Built from these NuGet packages.
> **▶ [Live demo — board.healthie-dotnet.dev](https://board.healthie-dotnet.dev)** — a read-only dashboard watching the real status pages of Anthropic, OpenAI, Cursor, GitHub, Cloudflare, npm, Datadog, and more. Built from these NuGet packages.
>
> **📖 [healthie-dotnet.dev](https://healthie-dotnet.dev)** — documentation, guides, and the package ecosystem in one place.

**Contents**

[Live Demo](https://healthie.compiletheory.com) · [Quick Start](#quick-start) · [Packages](#nuget-packages) · [Writing a Checker](#creating-a-pulse-checker) · [Configuration](#configuration) · [REST API](#api-endpoints) · [Dashboard](#ui-dashboard) · [Existing `IHealthCheck`s](#monitoring-existing-health-checks) · [Kubernetes](#kubernetes-probes) · [MCP](#ai-agents-mcp) · [AI Diagnostics](#ai-diagnostics) · [Extensibility](#extensibility) · [Samples](#sample-projects) · [Roadmap](#roadmap) · [Contributing](#contributing)
[Website](https://healthie-dotnet.dev) · [Live Demo](https://board.healthie-dotnet.dev) · [Quick Start](#quick-start) · [Packages](#nuget-packages) · [Writing a Checker](#creating-a-pulse-checker) · [Configuration](#configuration) · [REST API](#api-endpoints) · [Dashboard](#ui-dashboard) · [Existing `IHealthCheck`s](#monitoring-existing-health-checks) · [Kubernetes](#kubernetes-probes) · [MCP](#ai-agents-mcp) · [AI Diagnostics](#ai-diagnostics) · [Extensibility](#extensibility) · [Samples](#sample-projects) · [Roadmap](#roadmap) · [Contributing](#contributing)

---

Expand Down
14 changes: 8 additions & 6 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

## Supported Versions

Healthie.NET ships as a set of NuGet packages (`Healthie.NET.Abstractions`,
`Healthie.NET.DependencyInjection`, `Healthie.NET.Api`, `Healthie.NET.Dashboard`,
`Healthie.NET.Quartz`, `Healthie.NET.CosmosDb`, `Healthie.NET.Mcp`,
`Healthie.NET.AI`) that all move in lockstep from the same tagged release.
Healthie.NET ships as a set of NuGet packages — `Healthie.NET` and every
`Healthie.NET.*` published from this repository — which all move in lockstep from
the same tagged release. They are deliberately not listed one by one here: the set
has grown from eight to twenty, and a list in a security policy that lags the
packages is worse than no list, because a reader cannot tell whether their package
is missing or unsupported.

| Version | Supported |
|---|---|
| 3.1.x | :white_check_mark: Supported |
| < 3.1 | :x: End of life |
| 4.1.x | :white_check_mark: Supported |
| < 4.1 | :x: End of life |

Only the versions listed above receive security fixes. If you're on an
end-of-life version, please upgrade before reporting an issue — we won't be
Expand Down
Binary file removed docs/assets/healthie-v3-film-1080-cut.gif
Binary file not shown.
2 changes: 1 addition & 1 deletion src/Healthie.AI/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.AI.svg)](https://www.nuget.org/packages/Healthie.NET.AI)

**▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — a read-only Healthie.NET dashboard watching real status pages (Anthropic, OpenAI, GitHub, Cloudflare, and more), built from these packages.
**▶ [Live demo — board.healthie-dotnet.dev](https://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](https://healthie-dotnet.dev)**.

Explains what a pulse checker's recent history shows: whether it is failing consistently or intermittently, when it started, and what the errors point to. Provider-agnostic -- it depends on `Microsoft.Extensions.AI.Abstractions` and nothing else, so the model is your choice.

Expand Down
2 changes: 1 addition & 1 deletion src/Healthie.Abstractions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Abstractions.svg)](https://www.nuget.org/packages/Healthie.NET.Abstractions)

**▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — a read-only Healthie.NET dashboard watching real status pages (Anthropic, OpenAI, GitHub, Cloudflare, and more), built from these packages.
**▶ [Live demo — board.healthie-dotnet.dev](https://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](https://healthie-dotnet.dev)**.

Core interfaces, models, enums, and the `PulseChecker` abstract base class for the Healthie.NET health monitoring framework. This package contains no implementations -- only the contracts and types that all other Healthie.NET packages depend on.

Expand Down
2 changes: 1 addition & 1 deletion src/Healthie.Alerting/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Alerting.svg)](https://www.nuget.org/packages/Healthie.NET.Alerting)

**▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — a read-only Healthie.NET dashboard watching real status pages (Anthropic, OpenAI, GitHub, Cloudflare, and more), built from these packages.
**▶ [Live demo — board.healthie-dotnet.dev](https://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](https://healthie-dotnet.dev)**.

Turns health changes into alerts and delivers them, without letting a delivery problem become a monitoring problem.

Expand Down
2 changes: 1 addition & 1 deletion src/Healthie.Api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Api.svg)](https://www.nuget.org/packages/Healthie.NET.Api)

**▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — a read-only Healthie.NET dashboard watching real status pages (Anthropic, OpenAI, GitHub, Cloudflare, and more), built from these packages.
**▶ [Live demo — board.healthie-dotnet.dev](https://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](https://healthie-dotnet.dev)**.

ASP.NET Core API controller for managing Healthie.NET pulse checkers via REST endpoints. All endpoints are served under the `/healthie` route prefix.

Expand Down
2 changes: 1 addition & 1 deletion src/Healthie.Checkers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Checkers.svg)](https://www.nuget.org/packages/Healthie.NET.Checkers)

**▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — a read-only Healthie.NET dashboard watching real status pages (Anthropic, OpenAI, GitHub, Cloudflare, and more), built from these packages.
**▶ [Live demo — board.healthie-dotnet.dev](https://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](https://healthie-dotnet.dev)**.

Ready-made pulse checkers for the things nearly every application ends up watching, so there is no checker code to write.

Expand Down
2 changes: 1 addition & 1 deletion src/Healthie.Dashboard/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

Zero-dependency Blazor Server dashboard for monitoring Healthie.NET pulse checkers in real time. Delivered as a Razor Class Library with pure HTML/CSS -- no third-party UI frameworks required.

**▶ [Live demo — healthie.compiletheory.com](https://healthie.compiletheory.com)** — this dashboard, read-only, watching the real status pages of Anthropic, OpenAI, Cursor, GitHub, Cloudflare, and more.
**▶ [Live demo — board.healthie-dotnet.dev](https://board.healthie-dotnet.dev)** — this dashboard, read-only, watching the real status pages of Anthropic, OpenAI, Cursor, GitHub, Cloudflare, and more. Full documentation at **[healthie-dotnet.dev](https://healthie-dotnet.dev)**.

![The Healthie.NET dashboard](https://raw.githubusercontent.com/ivanvyd/Healthie.NET/main/docs/assets/shot-dark.png)

Expand Down
Loading
Loading