<!-- source: openspec/current/home/entities.md -->

---
title: Home — Entities
status: stable
owner: pavel
audience: [pavel, ai, engineer]
tldr: Local data entities for the homepage — work card MDX, lab post MDX, and network person frontmatter contracts.
---
# Home — entities

> Local data entities referenced by the homepage. Full field contracts live in each block's **§ Content contract** table in `blocks.md`. Canonical-tier entities (shared across capabilities) are cross-referenced to `openspec/current/entities/` when that tier file exists.

---

## Work card (MDX frontmatter)

Defined in `content/work/*.mdx`. Filtered to `status: in-progress` for the **Now building** block.

| Field | Required | Type | Notes |
|---|---|---|---|
| `title` | yes | string | Public title. Hidden when `stealth: true`. |
| `client` | yes | string | Client name. Hidden when `stealth: true`. |
| `year` | yes | number | Used for sort order (desc). |
| `status` | yes | enum | `in-progress` includes the card on the homepage; other values exclude it. |
| `summary` | yes | string | One-sentence outcome or current state. ≤24 words. |
| `team[]` | yes | array | Roles + names. Surfaced on `/work/[slug]`, not on the homepage card. |
| `stealth` | no | bool | Defaults `false`. When `true`, masks `title` and `client`. |

Full block contract: `blocks.md § Now building § Content contract`.

---

## Lab post (MDX frontmatter)

Defined in `content/lab/*.mdx`. Sorted by `publishedAt` desc, first 3 rendered in **Lab preview**.

| Field | Required | Type | Notes |
|---|---|---|---|
| `title` | yes | string | Post title. |
| `slug` | yes | string | URL slug. |
| `excerpt` | yes | string | One-sentence preview. ≤30 words. |
| `readTime` | yes | string | Computed at build time. e.g., "8 min read". |
| `publishedAt` | yes | ISO date | Used for sort order. |
| `topic` | yes | enum | Used for `/lab` filter chips. Not surfaced on homepage card. |

Full block contract: `blocks.md § Lab preview § Content contract`.

---

## Network person (network.json entry)

Defined in `content/network.json`. Filtered to `optInPublic: true`, sorted by `joinedYear` desc, first 6 rendered in **The network** preview.

| Field | Required | Type | Notes |
|---|---|---|---|
| `name` | yes | string | Display name. |
| `role` | yes | string | One short phrase. ≤6 words. |
| `location` | yes | string | City. ≤2 words. |
| `photo` | yes | string | Path to portrait. 1:1 aspect. |
| `links.personal` | no | string | Personal site URL. |
| `joinedYear` | yes | number | Used for sort order. |
| `optInPublic` | yes | bool | Filter key. Only `true` entries render on the public site. |
| `disciplines[]` | no | array | Powers `/network` filter chips; not surfaced on homepage. |

Full block contract: `blocks.md § The network § Content contract`.
