product.md Draft 0.9
An open standard

AGENTS.md tells your agents how to work. PRODUCT.md tells them what they're building.

One Markdown file that says who your product is for, how it speaks, and what it costs. Read by humans, coding agents, and buying agents. If you use impeccable, yours already exists.

npx productmd init Read the spec ↓
PRODUCT.md coldframe.app
# Coldframe

Climate automation for small-farm greenhouses.
One controller, every vent.

## Register

product

## Users

Market growers running 1 to 6 hoop houses, checking
conditions from a phone in the field with dirty gloves
on. They know growing, not HVAC.

## Offer

Coldframe Grower is $29/month per greenhouse. The
forecast API is metered, hard-capped at $50/month.

```json product.md#pricing
{ "model": "metered", "hardCeiling": 50, "price": 29 }
```
Three readers

Your repo has three readers now. Only one had no file.

The engineer reads the README. The coding agent reads AGENTS.md, shipped to 60,000+ repositories. The third reader is new: a buying agent that arrives at your domain with a job and a budget, and finds nothing written for it. It guesses your audience from your hero copy and your price from a screenshot.

PRODUCT.md is the file for all three. One grammar, two bindings:

Build time

./PRODUCT.md

At the repo root, next to AGENTS.md. Cursor, Claude Code, Codex, and Gemini CLI read it as design and audience context. impeccable has required this file since v1: 64,000 installs a week already write it.

Sell time

https://yourdomain/product.md

The same bytes, published. A buying agent fetches the file, validates the pricing block, and negotiates a typed offer instead of a guessed one. Deploying the product publishes its definition.

The file, annotated

Sixty lines. Every section earns its place.

A complete, conformant example. Headings are the schema: no required fields, no YAML gymnastics, prose first.

---
$id: https://coldframe.app/product.md
$type: Product
$context: https://schema.org.ai
productmd: 1
register: product
---
Layer 2 · optional MDXLD frontmatter. $type: Product resolves to schema.org/Product, so the file is valid linked data. Delete this whole block and the file still conforms.
# Coldframe

Climate automation for small-farm greenhouses. One controller, every vent.
Layer 0 Any CommonMark with an H1 parses. The name, then the one-line answer to "what is this".
## Register

product
The mode bit brand means design is the product. product means design serves it. Every conformant tool forks its posture on this one token.
## Users

Market growers running 1 to 6 hoop houses, checking conditions from a
phone in the field with dirty gloves on. They know growing, not HVAC.
Their job to be done: never lose a crop to a stuck vent again.
Users Written so a buyer recognizes themselves in one read, before any persona work begins.
## Brand Personality

Calm, weatherproof, exact. The voice of a neighbor who farms and codes.

### Tone

Plain sentences. Celsius and Fahrenheit always paired. Alarms are
rare and real; when one fires, it says what to do.
Taste fields Personality and tone steer every downstream renderer and generator. Two products with different taste fields must not produce the same site.
## Anti-references

- Generated output MUST NOT use dashboard-grid "mission control" layouts.
- MUST NOT default to dark mode: this app is read in full sunlight.
- No IoT clip art, no "smart farming revolution" copy.
Normative prose MUST NOT inside a section is machine-extractable: generators are bound by the sentence, not merely informed by it.
## Offer

Coldframe Grower is $29/month per greenhouse. The forecast API is
metered, hard-capped at $50/month.

```json product.md#pricing
{ "model": "metered", "hardCeiling": 50, "unit": "usd-per-month", "price": 29 }
```
Machine island A fenced block with a spec-qualified info string: typed data inside free prose. This exact JSON is what an agent-commerce 402 offer quotes.
## Boundaries

- Not a hydroponics controller. Soil growers only, v3 at the earliest.
- Not a marketplace; we never sell growers' yield data.

## Stack

- agents.md: build conventions
- design.md: tokens
- auth.md: agent access
The stack What the product is not, then the sibling files. One fact lives in one file: PRODUCT.md links out, never duplicates.
The specification

The whole spec fits on this page.

Draft 0.9. MUST, SHOULD, and MAY are RFC 2119. Everything else is plain English.

1 · Layers

Layer 0. Any CommonMark document with exactly one H1 is a valid PRODUCT.md. There are zero required fields. Layer 1. Canonical sections, identified by heading. Tools MUST match headings through the alias table below. Layer 2. Optional MDXLD frontmatter ($id, $type, $context) making the file valid linked data. $type: Product resolves to schema.org/Product.

2 · Canonical sections

The primary aliases are the headings impeccable has written since v1. If you have a PRODUCT.md today, it conforms today, unmodified.

SectionAnswers
Registerbrand or product. The one-token mode bit.
UsersWho this is for, in language they'd recognize.
ProblemWhat breaks without it, concretely.
Product PurposeWhat it does and how success is measured.
Brand Personality / ToneHow it speaks. Themes and generators read this.
Anti-referencesWhat it must never resemble. Normative.
Design PrinciplesThe strategic design rules, numbered.
Accessibility & InclusionThe floor, stated as requirements.
OfferWhat it costs, in prose plus a pricing island.
BoundariesWhat the product is not.
StackLinks to agents.md, design.md, auth.md. Never duplicates them.

3 · Machine islands

A fenced code block whose info string is spec-qualified, like json product.md#pricing, is a machine island: normative typed data inside free prose. Islands MUST be valid in their declared format. The pricing island is the document a commerce protocol quotes when an agent asks the price.

4 · Preservation

Tools that rewrite a PRODUCT.md MUST preserve frontmatter, islands, and sections they do not understand, verbatim. The file's git history is the product's identity changelog; rewriters don't get to erase it.

5 · Register precedence

The ## Register heading is canonical. Frontmatter register: MAY mirror it and MUST NOT disagree with it. Checkers flag divergence.

6 · Conformance

  1. Level 1 Parses

    CommonMark, one H1. Machine-checkable.

  2. Level 2 Canonical

    Register, Users, and Purpose present via the alias table; all islands valid. Machine-checkable, verifiable from outside.

  3. Level 3 Impeccable

    The taste tier: sections that pass professional review, not just a parser. Judgment-bearing, evaluated rather than linted. Named for the tool that defined it.

Get the file

Three ways in. Five minutes each.

Sponsors

Written down by the people already shipping it.

Files on the open web: the counter goes live with v1.0.