---
title: "HealthCategory"
description: "What a reading is ABOUT."
url: "https://opsinjs.pensievelabs.org/reference/api/HealthCategory"
source: "https://opsinjs.pensievelabs.org/reference/api/HealthCategory.md"
section: "Reference"
kind: "reference"
reviewed: "2026-09-02"
reviewer: "engineering"
aliases: ["category type", "category union"]
---

> Elements written as `<PascalCase … />` below are opsinjs documentation
> components. Their attributes are the content: the values they render are
> generated from `tokens/*.json` and `registry/catalogue.ts` and are
> published separately at https://opsinjs.pensievelabs.org/r/index.json and under the Reference
> section.
> Nothing is missing from this page. The data simply does not live in
> the prose.

<PageTemplate kind="reference" />

`HealthCategory` is the type of the identity axis: the subject a value belongs
to, so that a screen full of unrelated numbers can be scanned. It carries no
urgency, no valence and no judgement. A category colour tells a reader which of
their things they are looking at; it must never tell them how to feel about it.

## How this is generated [#how-this-is-generated]

**Source:** the published declaration of the `@opsinjs/react` package.
&#x2A;*Script:** `scripts/build-reference.mts`. &#x2A;*Command:** `pnpm run generate`.

The package does not exist yet. The block below is a **specification** and is
marked as one; the member list in particular is expected to change, because the
category set is the part of the system a consuming product is most likely to need
extended, and
[Category palettes](../../theming/category-palettes.mdx) describes the supported
way to do that without contaminating the status axis.

```ts
/**
 * SPECIFICATION. Not implemented, not published.
 * Subject-identity categories, defined in health/category-identity.
 * Extensible by a consuming theme; the status axis is not.
 */
export type HealthCategory = string & { readonly __brand?: "HealthCategory" }
```

The specification deliberately does not freeze the member list here. What the
system freezes is the *rule*: a category is identity only, categories are
extensible, and no component accepts a category and a status in the same visual
slot. The current members ship in `tokens/color.json` and are listed, generated,
in [Tokens](../generated/tokens.mdx); the meaning of each is
[Category identity](../../health/category-identity.mdx).

{/* opsinjs:generated:begin - everything below is replaced by scripts/build-reference.mts */}

## HealthCategory [#healthcategory]

What a reading is ABOUT. Identity, never verdict.

A heart-red card does not mean something is wrong with a heart reading; it means the reading concerns the heart. This is the axis products most often misuse, because red already means something else everywhere else on the web.

| Kind | Declared in     |
| ---- | --------------- |
| type | `lib/status.ts` |

```ts
export type HealthCategory = (typeof HEALTH_CATEGORIES)[number]
```

{/* opsinjs:generated:end */}
