ADR 0012: Official Duckbill visual brand package

Context

MAIL-194 put the product name Duckbill on the site. Chrome still used an unofficial parchment palette and typed wordmark. The owner supplied an implementation-ready brand package: mascot, wordmark, glyphs, favicon/PWA sizes, social assets, and CSS/JSON tokens.

Decision

Check the brand package into brand/ as the visual source of truth. Next.js chrome imports brand/tokens/duckbill.css, serves packaged marks from apps/web/public/, and uses Nunito Sans plus Inter. GitHub, Jira, and Vercel use the same marks where those products allow it.

Do not regenerate isolated brand assets and treat them as canonical. Do not invent a second palette. Do not invent a second stylized wordmark.

Header and product-home chrome originally used the official mascot icon plus typed Duckbill with a small superscript ™ so the square lockup would not be scaled into the header. ADR 0014 supersedes that header rule: the owner-supplied lockup with a baked-in ™ is the site logo. The packaged 1200×630 social card stays the Open Graph image. Both hosts link back to jasonkoch.io.

Alternatives

Consequences

duckbill.jasonkoch.io and duckbill-dev.jasonkoch.io use teal/navy chrome, a readable Duckbill header with a small ™, a product hero on /, favicon, the packaged 1200×630 social card, and a jasonkoch.io backlink. /docs is a documentation landing and does not mention Jira; the catalog is the left nav. ia-* class names stay until MAIL-193. Specification titles stay Inbox Agent until MAIL-193. The retired mail.jasonkoch.io hosts are not kept as aliases.

Service surfaces that accept brand settings without a public upload API are applied where possible and recorded on MAIL-199. GitHub description, homepage, and topics are Duckbill. The repo social preview and Jira project avatar require a signed-in settings upload. Vercel shows the site favicon and OG card after deploy; the project slug stays inbox-agent-docs until MAIL-193.

See Duckbill brand guide.