Skip to content

feat(website): retire the last stale positioning from the brand assets - #1051

Merged
blove merged 4 commits into
mainfrom
blove/brand-assets-refresh
Sep 7, 2026
Merged

feat(website): retire the last stale positioning from the brand assets#1051
blove merged 4 commits into
mainfrom
blove/brand-assets-refresh

Conversation

@blove

@blove blove commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Two surfaces were still asserting taglines we had already replaced, because neither is generated from positioning.ts.

  • The README banner said Production-ready agent UI, on a navy-and-periwinkle palette the site has never used. It is redrawn to match the social card from feat(website): the social card shows the product, and the brand gets a real mark #1047: tinted ground, rail rule, mono eyebrow in accent navy, serif wordmark with the paper plane, and the current tagline. Generic font stacks, because GitHub serves it as a bare image with no stylesheet of ours.
  • The overview whitepaper cover said Agent UI for Angular under the eyebrow Threadplane · Enterprise Angular Agent UI. Fixed at both ends: the generator config's eyebrow so a future regeneration is right, and the rendered HTML and PDF so today's download is. The refresh script grew a retired-copy pass, since regenerating properly means paying for LLM chapter prose nobody wanted to change.

The three guide covers are deliberately untouched. "The Enterprise Guide to Generative UI in Angular" is the name of a document, not a claim about what the product is.

The guard

A new brand-assets.spec.ts scans every artifact that states positioning but is not generated from positioning.ts — the banner, the cover, the generator config, and the eight READMEs — against a RETIRED_POSITIONING list on the public-copy contract. That list is where a phrase goes in the same change that retires it.

Both halves are mutation-tested: reintroducing a retired tagline into the banner fails the suite, and the list is asserted non-trivial so an empty list cannot pass every file silently.

Verification

  • vitest run --root apps/website on top of main: 1353 passed.
  • The regenerated overview PDF cover was rendered and read back: it now says THREADPLANE · OPEN SOURCE · ANGULAR.
  • The three other PDFs were reverted after the refresh run. Their HTML did not change and re-rendering only produced byte churn.

🤖 Generated with Claude Code

blove and others added 3 commits September 7, 2026 13:17
One card kit on the site's own light surface, showing the approval beat
inside the site's browser frame. Records two constraints found while
prototyping: Satori kills the render worker on WebP, so card art must be
generated PNG; and Inter and the mono face are fetched from Google Fonts on
every render, so they should be bundled like Garamond already is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…a real mark

The card was dark, centred, and built from a seam and a glow that exist
nowhere else, so the light page it opened looked like a different product.
It now renders on the site's own ground through a shared kit: the rail rule
and mono eyebrow, the BrowserFrame with its traffic lights, the pills, the
wordmark. Inside the frame, three beats drawn rather than screenshotted —
an ask, a proposal, and an Approve/Decline pair — so the card shows the
human-in-the-loop claim the copy makes.

The blog card moves onto the same kit, which retires the near-black blue it
alone used.

The airplane emoji is replaced by a drawn paper plane, shared by the nav and
footer wordmark, the card, src/app/icon.svg as the favicon, a regenerated
favicon.ico, and a square logo that finally lets the Organization structured
data assert a logo.

Two constraints found while prototyping and recorded in the spec: Satori kills
the render worker on WebP, which rules out every screenshot we own; and Inter
and the mono face were fetched from Google Fonts on every render, failing
silently when unreachable. All four faces are now bundled, instanced and
subset by scripts/build-card-fonts.py, and together are smaller than the one
unsubsetted Garamond they replace.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The README banner and the overview whitepaper cover were the two surfaces
still asserting taglines we had replaced: "Production-ready agent UI" on a
navy-and-periwinkle banner in a palette the site never used, and "Agent UI
for Angular" under the eyebrow "Threadplane · Enterprise Angular Agent UI".

The banner is redrawn to match the social card — tinted ground, rail rule,
mono eyebrow in accent navy, serif wordmark with the paper plane — using
generic font stacks, because GitHub serves it as a bare image with no
stylesheet of ours.

The cover is fixed at both ends: the generator config's eyebrow, so a future
regeneration is right, and the rendered artifact, so today's PDF is. The
refresh script grew a retired-copy pass to do it, since regenerating properly
means paying for LLM chapter prose nobody wanted to change.

A new spec scans every artifact that states positioning but is not generated
from positioning.ts — the banner, the cover, the generator, and the eight
READMEs — against a list of retired phrases. Both the list and the scan are
mutation-tested.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
threadplane Ready Ready Preview Sep 7, 2026 9:03pm UTC

Request Review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Automated approval: this PR received an intelligent (AI) code review. See the review comments on this PR.

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@blove
blove changed the base branch from blove/social-card-kit to main September 7, 2026 20:50
@blove
blove enabled auto-merge (squash) September 7, 2026 20:51
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Claude finished @blove's task in 0s —— View job


I'll analyze this and get back to you.

@blove
blove merged commit 9de5c5d into main Sep 7, 2026
32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant