One card. Black on cream, white on black, red only as a signal. Every Bags headline that lives in a meta tag — news, announcements, press releases, API docs — is written and set the same way. This page is the rulebook, and it is built from the rules.
A headline is a poster. It will be screenshotted, cropped, and reposted without its deck, so it must be true on its own: one idea, under sixty characters, the number as the hero, a verb the reader can do. The date lives in the kicker, the facts live in the deck, the source lives under the deck, and anything after NOW says, out loud, that it is fiction until it is a receipt.
The system has two inks (ink and paper), one signal (red), two typefaces (Archivo Black for display, Inter for everything else), square corners, and a rule hierarchy from a 1px hairline to an 8px poster bar. Nothing else is allowed, which is why it looks like one thing.
The <title>, og:title, twitter:title and the on-page H1 or poster-card headline. Same line of copy, written once under the doctrine, placed four times. The og:image is that same headline rendered as the card.
News (The Bags Holdings, weekly briefs) · Announcements (ships, partner notes, changelog on ship day) · Press releases · API docs (docs.bags.fm reference pages, endpoint groups, guides, changelogs, README headlines) · every og:image for the above.
In-app UI (bags.fm web, mobile, Bubl, Cashback, TG mini-app) — those keep their product design systems. Charts, dashboards and live stat pages (/stats, /pnl-leaderboard, /screener). Social post bodies (the headline may be the post; the body is free). Legal, ToS, privacy.
Red is a signal, never a decoration: ▼ setbacks, PROPOSED outline, RATIFY, NOW, the share button’s “Copied” state. If red is on a page for any other reason, the page is wrong. There is no third colour.
Google Fonts, one tag: Archivo+Black · Archivo:wdth,wght@100..125,400..900 · Inter:wght@400..900. Display type is always uppercase and tight (negative tracking); label type is always uppercase and loose (positive tracking). Nothing in between. text-wrap:balance; hyphens:none on every headline.
The number in one sentence, dated, with the source underneath, unedited.
Body copy reads like a newspaper: left-aligned, short paragraphs, drop cap on the lede only.
The goal. #1 protocol by creator income. One receipt at a time.The Editors · Oct 2026
| Token | Value |
|---|---|
| Sheet max-width · padding | 1180px · 0 28px 60px (≤720: 0 16px 40px) |
| Card padding · gap · min-height | 20px 18px 16px · 12px · 170px |
| Card hed right-pad (SHARE) | 58px |
| Section head margin-top | 56px |
| Item padding / margin bottom | 16px / 16px |
| Column gap · column rule | 30px · 1px hair |
| Masthead padding | 18px 26px 24px |
| Chip · share padding | 4px 8px 3px · 3px 7px 2px |
| Radius | 0 — everything is square |
| Breakpoints | 1000 · 860 · 720 |
| Card grid | 3 → 2 (≤1000) → 1 (≤720) |
| Event | Spec |
|---|---|
| Mode change (paper ↔ future) | bg/color .6s ease |
| Accent change | .4s |
| Card reveal | .3s ease · translateY(18px) · view() entry 0–30% |
| Stamp flip · sweep · pulse | .32s · .9s · .7s×2 — cubic-bezier(.2,.8,.2,1) |
| Share “Copied” | 1600ms then revert |
| Reduced motion | no transitions, no animations, reveals forced visible |
Paper (default): cream, ink, theme-color #f7f4ee. Future (prophecy / dark): the section inverts to #0b0b0b with white .78 / .55 / .18 steps, a 1px-in-3px scanline overlay, and theme-color #0b0b0b. Anything written about the future carries a progress scalar --ft ∈ [0,1] (0 = next month, 1 = beyond) and its accent is hsl(calc(355 − 140·ft) 92% 56%): it starts at signal red and walks to blue as the prophecy gets further out. The reader can see how speculative a claim is. The card itself is never tinted.
Future mode, ft .9. Rooted in: BagsPay receipt → global. Fiction until it’s a receipt.
Print: white paper, black ink, 10.5pt body; share buttons and TOC hidden; section heads break the page; cards, boxes, quotes and rows avoid breaks; black surfaces keep print-color-adjust:exact; future mode collapses to black on white.
Every component below is rendered by the same CSS that ships on the broadsheet. Class names are the production names; keep them so the share script and the print rules keep working. Copy-pasteable HTML + CSS for each lives in DESIGN-KIT.md §3.
Card rules: hero numeral alone on its own line; headline ≤ 60 characters; caption = when to use it, never a restatement; prophecy captions open MON YYYY · prophecy. Rooted in: <roadmap item>. and close with the disclaimer. The SHARE button copies HEADLINE — https://bags.holdings/<slug>/#id.
Editorial
Jan 2026 ▲ Record
Oct 2026 Now
Aug 2025 ▼ Setback
Nov 2028 · Prophecy · Proposed
Era 0 (reconstructed)
Oct 23 Shipped
Your orders Post the chart. Tag the creator.
API methods — same system, method in the chip, path in mono
GET /trade/quote
POST /trade/swap
PUT /fee-share/:id
PATCH /launch/:mint Beta
DELETE /fee-share/:id Deprecated
GET solid ink (reads are safe) · POST outlined (writes) · PUT / PATCH paper-2 outlined · DELETE signal red (destructive). No green, blue or amber: the chip system has two inks and one signal. Beta / Deprecated reuse the PROPOSED outline.
News and press use the THE BAGS HOLDINGS wordmark; API docs use BAGS API with the small line Reference · Guides · Changelog. Ears carry volume/number/date on the left and a price or domain on the right; they hide below 860px.
Six numbers, tabular, with ▲▼ and basis. Illustrative values. For API docs the strip becomes the status strip: uptime 30d · p50 latency · rate limit · version · last deploy · status.
Outlined 1px, Inter 700 9px +.14em uppercase, 3px 7px 2px, square. Hover inverts; the copied state is signal red for 1.6s and reads COPIED. Copies HEADLINE — url#id. The script is ten lines and ships unchanged on every page:
(function(){
var base = location.origin + location.pathname;
function copy(text, btn){
var done = function(){ btn.classList.add('done'); var t = btn.textContent; btn.textContent = 'Copied'; setTimeout(function(){ btn.classList.remove('done'); btn.textContent = t; }, 1600); };
if (navigator.clipboard) navigator.clipboard.writeText(text).then(done, done); else { var ta = document.createElement('textarea'); ta.value = text; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); ta.remove(); done(); }
}
document.addEventListener('click', function(e){
var btn = e.target.closest('.sh'); if (!btn) return;
if (btn.id === 'copyall') { copy(document.getElementById('narrblock').textContent, btn); return; }
var host = btn.closest('[id]'); var id = btn.getAttribute('data-target') || (host && host.id);
var hed = btn.parentNode.cloneNode(true); hed.querySelectorAll('.sh').forEach(function(x){ x.remove(); });
copy(hed.textContent.trim().replace(/\s+/g,' ') + ' — ' + base + (id ? '#' + id : ''), btn);
});
})();
The goal. #1 protocol on Solana by creator income. One receipt at a time.The Editors · Oct 2026
Bags does Ship the receipt. @FinnBags does Post the chart, tag the creator.
Your orders Launch one coin for someone you believe in this week.
A pull-quote without a handle and a month is not a pull-quote. THE PLAY is marked PROPOSED until ratified; YOUR ORDERS is one verb the reader can do today.
| Label | Looks like | Means | Required when |
|---|---|---|---|
| Jan 2026 Record | Ink chip, timeline tag | Happened; dated; sourced. | Every past item on a timeline. |
| Now | Signal chip, dashed outline, red node | The current month / live state. | Exactly one per document with a timeline. |
| Prophecy | Neutral kicker + hue-shifted accent; dark section | Future; fiction until it’s a receipt. | Any claim about a date that hasn’t happened; disclaimer in the same unit. |
| Proposed | Signal outlined chip | Not in force until @FinnBags ratifies. | Every Play, doctrine, date commitment or policy not yet ratified. Removed only by a dated RATIFIED note. |
| Your orders | Black chip, dashed inner outline | The one thing the reader does next. | Every Play; optional on announcements; never on press releases or API reference. |
| (reconstructed) | Muted dotted flag | Inferred from references, not a primary record. | Any item without a primary source (document, trade, post). |
| ▲ / ▼ | Ink / signal glyph in the kicker | Went our way / taught us something. | Every Chronicle and news item. |
| Shipped | Ink chip | It is live, with the receipt link. | Every announcement kicker on ship day. |
| Beta Deprecated | Signal outlined chip | API surface not stable / leaving. | API reference, next to the method chip. |
Counts spaces. The og:title limit and the card’s two-line budget are the same number.
If there is an “and”, cut one side.
You, imperatives, present tense. The reader is in the sentence.
If a number is the point it goes first, alone, in .hero-num. One number per headline.
Short beats. Full stops as rhythm. “Launch. Trade. Claim.” reads; “Launch, trade and claim” doesn’t.
The kicker carries the date. The headline must still be true next year.
Extreme in ambition, exact in fact. The deck carries the facts and the source, unedited.
Where a Play exists, close with YOUR ORDERS — a verb the reader can do today.
PROPOSED / PROPHECY / (reconstructed) are part of the headline unit, never optional.
Anything after NOW carries “fiction until it’s a receipt” — in the caption, the section label, or the deck. No exceptions, including API roadmaps.
| # | Context | Bad | Good |
|---|---|---|---|
| 1 | API docs · overview | Introduction to the Bags Trade API | QUOTE. SWAP. SETTLE. ONE KEY. |
| 2 | API docs · guide | How to sell a token position using the swap endpoint | SELL ANYTHING IN TWO CALLS |
| 3 | API docs · reference | GET /fee-share/claimable — returns claimable fee positions | EVERY FEE YOU’RE OWED. ONE GET. |
| 4 | API changelog | v2.3.1 release notes (Oct 23, 2026) | SHIPPED: PRICE IMPACT ON EVERY QUOTE |
| 5 | Announcement | We’re excited to announce that Stocks on Bags is now available to all users | SHIPPED: STOCKS ON BAGS. FOR EVERYONE. |
| 6 | Announcement · number | Bags creators have now earned over $50 million in cumulative fees | $50M (hero) PAID TO THE PEOPLE COINS ARE ABOUT |
| 7 | Press release | Bags.fm Announces Expansion to Robinhood Chain in Q4 2026 | BAGS IS LIVE ON ROBINHOOD CHAIN |
| 8 | News · setback | August 2025 incident post-mortem and remediation update | THE SUMMER THAT TAUGHT US SHARE ▼ |
| 9 | News · record | Weekly volume reaches new all-time high of $412 million | $412M (hero) THE CURVE BENDS |
| 10 | Prophecy | Our 2028 vision for global payments | ANY COUNTRY. IN SOL. EVERY 15 MINUTES. · NOV 2028 · PROPHECY |
What changed in every pair: the date left for the kicker, the number became the hero, the verb became yours, the sentence became a poster. Patterns by document type are in the markdown twin, §5.2.
THE BAGS HOLDINGS is the paper’s name; BAGS is the publisher. The wordmark is the word BAGS set in Archivo Black, uppercase, tracked −.04em, converted to outlines so it renders without webfonts. The icon is the existing Bags money-bag mark, vectorised from /assets/icon-512.png — never redrawn. Together they are the lockup. Three colours exist: ink, paper, signal red (wordmark only).
Clear space x = the height of the B’s upper counter = 0.17 × cap height (≈ 0.12 × lockup height). Nothing enters it: no type, no rules, no edges.
| Measure | Value |
|---|---|
| Face | Archivo Black · uppercase · outlined |
| Tracking | −.04em (plus the face’s own B·A −17 / A·G −18 kern) |
| Icon height | cap height × 1.15 · bottom on the baseline |
| Icon aspect | 0.82 (w / h) · 241 × 294 px source |
| Gap icon → wordmark | cap height × 0.5 |
| Lockup aspect | 4.78 : 1 (558 × 117 units) · wordmark 4.0 : 1 |
| Stacked | icon = cap height × 2, centred, gap cap × 0.5 |
| Clear space | B counter height = 0.17 × cap height |
| Minimum width | lockup 96 px · wordmark 64 px · icon 16 px |
| Masthead use | 18 px tall, paper variant, top-left ear (.pub) |
/brand/wordmark/bags-wordmark.svg ink /brand/wordmark/bags-wordmark.png / @2x.png /brand/wordmark/bags-wordmark-paper.svg paper /brand/wordmark/bags-wordmark-paper@2x.png /brand/wordmark/bags-wordmark-red.svg signal /brand/wordmark/bags-lockup-h.svg ink /brand/wordmark/bags-lockup-h@2x.png /brand/wordmark/bags-lockup-h-paper.svg paper /brand/wordmark/bags-lockup-h-paper@2x.png /brand/wordmark/bags-lockup-v.svg ink /brand/wordmark/bags-lockup-v@2x.png /brand/wordmark/bags-lockup-v-paper.svg paper /brand/wordmark/bags-lockup-v-paper@2x.png /brand/wordmark/bags-icon.svg ink /brand/wordmark/bags-icon-512.png /brand/wordmark/bags-icon-paper.svg paper /brand/wordmark/bags-icon-tile.svg · bags-icon-tile-512.png (favicon tile) /brand/wordmark/wordmark.css inline-HTML fallback (.bags-wordmark / .bags-lockup) /brand/wordmark/spec.json the numbers above, machine-readable
API docs topbar: bags-lockup-h.svg on light, bags-lockup-h-paper.svg on dark, 20–24 px tall. All assets are also mirrored in the workspace at docs/brand/wordmark/.
| Tag | Pattern | Limit |
|---|---|---|
| <title> | HEADLINE — The Bags Holdings (news / announcements / press) · HEADLINE — Bags API (API docs) | ≤ 60 + suffix |
| og:title / twitter:title | HEADLINE exactly as on the card; write it in sentence case, the renderer uppercases | ≤ 60 |
| description · og:description | the deck, verbatim | ≤ 155 |
| og:type · og:site_name | article · bags.holdings (or Bags API) | — |
| og:url · canonical | https://bags.holdings/<slug>/ — trailing slash, no query | — |
| og:image | https://bags.holdings/<slug>/og.png — the poster card, 1200 × 630, from og-card.html | 1200 × 630 |
| twitter:card | summary_large_image | — |
| theme-color | #f7f4ee paper · #0b0b0b when the page opens in future mode or is an API doc in dark | — |
Full <head> snippet and the og:image renderer parameters are in the markdown twin, §6.
A link, a tx, a table, a date. If you can’t attach one, it’s PROPHECY and says so.
You, your coin, your fees. Never “users”.
One headline, one number, one verb.
The number leads; the sentence explains it.
Short. Beats. Full stops. Read it aloud before you ship it.
The chart is the deck; the headline is the culture — what it means for the person the coin is about.
The disclaimer rule: anything dated after NOW carries “fiction until it’s a receipt” in the same visual unit. Prophecy is a genre we publish on purpose; it is never dressed as a record.
public/brand/index.html this kit, rendered in the system https://bags.holdings/brand/ public/brand/DESIGN-KIT.md markdown twin https://bags.holdings/brand/DESIGN-KIT.md public/brand/og-card.html og:image renderer (query params, §6.1) public/brand/wordmark/ BAGS wordmark + lockup assets (§F) public/press-release-template/index.html the blank broadsheet; its footer links here public/state-of-the-union-2026-10/index.html the reference implementation (commit fffe295) ~/.openclaw/workspace/docs/brand/ workspace twin: BAGS-DESIGN-KIT.md · wordmark/
Versioning. v1.1 · Oct 24 2026 — adds the BAGS wordmark & lockup (§F) and the publisher mark in every masthead. v1.0 · Oct 23 2026 — derived from SOTU 2026-10 (fffe295). Token or component changes bump the minor; a new mode or a change to the headline doctrine bumps the major. Every published page prints its kit version in the DESIGN KIT footer block. Drafted by Bond for Finn; doctrine items marked PROPOSED until ratified.
Poster rules for every headline, <title>, og:title and og:image: ≤ 60 chars · one idea · direct address · number as hero · slogan cadence · no dates in the headline · PROPOSED / PROPHECY / (reconstructed) labelled · anything after NOW is fiction until it’s a receipt. Ink on paper, white on ink, red as a signal only. Archivo Black / Inter. Square. BAGS lockup top-left.
Typography: Archivo Black / Inter. Wordmark: Archivo Black, outlined. Icon: the Bags money bag, vectorised from icon-512.png.