diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..b5fcfe3 --- /dev/null +++ b/.github/CODEOWNERS @@ -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 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8c3dd3c..7caf6ff 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -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 @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index fd88140..5f35478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 .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 diff --git a/Directory.Build.props b/Directory.Build.props index bd60d0b..bd95cdd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -42,7 +42,13 @@ true Ivan Vydrin MIT - https://github.com/ivanvyd/Healthie.NET + + https://healthie-dotnet.dev https://github.com/ivanvyd/Healthie.NET git healthie.net.png diff --git a/README.md b/README.md index 2d48259..92015bf 100644 --- a/README.md +++ b/README.md @@ -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) @@ -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) --- diff --git a/SECURITY.md b/SECURITY.md index 43add9c..07cfcfa 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -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 diff --git a/docs/assets/healthie-v3-film-1080-cut.gif b/docs/assets/healthie-v3-film-1080-cut.gif deleted file mode 100644 index f560d64..0000000 Binary files a/docs/assets/healthie-v3-film-1080-cut.gif and /dev/null differ diff --git a/src/Healthie.AI/README.md b/src/Healthie.AI/README.md index b6416fb..75fb599 100644 --- a/src/Healthie.AI/README.md +++ b/src/Healthie.AI/README.md @@ -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. diff --git a/src/Healthie.Abstractions/README.md b/src/Healthie.Abstractions/README.md index 97cf6b3..1efde45 100644 --- a/src/Healthie.Abstractions/README.md +++ b/src/Healthie.Abstractions/README.md @@ -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. diff --git a/src/Healthie.Alerting/README.md b/src/Healthie.Alerting/README.md index 97a90ed..892ae75 100644 --- a/src/Healthie.Alerting/README.md +++ b/src/Healthie.Alerting/README.md @@ -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. diff --git a/src/Healthie.Api/README.md b/src/Healthie.Api/README.md index 7aae02a..6fbed93 100644 --- a/src/Healthie.Api/README.md +++ b/src/Healthie.Api/README.md @@ -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. diff --git a/src/Healthie.Checkers/README.md b/src/Healthie.Checkers/README.md index 68bea90..96dff36 100644 --- a/src/Healthie.Checkers/README.md +++ b/src/Healthie.Checkers/README.md @@ -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. diff --git a/src/Healthie.Dashboard/README.md b/src/Healthie.Dashboard/README.md index 97af582..a383709 100644 --- a/src/Healthie.Dashboard/README.md +++ b/src/Healthie.Dashboard/README.md @@ -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) diff --git a/src/Healthie.Dashboard/wwwroot/healthie.css b/src/Healthie.Dashboard/wwwroot/healthie.css index 6feea7a..f1fd3ea 100644 --- a/src/Healthie.Dashboard/wwwroot/healthie.css +++ b/src/Healthie.Dashboard/wwwroot/healthie.css @@ -294,29 +294,39 @@ --hpm-nav-w: 54px; } +/* + The column header and the rows share one track definition, so they stay aligned. It lives here + as a custom property rather than on the rows themselves because two things override it -- a + read-only board drops the controls column, and a narrow viewport folds the row to three -- and + as separate rule sets they fought over specificity. `.hpm-list--readonly .hpm-row` outranks a + bare `.hpm-row` in a media query, so on a read-only board the fold silently never applied and + every row kept five tracks demanding 556px inside 342px: 214px of columns clipped off a phone, + with the name squeezed to its 160px minimum to make room for them. Declared once, on the one + element both variants already sit on, it cannot be won by the wrong rule. +*/ .hpm-list { + --hpm-row-tracks: 18px minmax(160px, 1.2fr) 92px minmax(140px, 1fr) 90px 100px; + display: flex; flex-direction: column; gap: 8px; } -/* The column header and the rows share this track definition, so they stay aligned. */ -.hpm-row, -.hpm-list-head { - display: grid; - grid-template-columns: 18px minmax(160px, 1.2fr) 92px minmax(140px, 1fr) 90px 100px; - gap: 14px; - align-items: center; -} - /* A read-only board renders no per-row controls, so the track they sat in goes too. Leaving it would reserve 100px of nothing down the right of every row -- and, because the header shares this definition, it has to be dropped from both at once or the two stop lining up. */ -.hpm-list--readonly .hpm-row, -.hpm-list--readonly .hpm-list-head { - grid-template-columns: 18px minmax(160px, 1.2fr) 92px minmax(140px, 1fr) 90px; +.hpm-list--readonly { + --hpm-row-tracks: 18px minmax(160px, 1.2fr) 92px minmax(140px, 1fr) 90px; +} + +.hpm-row, +.hpm-list-head { + display: grid; + grid-template-columns: var(--hpm-row-tracks); + gap: 14px; + align-items: center; } .hpm-list-head { @@ -727,8 +737,22 @@ /* ------------------------------------------------------------ responsive -- */ -@media (max-width: 1100px) { - /* The detail panel drops below the list; the rail keeps its column. */ +/* + The detail panel drops below the list; the rail keeps its column. + + 1400 and not 1100, because 1100 left a band where the three columns still fitted the viewport + but the middle one no longer fitted a row. A full row's tracks need 670px -- 600px of tracks + plus five 14px gaps -- and with its padding and borders that wants a 706px column; the list gets + the viewport less the rail (208), the panel (400), two 18px gaps and the body's 26px padding + either side, so it only reaches 706px at 1402px of viewport. Between 1100 and there, every row + was drawn wider than the column holding it and the right-hand columns were clipped off an + ordinary 1280 laptop. + + Calibrated on the editable board on purpose. Read-only drops the controls column and needs + ~1288px, so a threshold picked from it would still have clipped every board that can be edited, + which is the default. +*/ +@media (max-width: 1400px) { .hpm-body { grid-template-columns: var(--hpm-nav-w) minmax(0, 1fr); } @@ -745,18 +769,35 @@ } /* Below this the six-column grid cannot hold. The row folds to name and controls, and the - sparkline is dropped rather than squeezed into something unreadable. */ - .hpm-row { - grid-template-columns: 18px minmax(0, 1fr) auto; + sparkline is dropped rather than squeezed into something unreadable. Setting the shared + property rather than the rows keeps the read-only variant folding too. */ + .hpm-list { + --hpm-row-tracks: 18px minmax(0, 1fr) auto; } - .hpm-row .hpm-rate-cell, - .hpm-row .hpm-blips, - .hpm-row .hpm-blips-empty, - .hpm-row .hpm-time { + /* + Only the row layout is short of width. A card stacks these into their own areas down the + card, where there is room for them, so hiding them there would drop the rate, sparkline + and last-checked time from the one mobile view that could still show them. + */ + .hpm-list:not(.hpm-list--cards) .hpm-rate-cell, + .hpm-list:not(.hpm-list--cards) .hpm-blips, + .hpm-list:not(.hpm-list--cards) .hpm-blips-empty, + .hpm-list:not(.hpm-list--cards) .hpm-time { display: none; } + /* + The sub-line carries the group and tag chips, and `text-overflow: ellipsis` does not + ellipsize an inline-flex pill -- it slices it down the middle, which reads as a broken + render rather than as truncation. The folded row has the vertical room the wide one did + not, so the line wraps here instead, exactly as it already does on a card. + */ + .hpm-list:not(.hpm-list--cards) .hpm-row-sub { + white-space: normal; + overflow: visible; + } + .hpm-header-inner, .hpm-trace-wrap, .hpm-body { @@ -1071,9 +1112,14 @@ * Card view. The markup is the row's; only the shape changes. * ---------------------------------------------------------------------- */ +/* + The `min()` is what stops a card being wider than the screen it is on. A bare minmax(290px, 1fr) + floors the track at 290px even when the container is 288px, and the overflow is clipped rather + than scrolled -- so on the narrowest phones the right edge of every card was simply gone. +*/ .hpm-list--cards { display: grid; - grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(290px, 100%), 1fr)); gap: 10px; align-content: start; } @@ -1134,7 +1180,7 @@ .hpm-group-body--cards { display: grid; - grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(270px, 100%), 1fr)); gap: 8px; } diff --git a/src/Healthie.DependencyInjection/README.md b/src/Healthie.DependencyInjection/README.md index ee4b61e..1e2c9b2 100644 --- a/src/Healthie.DependencyInjection/README.md +++ b/src/Healthie.DependencyInjection/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.DependencyInjection.svg)](https://www.nuget.org/packages/Healthie.NET.DependencyInjection) -**▶ [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)**. DI registration and the built-in `TimerPulseScheduler` for Healthie.NET. This package scans assemblies for `PulseChecker` implementations, registers them as singletons, and provides a zero-dependency `PeriodicTimer`-based scheduler. diff --git a/src/Healthie.LeaderElection/README.md b/src/Healthie.LeaderElection/README.md index 304c5eb..01ea49e 100644 --- a/src/Healthie.LeaderElection/README.md +++ b/src/Healthie.LeaderElection/README.md @@ -15,7 +15,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.LeaderElection.svg)](https://www.nuget.org/packages/Healthie.NET.LeaderElection) -**▶ [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)**. Runs pulse checks on one replica at a time. diff --git a/src/Healthie.Mcp/README.md b/src/Healthie.Mcp/README.md index 8db9e1c..07ed694 100644 --- a/src/Healthie.Mcp/README.md +++ b/src/Healthie.Mcp/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Mcp.svg)](https://www.nuget.org/packages/Healthie.NET.Mcp) -**▶ [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)**. A [Model Context Protocol](https://modelcontextprotocol.io) server for Healthie.NET, so an AI agent such as Claude, Copilot, or Cursor can read your service health and act on it in plain language. Read-only until you say otherwise. diff --git a/src/Healthie.Scheduling.Coravel/README.md b/src/Healthie.Scheduling.Coravel/README.md index 8d77566..7ed92e6 100644 --- a/src/Healthie.Scheduling.Coravel/README.md +++ b/src/Healthie.Scheduling.Coravel/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Coravel.svg)](https://www.nuget.org/packages/Healthie.NET.Coravel) -**▶ [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)**. Runs pulse checks on Coravel's scheduler, so an application already using Coravel keeps one scheduler rather than two. diff --git a/src/Healthie.Scheduling.Hangfire/README.md b/src/Healthie.Scheduling.Hangfire/README.md index ef0a538..d4e2b8b 100644 --- a/src/Healthie.Scheduling.Hangfire/README.md +++ b/src/Healthie.Scheduling.Hangfire/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Hangfire.svg)](https://www.nuget.org/packages/Healthie.NET.Hangfire) -**▶ [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)**. Hangfire `IPulseScheduler` implementation for Healthie.NET. Schedules each pulse checker as a Hangfire recurring job. diff --git a/src/Healthie.Scheduling.Quartz/README.md b/src/Healthie.Scheduling.Quartz/README.md index 8ecc8fd..6fa82b0 100644 --- a/src/Healthie.Scheduling.Quartz/README.md +++ b/src/Healthie.Scheduling.Quartz/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Quartz.svg)](https://www.nuget.org/packages/Healthie.NET.Quartz) -**▶ [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)**. Quartz.NET `IPulseScheduler` implementation for Healthie.NET. Provides persistent, CRON-based scheduling with support for clustering and advanced job store configurations. diff --git a/src/Healthie.Scheduling.Temporal/README.md b/src/Healthie.Scheduling.Temporal/README.md index ef9c376..d6a95b8 100644 --- a/src/Healthie.Scheduling.Temporal/README.md +++ b/src/Healthie.Scheduling.Temporal/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Temporal.svg)](https://www.nuget.org/packages/Healthie.NET.Temporal) -**▶ [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)**. Schedules pulse checks with Temporal, so the schedule lives in the cluster rather than in the process. diff --git a/src/Healthie.StateProviding.CosmosDb/README.md b/src/Healthie.StateProviding.CosmosDb/README.md index 3f8ae02..5730326 100644 --- a/src/Healthie.StateProviding.CosmosDb/README.md +++ b/src/Healthie.StateProviding.CosmosDb/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.CosmosDb.svg)](https://www.nuget.org/packages/Healthie.NET.CosmosDb) -**▶ [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)**. Azure CosmosDB `IStateProvider` implementation for Healthie.NET. Persists pulse checker state to CosmosDB for durable storage across application restarts and distributed environments. diff --git a/src/Healthie.StateProviding.Postgres/README.md b/src/Healthie.StateProviding.Postgres/README.md index 9dad4c8..23c5553 100644 --- a/src/Healthie.StateProviding.Postgres/README.md +++ b/src/Healthie.StateProviding.Postgres/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Postgres.svg)](https://www.nuget.org/packages/Healthie.NET.Postgres) -**▶ [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)**. PostgreSQL `IStateProvider` implementation for Healthie.NET. Persists pulse checker state to PostgreSQL for durable storage across application restarts and across the replicas of a scaled-out deployment. diff --git a/src/Healthie.StateProviding.Redis/README.md b/src/Healthie.StateProviding.Redis/README.md index ee58a6c..e9ab66e 100644 --- a/src/Healthie.StateProviding.Redis/README.md +++ b/src/Healthie.StateProviding.Redis/README.md @@ -1,7 +1,11 @@ -[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Redis.svg)](https://www.nuget.org/packages/Healthie.NET.Redis) +![Healthie.NET - Trust your uptime](https://raw.githubusercontent.com/ivanvyd/Healthie.NET/main/healthie.net.banner.png) # Healthie.NET.Redis +[![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Redis.svg)](https://www.nuget.org/packages/Healthie.NET.Redis) + +**▶ [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)**. + Redis state provider for [Healthie.NET](https://github.com/ivanvyd/Healthie.NET). State is written on **every tick of every checker**. A relational provider does a round trip to a disk-backed engine for each of those; this does one to memory. That is the whole reason to pick it. diff --git a/src/Healthie.StateProviding.Relational/README.md b/src/Healthie.StateProviding.Relational/README.md index 1d0099f..ab3c081 100644 --- a/src/Healthie.StateProviding.Relational/README.md +++ b/src/Healthie.StateProviding.Relational/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Relational.svg)](https://www.nuget.org/packages/Healthie.NET.Relational) -**▶ [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)**. Relational `IStateProvider` implementation for Healthie.NET. Persists pulse checker state to any database with an ADO.NET driver — bring your own, or install one of the ready-made wrappers. diff --git a/src/Healthie.StateProviding.SqlServer/README.md b/src/Healthie.StateProviding.SqlServer/README.md index 138385f..fdb3cf2 100644 --- a/src/Healthie.StateProviding.SqlServer/README.md +++ b/src/Healthie.StateProviding.SqlServer/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.SqlServer.svg)](https://www.nuget.org/packages/Healthie.NET.SqlServer) -**▶ [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)**. SQL Server `IStateProvider` implementation for Healthie.NET. Persists pulse checker state to SQL Server or Azure SQL for durable storage across application restarts and across the replicas of a scaled-out deployment. diff --git a/src/Healthie.StateProviding.Sqlite/README.md b/src/Healthie.StateProviding.Sqlite/README.md index 45cb4b4..6831fa9 100644 --- a/src/Healthie.StateProviding.Sqlite/README.md +++ b/src/Healthie.StateProviding.Sqlite/README.md @@ -4,7 +4,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Sqlite.svg)](https://www.nuget.org/packages/Healthie.NET.Sqlite) -**▶ [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)**. SQLite `IStateProvider` implementation for Healthie.NET. Durable pulse checker state that survives a restart, with no server to stand up. diff --git a/src/Healthie.Uptime/README.md b/src/Healthie.Uptime/README.md index 6fcc14d..ee18da3 100644 --- a/src/Healthie.Uptime/README.md +++ b/src/Healthie.Uptime/README.md @@ -15,7 +15,7 @@ [![NuGet](https://img.shields.io/nuget/v/Healthie.NET.Uptime.svg)](https://www.nuget.org/packages/Healthie.NET.Uptime) -**▶ [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)**. Answers "what was our uptime last quarter" — which the rolling history cannot, because it holds the last hundred results and for a one-second checker that is the last hundred seconds.