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
48 changes: 48 additions & 0 deletions intent/2026-10-14-michael-home-top.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Intent: new home page top (hero and consumer how-it-works)

Author: Claude (working with Michael)
Date: 2026-10-14
Status: draft (accepted when Danny merges the PR that adds it)
Product: zzThis (`Zero-State-LLC/zzthis`)

## Problem / why now

First-time visitors, mostly on mobile, were not grasping what zzThis is from the current hero. Michael wants them to get it within the first screen and one swipe. [verified: Michael, 2026-10-14]

## Proposed outcome

Hero, in order [MICHAEL 2026-10-14]:

- Eyebrow: "The next evolution of the barcode".
- Headline: "A barcode/QR code you can write by hand".
- Sub-headline: the barcode/QR comparison with `zz-Kathy-found-dog-zz` set in mono and accent orange.
- The two hero buttons stay, right under the sub-headline, now with How it works first (primary) and See field logistics second [MICHAEL 2026-10-15, at Danny's request].
- Two photos: the Kathy cork-board polaroid and the phone showing "Record found" (new assets under `public/images/hero/`).
- Hero body: the roadmap caveats (typed-only prototype, camera in v1, voice later) are removed; the paragraph now ends "zzThis makes things readable-writable-smart."

New section right under the hero: "How it works - consumer" [MICHAEL 2026-10-14]:

- Eyebrow "Physical-to-digital addressing"; headline "Skip the printer. Grab a marker." (Michael wrote "Ditch the printer" and asked for a less casual verb; swap back if preferred).
- His protocol sub-headline, the lead line, and the three steps (Create it / Write it / Look it up). No button in this block [MICHAEL 2026-10-15].

The home "How it works" section heading becomes "How it works - field" to distinguish the two. The rest of the page is unchanged, same sequence.

## Constraints and flags for Danny

- The hero no longer states that the prototype is typed-lookup only; the sub-headline and steps say "scan". Michael chose to move caveats off the top of the page. If a Status/Roadmap note is still wanted lower on the page, that is a follow-up.
- "highly secure" in the consumer sub-headline is Michael's wording.
- No em dash; spaced hyphens used. Copy lives in `src/content/hero.ts`.

## Affected users / systems

`src/content/hero.ts`, `src/content/workflows.ts`, `src/pages/index.astro`, `src/styles/b-base.css`, `public/images/hero/` (2 images), `tests/content.test.ts`, `tests/hero.test.ts` (new, for the max-lines rule).

## Claims

| Claim | Label |
|---|---|
| All headline, sub-headline, step and body wording is Michael's, as given or minimally cleaned | `[verified: Michael's doc, 2026-10-14]` |

## Next

Danny reviews and merges. Merging the PR that adds this file accepts it.
Binary file added public/images/hero/kathy-corkboard.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/hero/kathy-phone-record.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
74 changes: 64 additions & 10 deletions src/content/hero.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
// [MICHAEL 2026-10-14] Home top restructured: eyebrow, new headline, the
// barcode/QR comparison sub-headline with the Kathy code, two photos, the
// two hero buttons (How it works first), and the roadmap caveats removed from the hero body.
export interface HeroAction {
label: string;
path: string;
variant: "primary" | "secondary";
}

export interface HeroPhoto {
src: string;
width: number;
height: number;
alt: string;
}

export interface HeroContent {
eyebrow: string;
title: string;
subline: string;
subline: { before: string; code: string; after: string };
paragraph: { before: string; code: string; after: string };
imageCaption: string;
photos: readonly HeroPhoto[];
actions: readonly HeroAction[];
imageCaption: string;
}

export interface TextBlock {
Expand All @@ -22,25 +34,67 @@ export interface LinkBlock extends TextBlock {
}

export const hero: HeroContent = {
// Q62 [DANNY 2026-10-03, revised]: v1.0 headline, spaced hyphen, no em dash.
title:
"Barcodes made things scannable. zzThis makes things readable-writable - and smart.",
subline: "Write a code on a thing; type it to find its record.",
eyebrow: "The next evolution of the barcode",
title: "A barcode/QR code you can write by hand",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Update the accepted spec before replacing the hero contract

The accepted marketing spec still requires the previous H1 character-for-character and defines the existing Home sequence (specs/001-marketing-site/spec.md:31-33), while this commit adds only an intent marked Status: draft and immediately changes both implementation and regression tests. Landing this leaves the tested product contract contradicting the authoritative spec; promote and update the spec through the required intent/spec sequence before replacing the H1, or retain the specified copy.

AGENTS.md reference: AGENTS.md:L10-L15

Useful? React with 👍 / 👎.

subline: {
before:
"Barcodes use bars. QR codes use dots. zzThis uses everyday words. Just wrap your words in double z’s - like ",
code: "zz-Kathy-found-dog-zz",
after:
" - write it on anything with a marker, and scan it to open its digital record. The “zz” ends tell our scanner exactly where to look, just like the three corner dots on a QR code.",
Comment on lines +43 to +44

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep scanner claims qualified until capture ships

For every visitor to the new home page, this now says they can “scan it to open” a record and refers to “our scanner,” although the canonical capability boundary says typed lookup is the only implemented path and on-device recognition is not built (docs/SPEC.md:59). This presents planned functionality as currently usable; retain an explicit future/prototype qualification until the camera reader actually ships.

AGENTS.md reference: AGENTS.md:L32-L37

Useful? React with 👍 / 👎.

},
paragraph: {
before:
"zzThis is a human-readable, human-writable code for the physical world. Write a ",
code: "zz-code",
after:
" on tape, a crate, a parcel, an envelope, or a sign, or embed it in text or program code. The prototype supports typed lookup to a digital record. On-device camera recognition is planned for v1 but is not implemented in this build. Voice recognition is planned for a future release, not v1.",
" on tape, a crate, a parcel, an envelope, or a sign, or embed it in text or program code. zzThis makes things readable-writable-smart.",
},
imageCaption: "Word code on blue tape beside an obscured barcode.",
photos: [
{
src: "images/hero/kathy-corkboard.webp",
width: 509,
height: 492,
alt: "A polaroid pinned to a cork board: a plush corgi wearing a zz tag, captioned zz-Kathy-found-dog-zz.",
},
{
src: "images/hero/kathy-phone-record.webp",
width: 594,
height: 570,
alt: "A hand holds a phone scanning the plush corgi; the screen reads zz-Kathy-found-dog-zz, Record found, and the record link.",
},
],
// [MICHAEL 2026-10-15] Buttons restored at Danny's request, How it works first.
actions: [
{ label: "How it works", path: "#how-it-works", variant: "primary" },
{
label: "See field logistics",
path: "#field-logistics",
variant: "primary",
variant: "secondary",
},
],
imageCaption: "Word code on blue tape beside an obscured barcode.",
};

// [MICHAEL 2026-10-14] "How it works - consumer" block, right under the hero.
export const consumerHow = {
eyebrow: "Physical-to-digital addressing",
heading: "Skip the printer. Grab a marker.",
text: "zzThis is a structurally constrained, human-readable tagging protocol. By bounding ordinary words with a “zz” prefix and suffix, we turn handwriting into a highly secure, scannable data link, from austere environments and logistics to everyday tracking.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove the unvalidated security claim

Calling the link “highly secure” is unsupported: the accepted product spec explicitly says the codebook is unvalidated and recognition and resolver security are untested (docs/SPEC.md:63, docs/SPEC.md:77-79). Bounding ordinary words with zz only frames the identifier and does not establish security, so this prominent consumer copy makes a claim the repository has no evidence for; remove it or replace it with qualified, validated wording.

AGENTS.md reference: AGENTS.md:L32-L37

Useful? React with 👍 / 👎.

lead: "zzThis protocol words connect things to their online information.",
steps: [
{
title: "Create it.",
text: "Choose or create your words and link them to information.",
},
{
title: "Write it.",
text: "Put the zz-code on your item or sign.",
},
{
title: "Look it up.",
text: "Scan the words to open the linked information.",
},
{ label: "How it works", path: "#how-it-works", variant: "secondary" },
],
};

Expand Down
3 changes: 2 additions & 1 deletion src/content/workflows.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ export interface TitledImage {
}

export const coreIdentity = {
heading: "How it works",
// [MICHAEL 2026-10-14] "- field" distinguishes this from the consumer block.
heading: "How it works - field",
intro:
"Core identity: MARK a lowercase zz code → READ it by manual entry today; on-device camera recognition is planned for v1 → LINK it to a record → REPORT it in a voice handoff to another person if useful.",
steps: [
Expand Down
52 changes: 36 additions & 16 deletions src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,27 @@ import Pipeline from "../components/Pipeline.astro";
import ComparisonCards from "../components/ComparisonCards.astro";
import { comparisonHeading } from "../content/comparison";
import Tour from "../components/Tour.astro";
import { aboutTeaser, contactAction, hero } from "../content/hero";
import { aboutTeaser, consumerHow, contactAction, hero } from "../content/hero";
import { contactEmail } from "../content/navigation";
import { url } from "../lib/url";
import BaseLayout from "../layouts/BaseLayout.astro";

const splitAt = hero.title.indexOf(". ");
const setup = hero.title.slice(0, splitAt + 1);
const claim = hero.title.slice(splitAt + 2);
const phrase = "readable-writable";
const phraseAt = claim.indexOf(phrase);
const claimBefore = claim.slice(0, phraseAt);
const claimAfter = claim.slice(phraseAt + phrase.length);
const description =
hero.subline.before + hero.subline.code + hero.subline.after;
---

<BaseLayout title="zzThis" description={hero.subline} home>
<BaseLayout title="zzThis" description={description} home>
<section class="hero" id="top" aria-labelledby="hero-title">
<div class="hero__copy">
<p class="eyebrow">{hero.eyebrow}</p>
<h1 class="hero__title" id="hero-title">
<span class="hero__setup">{setup}</span>{" "}
<span class="hero__claim">
{claimBefore}
<span class="nowrap">{phrase}</span>
{claimAfter}
</span>
<span class="hero__claim">{hero.title}</span>
</h1>
<p class="hero__sub">{hero.subline}</p>
<p class="hero__sub">
{hero.subline.before}
<code class="hero__code">{hero.subline.code}</code>
{hero.subline.after}
</p>
<div class="hero__actions">
{hero.actions.map((action) => (
<a
Expand All @@ -45,6 +40,18 @@ const claimAfter = claim.slice(phraseAt + phrase.length);
</a>
))}
</div>
<div class="hero__photos">
{hero.photos.map((photo) => (
<img
Comment on lines +43 to +45

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Label the new hero gallery as concept artwork

These images are rendered without any visible status label even though the Kathy found-dog set is classified as concept imagery (docs/SPEC.md:66,83) and the marketing requirements mandate one label above every grouped concept gallery (specs/001-marketing-site/spec.md:73). Because the phone image depicts a successful scan and “Record found” while recognition is not implemented, omitting the label makes the mock workflow appear real; add the required grouped-gallery concept label.

AGENTS.md reference: AGENTS.md:L10-L15

Useful? React with 👍 / 👎.

src={url(photo.src)}
width={photo.width}
height={photo.height}
alt={photo.alt}
loading="eager"
decoding="async"
/>
))}
</div>
<p class="hero__body">
{hero.paragraph.before}
<code>{hero.paragraph.code}</code>
Expand All @@ -53,6 +60,19 @@ const claimAfter = claim.slice(phraseAt + phrase.length);
</div>
<Console />
</section>
<section class="consumer" aria-labelledby="consumer-title">
<p class="eyebrow">{consumerHow.eyebrow}</p>
<h2 id="consumer-title">{consumerHow.heading}</h2>
<p class="consumer__text">{consumerHow.text}</p>
<p class="consumer__lead">{consumerHow.lead}</p>
<ol class="consumer__steps">
{consumerHow.steps.map((step) => (
<li>
<strong>{step.title}</strong> {step.text}
</li>
))}
</ol>
</section>
<Anatomy />
<section class="compare" aria-labelledby="compare-title">
<h2 id="compare-title">{comparisonHeading}</h2>
Expand Down
43 changes: 43 additions & 0 deletions src/styles/b-base.css
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,49 @@ kbd {
gap: var(--space-xs);
}

.hero__code {
font-family: var(--font-mono);
font-weight: 600;
color: var(--color-accent-ink);
overflow-wrap: anywhere;
}

.hero__photos {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-xs);
}

.hero__photos img {
width: 100%;
height: auto;
border: var(--rule-hair) solid var(--color-rule-strong);
}

.consumer {
display: grid;
gap: var(--space-sm);
justify-items: start;
}

.consumer__text,
.consumer__lead {
max-width: 62ch;
color: var(--color-ink-2);
}

.consumer__lead {
font-weight: 600;
}

.consumer__steps {
display: grid;
gap: var(--space-2xs);
margin: 0;
padding-inline-start: 1.25em;
color: var(--color-ink-2);
}

.hero__body {
font-size: var(--text-sm);
color: var(--color-ink-2);
Expand Down
30 changes: 0 additions & 30 deletions tests/content.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import * as workflowsModule from "../src/content/workflows";
const { applications, applicationsPage } = applicationsModule;
const { comparisonColumns, comparisonNote, comparisonRows } = comparisonModule;
const { whyMarkers } = anatomyModule;
const { featured, hero } = heroModule;
const { footerItems, footerNotice, zzthisSocial, zzthatSocial } =
navigationModule;
const { advisors, founder, founderOrigin } = peopleModule;
Expand Down Expand Up @@ -66,35 +65,6 @@ const allStrings = modules.flatMap(collectStrings);
const story = (id: string): string | undefined =>
applications.find((entry) => entry.id === id)?.story;

describe("hero and featured statement (spec 3.2)", () => {
it("matches the hero copy", () => {
expect(hero.title).toBe(
"Barcodes made things scannable. zzThis makes things readable-writable - and smart.",
);
expect(hero.subline).toBe(
"Write a code on a thing; type it to find its record.",
);
const { before, code, after } = hero.paragraph;
expect(before + code + after).toBe(
"zzThis is a human-readable, human-writable code for the physical world. Write a zz-code on tape, a crate, a parcel, an envelope, or a sign, or embed it in text or program code. The prototype supports typed lookup to a digital record. On-device camera recognition is planned for v1 but is not implemented in this build. Voice recognition is planned for a future release, not v1.",
);
expect(code).toBe("zz-code");
expect(hero.actions.map((action) => action.label)).toEqual([
"See field logistics",
"How it works",
]);
});

it("matches the featured statement", () => {
expect(featured.heading).toBe(
"The shortest, smartest distance between a physical thing, its digital record, and the work that comes next.",
);
expect(featured.text).toBe(
"A zz code gives people a way to create the mark themselves, wherever the work happens. Future AI-assisted workflows could help identify what a camera sees, count what remains, suggest how an item should be handled, and prepare the next task; those capabilities are explorations, not shipped v1 behavior. The same visible code connects the item, its history, and the people responsible for it. It bridges physical things and their digital control. AI may serve as an interface and connector, not as the authority that defines or resolves a zz code.",
);
});
});

describe("demo prototype decisions", () => {
it("keeps zzthing.com in the demo pending the October 31 review", () => {
expect(demoPrototypeLinks.map((link) => link.name)).toEqual([
Expand Down
51 changes: 51 additions & 0 deletions tests/hero.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { describe, expect, it } from "vitest";
import { consumerHow, featured, hero } from "../src/content/hero";

// Moved from content.test.ts for the max-lines rule.
describe("hero and featured statement (spec 3.2, home top 2026-10-14)", () => {
it("matches the hero copy", () => {
// [MICHAEL 2026-10-14] New home top: eyebrow, headline, the barcode/QR
// comparison sub-headline, two photos, no hero buttons, and the roadmap
// caveats removed from the hero body.
expect(hero.eyebrow).toBe("The next evolution of the barcode");
expect(hero.title).toBe("A barcode/QR code you can write by hand");
const sub = hero.subline;
expect(sub.code).toBe("zz-Kathy-found-dog-zz");
expect(sub.before + sub.code + sub.after).toBe(
"Barcodes use bars. QR codes use dots. zzThis uses everyday words. Just wrap your words in double z’s - like zz-Kathy-found-dog-zz - write it on anything with a marker, and scan it to open its digital record. The “zz” ends tell our scanner exactly where to look, just like the three corner dots on a QR code.",
);
const { before, code, after } = hero.paragraph;
expect(before + code + after).toBe(
"zzThis is a human-readable, human-writable code for the physical world. Write a zz-code on tape, a crate, a parcel, an envelope, or a sign, or embed it in text or program code. zzThis makes things readable-writable-smart.",
);
expect(code).toBe("zz-code");
expect(hero.photos.map((photo) => photo.src)).toEqual([
"images/hero/kathy-corkboard.webp",
"images/hero/kathy-phone-record.webp",
]);
// [MICHAEL 2026-10-15] Buttons restored, How it works first.
expect(hero.actions.map((action) => action.label)).toEqual([
"How it works",
"See field logistics",
]);
});

it("matches the consumer how-it-works block", () => {
expect(consumerHow.eyebrow).toBe("Physical-to-digital addressing");
expect(consumerHow.heading).toBe("Skip the printer. Grab a marker.");
expect(consumerHow.steps.map((step) => step.title)).toEqual([
"Create it.",
"Write it.",
"Look it up.",
]);
});

it("matches the featured statement", () => {
expect(featured.heading).toBe(
"The shortest, smartest distance between a physical thing, its digital record, and the work that comes next.",
);
expect(featured.text).toBe(
"A zz code gives people a way to create the mark themselves, wherever the work happens. Future AI-assisted workflows could help identify what a camera sees, count what remains, suggest how an item should be handled, and prepare the next task; those capabilities are explorations, not shipped v1 behavior. The same visible code connects the item, its history, and the people responsible for it. It bridges physical things and their digital control. AI may serve as an interface and connector, not as the authority that defines or resolves a zz code.",
);
});
});
Loading